From: Andrew Dolgov Date: Tue, 14 Aug 2012 14:59:10 +0000 (+0400) Subject: update dojo to 1.7.3 X-Git-Tag: 1.6.0~166 X-Git-Url: https://git.wh0rd.org/?a=commitdiff_plain;h=1354d17270961fff662d40f90521223f8fd0d73b;p=tt-rss.git update dojo to 1.7.3 --- diff --git a/js/prefs.js b/js/prefs.js index 2a2f359e..4ca3ec18 100644 --- a/js/prefs.js +++ b/js/prefs.js @@ -918,6 +918,31 @@ function init() { dojo.registerModulePath("lib", ".."); dojo.registerModulePath("fox", "../../js/"); + dojo.require("dijit.ColorPalette"); + dojo.require("dijit.Dialog"); + dojo.require("dijit.form.Button"); + dojo.require("dijit.form.CheckBox"); + dojo.require("dijit.form.DropDownButton"); + dojo.require("dijit.form.FilteringSelect"); + dojo.require("dijit.form.Form"); + dojo.require("dijit.form.RadioButton"); + dojo.require("dijit.form.Select"); + dojo.require("dijit.form.SimpleTextarea"); + dojo.require("dijit.form.TextBox"); + dojo.require("dijit.form.ValidationTextBox"); + dojo.require("dijit.InlineEditBox"); + dojo.require("dijit.layout.AccordionContainer"); + dojo.require("dijit.layout.BorderContainer"); + dojo.require("dijit.layout.ContentPane"); + dojo.require("dijit.layout.TabContainer"); + dojo.require("dijit.Menu"); + dojo.require("dijit.ProgressBar"); + dojo.require("dijit.ProgressBar"); + dojo.require("dijit.Toolbar"); + dojo.require("dijit.Tree"); + dojo.require("dijit.tree.dndSource"); + dojo.require("dojo.data.ItemFileWriteStore"); + dojo.require("lib.CheckBoxTree"); dojo.require("fox.PrefFeedTree"); dojo.require("fox.PrefFilterTree"); diff --git a/js/tt-rss.js b/js/tt-rss.js index 8a82e4c7..1c6f121c 100644 --- a/js/tt-rss.js +++ b/js/tt-rss.js @@ -286,6 +286,31 @@ function init() { themeBeforeLayout(); } + dojo.require("dijit.ColorPalette"); + dojo.require("dijit.Dialog"); + dojo.require("dijit.form.Button"); + dojo.require("dijit.form.CheckBox"); + dojo.require("dijit.form.DropDownButton"); + dojo.require("dijit.form.FilteringSelect"); + dojo.require("dijit.form.Form"); + dojo.require("dijit.form.RadioButton"); + dojo.require("dijit.form.Select"); + dojo.require("dijit.form.SimpleTextarea"); + dojo.require("dijit.form.TextBox"); + dojo.require("dijit.form.ValidationTextBox"); + dojo.require("dijit.InlineEditBox"); + dojo.require("dijit.layout.AccordionContainer"); + dojo.require("dijit.layout.BorderContainer"); + dojo.require("dijit.layout.ContentPane"); + dojo.require("dijit.layout.TabContainer"); + dojo.require("dijit.Menu"); + dojo.require("dijit.ProgressBar"); + dojo.require("dijit.ProgressBar"); + dojo.require("dijit.Toolbar"); + dojo.require("dijit.Tree"); + dojo.require("dijit.tree.dndSource"); + dojo.require("dojo.data.ItemFileWriteStore"); + dojo.parser.parse(); if (!genericSanityCheck()) diff --git a/lib/dijit/BackgroundIframe.js b/lib/dijit/BackgroundIframe.js new file mode 100644 index 00000000..4823973a --- /dev/null +++ b/lib/dijit/BackgroundIframe.js @@ -0,0 +1,2 @@ +//>>built +define("dijit/BackgroundIframe",["require",".","dojo/_base/config","dojo/dom-construct","dojo/dom-style","dojo/_base/lang","dojo/on","dojo/_base/sniff","dojo/_base/window"],function(_1,_2,_3,_4,_5,_6,on,_7,_8){var _9=new function(){var _a=[];this.pop=function(){var _b;if(_a.length){_b=_a.pop();_b.style.display="";}else{if(_7("ie")<9){var _c=_3["dojoBlankHtmlUrl"]||_1.toUrl("dojo/resources/blank.html")||"javascript:\"\"";var _d="'); - } - }; - - back.setInitialState = function(/*Object*/args){ - //summary: - // Sets the state object and back callback for the very first page - // that is loaded. - //description: - // It is recommended that you call this method as part of an event - // listener that is registered via dojo.addOnLoad(). - //args: Object - // See the addToHistory() function for the list of valid args properties. - initialState = createState(initialHref, args, initialHash); - }; - - //FIXME: Make these doc comments not be awful. At least they're not wrong. - //FIXME: Would like to support arbitrary back/forward jumps. Have to rework iframeLoaded among other things. - //FIXME: is there a slight race condition in moz using change URL with the timer check and when - // the hash gets set? I think I have seen a back/forward call in quick succession, but not consistent. - - - /*===== - dojo.__backArgs = function(kwArgs){ - // back: Function? - // A function to be called when this state is reached via the user - // clicking the back button. - // forward: Function? - // Upon return to this state from the "back, forward" combination - // of navigation steps, this function will be called. Somewhat - // analgous to the semantic of an "onRedo" event handler. - // changeUrl: Boolean?|String? - // Boolean indicating whether or not to create a unique hash for - // this state. If a string is passed instead, it is used as the - // hash. - } - =====*/ - - back.addToHistory = function(/*dojo.__backArgs*/ args){ - // summary: - // adds a state object (args) to the history list. - // description: - // To support getting back button notifications, the object - // argument should implement a function called either "back", - // "backButton", or "handle". The string "back" will be passed as - // the first and only argument to this callback. - // - // To support getting forward button notifications, the object - // argument should implement a function called either "forward", - // "forwardButton", or "handle". The string "forward" will be - // passed as the first and only argument to this callback. - // - // If you want the browser location string to change, define "changeUrl" on the object. If the - // value of "changeUrl" is true, then a unique number will be appended to the URL as a fragment - // identifier (http://some.domain.com/path#uniquenumber). If it is any other value that does - // not evaluate to false, that value will be used as the fragment identifier. For example, - // if changeUrl: 'page1', then the URL will look like: http://some.domain.com/path#page1 - // - // There are problems with using dojo.back with semantically-named fragment identifiers - // ("hash values" on an URL). In most browsers it will be hard for dojo.back to know - // distinguish a back from a forward event in those cases. For back/forward support to - // work best, the fragment ID should always be a unique value (something using new Date().getTime() - // for example). If you want to detect hash changes using semantic fragment IDs, then - // consider using dojo.hash instead (in Dojo 1.4+). - // - // example: - // | dojo.back.addToHistory({ - // | back: function(){ console.log('back pressed'); }, - // | forward: function(){ console.log('forward pressed'); }, - // | changeUrl: true - // | }); - - // BROWSER NOTES: - // Safari 1.2: - // back button "works" fine, however it's not possible to actually - // DETECT that you've moved backwards by inspecting window.location. - // Unless there is some other means of locating. - // FIXME: perhaps we can poll on history.length? - // Safari 2.0.3+ (and probably 1.3.2+): - // works fine, except when changeUrl is used. When changeUrl is used, - // Safari jumps all the way back to whatever page was shown before - // the page that uses dojo.undo.browser support. - // IE 5.5 SP2: - // back button behavior is macro. It does not move back to the - // previous hash value, but to the last full page load. This suggests - // that the iframe is the correct way to capture the back button in - // these cases. - // Don't test this page using local disk for MSIE. MSIE will not create - // a history list for iframe_history.html if served from a file: URL. - // The XML served back from the XHR tests will also not be properly - // created if served from local disk. Serve the test pages from a web - // server to test in that browser. - // IE 6.0: - // same behavior as IE 5.5 SP2 - // Firefox 1.0+: - // the back button will return us to the previous hash on the same - // page, thereby not requiring an iframe hack, although we do then - // need to run a timer to detect inter-page movement. - - //If addToHistory is called, then that means we prune the - //forward stack -- the user went back, then wanted to - //start a new forward path. - forwardStack = []; - - var hash = null; - var url = null; - if(!historyIframe){ - if(dojo.config["useXDomain"] && !dojo.config["dojoIframeHistoryUrl"]){ - console.warn("dojo.back: When using cross-domain Dojo builds," - + " please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl" - + " to the path on your domain to iframe_history.html"); - } - historyIframe = window.frames["dj_history"]; - } - if(!bookmarkAnchor){ - bookmarkAnchor = dojo.create("a", {style: {display: "none"}}, dojo.body()); - } - if(args["changeUrl"]){ - hash = ""+ ((args["changeUrl"]!==true) ? args["changeUrl"] : (new Date()).getTime()); - - //If the current hash matches the new one, just replace the history object with - //this new one. It doesn't make sense to track different state objects for the same - //logical URL. This matches the browser behavior of only putting in one history - //item no matter how many times you click on the same #hash link, at least in Firefox - //and Safari, and there is no reliable way in those browsers to know if a #hash link - //has been clicked on multiple times. So making this the standard behavior in all browsers - //so that dojo.back's behavior is the same in all browsers. - if(historyStack.length == 0 && initialState.urlHash == hash){ - initialState = createState(url, args, hash); - return; - }else if(historyStack.length > 0 && historyStack[historyStack.length - 1].urlHash == hash){ - historyStack[historyStack.length - 1] = createState(url, args, hash); - return; - } - - changingUrl = true; - setTimeout(function() { - setHash(hash); - changingUrl = false; - }, 1); - bookmarkAnchor.href = hash; - - if(dojo.isIE){ - url = loadIframeHistory(); - - var oldCB = args["back"]||args["backButton"]||args["handle"]; - - //The function takes handleName as a parameter, in case the - //callback we are overriding was "handle". In that case, - //we will need to pass the handle name to handle. - var tcb = function(handleName){ - if(getHash() != ""){ - setTimeout(function() { setHash(hash); }, 1); - } - //Use apply to set "this" to args, and to try to avoid memory leaks. - oldCB.apply(this, [handleName]); - }; - - //Set interceptor function in the right place. - if(args["back"]){ - args.back = tcb; - }else if(args["backButton"]){ - args.backButton = tcb; - }else if(args["handle"]){ - args.handle = tcb; - } - - var oldFW = args["forward"]||args["forwardButton"]||args["handle"]; - - //The function takes handleName as a parameter, in case the - //callback we are overriding was "handle". In that case, - //we will need to pass the handle name to handle. - var tfw = function(handleName){ - if(getHash() != ""){ - setHash(hash); - } - if(oldFW){ // we might not actually have one - //Use apply to set "this" to args, and to try to avoid memory leaks. - oldFW.apply(this, [handleName]); - } - }; - - //Set interceptor function in the right place. - if(args["forward"]){ - args.forward = tfw; - }else if(args["forwardButton"]){ - args.forwardButton = tfw; - }else if(args["handle"]){ - args.handle = tfw; - } - - }else if(!dojo.isIE){ - // start the timer - if(!locationTimer){ - locationTimer = setInterval(checkLocation, 200); - } - - } - }else{ - url = loadIframeHistory(); - } - - historyStack.push(createState(url, args, hash)); - }; - - back._iframeLoaded = function(evt, ifrLoc){ - //summary: - // private method. Do not call this directly. - var query = getUrlQuery(ifrLoc.href); - if(query == null){ - // alert("iframeLoaded"); - // we hit the end of the history, so we should go back - if(historyStack.length == 1){ - handleBackButton(); - } - return; - } - if(moveForward){ - // we were expecting it, so it's not either a forward or backward movement - moveForward = false; - return; - } - - //Check the back stack first, since it is more likely. - //Note that only one step back or forward is supported. - if(historyStack.length >= 2 && query == getUrlQuery(historyStack[historyStack.length-2].url)){ - handleBackButton(); - }else if(forwardStack.length > 0 && query == getUrlQuery(forwardStack[forwardStack.length-1].url)){ - handleForwardButton(); - } - }; - })(); - -} +//>>built +define("dojo/back",["./_base/kernel","./_base/lang","./_base/sniff","./dom","./dom-construct","./_base/window","require"],function(_1,_2,_3,_4,_5,_6,_7){_2.getObject("back",true,_1);var _8=_1.back,_9=_8.getHash=function(){var h=window.location.hash;if(h.charAt(0)=="#"){h=h.substring(1);}return _3("mozilla")?h:decodeURIComponent(h);},_a=_8.setHash=function(h){if(!h){h="";}window.location.hash=encodeURIComponent(h);_b=history.length;};var _c=(typeof (window)!=="undefined")?window.location.href:"";var _d=(typeof (window)!=="undefined")?_9():"";var _e=null;var _f=null;var _10=null;var _11=null;var _12=[];var _13=[];var _14=false;var _15=false;var _b;function _16(){var _17=_13.pop();if(!_17){return;}var _18=_13[_13.length-1];if(!_18&&_13.length==0){_18=_e;}if(_18){if(_18.kwArgs["back"]){_18.kwArgs["back"]();}else{if(_18.kwArgs["backButton"]){_18.kwArgs["backButton"]();}else{if(_18.kwArgs["handle"]){_18.kwArgs.handle("back");}}}}_12.push(_17);};_8.goBack=_16;function _19(){var _1a=_12.pop();if(!_1a){return;}if(_1a.kwArgs["forward"]){_1a.kwArgs.forward();}else{if(_1a.kwArgs["forwardButton"]){_1a.kwArgs.forwardButton();}else{if(_1a.kwArgs["handle"]){_1a.kwArgs.handle("forward");}}}_13.push(_1a);};_8.goForward=_19;function _1b(url,_1c,_1d){return {"url":url,"kwArgs":_1c,"urlHash":_1d};};function _1e(url){var _1f=url.split("?");if(_1f.length<2){return null;}else{return _1f[1];}};function _20(){var url=(_1.config["dojoIframeHistoryUrl"]||_7.toUrl("./resources/iframe_history.html"))+"?"+(new Date()).getTime();_14=true;if(_11){_3("webkit")?_11.location=url:window.frames[_11.name].location=url;}else{}return url;};function _21(){if(!_15){var hsl=_13.length;var _22=_9();if((_22===_d||window.location.href==_c)&&(hsl==1)){_16();return;}if(_12.length>0){if(_12[_12.length-1].urlHash===_22){_19();return;}}if((hsl>=2)&&(_13[hsl-2])){if(_13[hsl-2].urlHash===_22){_16();}}}};_8.init=function(){if(_4.byId("dj_history")){return;}var src=_1.config["dojoIframeHistoryUrl"]||_7.toUrl("./resources/iframe_history.html");if(_1._postLoad){console.error("dojo.back.init() must be called before the DOM has loaded. "+"If using xdomain loading or djConfig.debugAtAllCosts, include dojo.back "+"in a build layer.");}else{document.write("");}};_8.setInitialState=function(_23){_e=_1b(_c,_23,_d);};_8.addToHistory=function(_24){_12=[];var _25=null;var url=null;if(!_11){if(_1.config["useXDomain"]&&!_1.config["dojoIframeHistoryUrl"]){console.warn("dojo.back: When using cross-domain Dojo builds,"+" please save iframe_history.html to your domain and set djConfig.dojoIframeHistoryUrl"+" to the path on your domain to iframe_history.html");}_11=window.frames["dj_history"];}if(!_10){_10=_5.create("a",{style:{display:"none"}},_6.body());}if(_24["changeUrl"]){_25=""+((_24["changeUrl"]!==true)?_24["changeUrl"]:(new Date()).getTime());if(_13.length==0&&_e.urlHash==_25){_e=_1b(url,_24,_25);return;}else{if(_13.length>0&&_13[_13.length-1].urlHash==_25){_13[_13.length-1]=_1b(url,_24,_25);return;}}_15=true;setTimeout(function(){_a(_25);_15=false;},1);_10.href=_25;if(_3("ie")){url=_20();var _26=_24["back"]||_24["backButton"]||_24["handle"];var tcb=function(_27){if(_9()!=""){setTimeout(function(){_a(_25);},1);}_26.apply(this,[_27]);};if(_24["back"]){_24.back=tcb;}else{if(_24["backButton"]){_24.backButton=tcb;}else{if(_24["handle"]){_24.handle=tcb;}}}var _28=_24["forward"]||_24["forwardButton"]||_24["handle"];var tfw=function(_29){if(_9()!=""){_a(_25);}if(_28){_28.apply(this,[_29]);}};if(_24["forward"]){_24.forward=tfw;}else{if(_24["forwardButton"]){_24.forwardButton=tfw;}else{if(_24["handle"]){_24.handle=tfw;}}}}else{if(!_3("ie")){if(!_f){_f=setInterval(_21,200);}}}}else{url=_20();}_13.push(_1b(url,_24,_25));};_8._iframeLoaded=function(evt,_2a){var _2b=_1e(_2a.href);if(_2b==null){if(_13.length==1){_16();}return;}if(_14){_14=false;return;}if(_13.length>=2&&_2b==_1e(_13[_13.length-2].url)){_16();}else{if(_12.length>0&&_2b==_1e(_12[_12.length-1].url)){_19();}}};return _1.back;}); \ No newline at end of file diff --git a/lib/dojo/back.js.uncompressed.js b/lib/dojo/back.js.uncompressed.js new file mode 100644 index 00000000..4be031c1 --- /dev/null +++ b/lib/dojo/back.js.uncompressed.js @@ -0,0 +1,397 @@ +define("dojo/back", ["./_base/kernel", "./_base/lang", "./_base/sniff", "./dom", "./dom-construct", "./_base/window", "require"], function(dojo, lang, sniff, dom, domConstruct, baseWindow, require) { + // module: + // dojo/back + // summary: + // TODOC + + lang.getObject("back", true, dojo); + +/*===== +dojo.back = { + // summary: Browser history management resources +}; +=====*/ + + var back = dojo.back, + + // everyone deals with encoding the hash slightly differently + + getHash = back.getHash = function(){ + var h = window.location.hash; + if(h.charAt(0) == "#"){ h = h.substring(1); } + return sniff("mozilla") ? h : decodeURIComponent(h); + }, + + setHash = back.setHash = function(h){ + if(!h){ h = ""; } + window.location.hash = encodeURIComponent(h); + historyCounter = history.length; + }; + + var initialHref = (typeof(window) !== "undefined") ? window.location.href : ""; + var initialHash = (typeof(window) !== "undefined") ? getHash() : ""; + var initialState = null; + + var locationTimer = null; + var bookmarkAnchor = null; + var historyIframe = null; + var forwardStack = []; + var historyStack = []; + var moveForward = false; + var changingUrl = false; + var historyCounter; + + function handleBackButton(){ + //summary: private method. Do not call this directly. + + //The "current" page is always at the top of the history stack. + var current = historyStack.pop(); + if(!current){ return; } + var last = historyStack[historyStack.length-1]; + if(!last && historyStack.length == 0){ + last = initialState; + } + if(last){ + if(last.kwArgs["back"]){ + last.kwArgs["back"](); + }else if(last.kwArgs["backButton"]){ + last.kwArgs["backButton"](); + }else if(last.kwArgs["handle"]){ + last.kwArgs.handle("back"); + } + } + forwardStack.push(current); + } + + back.goBack = handleBackButton; + + function handleForwardButton(){ + //summary: private method. Do not call this directly. + var last = forwardStack.pop(); + if(!last){ return; } + if(last.kwArgs["forward"]){ + last.kwArgs.forward(); + }else if(last.kwArgs["forwardButton"]){ + last.kwArgs.forwardButton(); + }else if(last.kwArgs["handle"]){ + last.kwArgs.handle("forward"); + } + historyStack.push(last); + } + + back.goForward = handleForwardButton; + + function createState(url, args, hash){ + //summary: private method. Do not call this directly. + return {"url": url, "kwArgs": args, "urlHash": hash}; //Object + } + + function getUrlQuery(url){ + //summary: private method. Do not call this directly. + var segments = url.split("?"); + if(segments.length < 2){ + return null; //null + } + else{ + return segments[1]; //String + } + } + + function loadIframeHistory(){ + //summary: private method. Do not call this directly. + var url = (dojo.config["dojoIframeHistoryUrl"] || require.toUrl("./resources/iframe_history.html")) + "?" + (new Date()).getTime(); + moveForward = true; + if(historyIframe){ + sniff("webkit") ? historyIframe.location = url : window.frames[historyIframe.name].location = url; + }else{ + //console.warn("dojo.back: Not initialised. You need to call dojo.back.init() from a - // | - d._modulePrefixes[module] = { name: module, value: prefix }; - }; - - dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale, /*String?*/availableFlatLocales){ - // summary: - // Declares translated resources and loads them if necessary, in the - // same style as dojo.require. Contents of the resource bundle are - // typically strings, but may be any name/value pair, represented in - // JSON format. See also `dojo.i18n.getLocalization`. - // - // description: - // Load translated resource bundles provided underneath the "nls" - // directory within a package. Translated resources may be located in - // different packages throughout the source tree. - // - // Each directory is named for a locale as specified by RFC 3066, - // (http://www.ietf.org/rfc/rfc3066.txt), normalized in lowercase. - // Note that the two bundles in the example do not define all the - // same variants. For a given locale, bundles will be loaded for - // that locale and all more general locales above it, including a - // fallback at the root directory. For example, a declaration for - // the "de-at" locale will first load `nls/de-at/bundleone.js`, - // then `nls/de/bundleone.js` and finally `nls/bundleone.js`. The - // data will be flattened into a single Object so that lookups - // will follow this cascading pattern. An optional build step can - // preload the bundles to avoid data redundancy and the multiple - // network hits normally required to load these resources. - // - // moduleName: - // name of the package containing the "nls" directory in which the - // bundle is found - // - // bundleName: - // bundle name, i.e. the filename without the '.js' suffix. Using "nls" as a - // a bundle name is not supported, since "nls" is the name of the folder - // that holds bundles. Using "nls" as the bundle name will cause problems - // with the custom build. - // - // locale: - // the locale to load (optional) By default, the browser's user - // locale as defined by dojo.locale - // - // availableFlatLocales: - // A comma-separated list of the available, flattened locales for this - // bundle. This argument should only be set by the build process. - // - // example: - // A particular widget may define one or more resource bundles, - // structured in a program as follows, where moduleName is - // mycode.mywidget and bundleNames available include bundleone and - // bundletwo: - // | ... - // | mycode/ - // | mywidget/ - // | nls/ - // | bundleone.js (the fallback translation, English in this example) - // | bundletwo.js (also a fallback translation) - // | de/ - // | bundleone.js - // | bundletwo.js - // | de-at/ - // | bundleone.js - // | en/ - // | (empty; use the fallback translation) - // | en-us/ - // | bundleone.js - // | en-gb/ - // | bundleone.js - // | es/ - // | bundleone.js - // | bundletwo.js - // | ...etc - // | ... - // - - d.require("dojo.i18n"); - d.i18n._requireLocalization.apply(d.hostenv, arguments); - }; - - - var ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"), - ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"); - - dojo._Url = function(/*dojo._Url|String...*/){ - // summary: - // Constructor to create an object representing a URL. - // It is marked as private, since we might consider removing - // or simplifying it. - // description: - // Each argument is evaluated in order relative to the next until - // a canonical uri is produced. To get an absolute Uri relative to - // the current document use: - // new dojo._Url(document.baseURI, url) - - var n = null, - _a = arguments, - uri = [_a[0]]; - // resolve uri components relative to each other - for(var i = 1; i<_a.length; i++){ - if(!_a[i]){ continue; } - - // Safari doesn't support this.constructor so we have to be explicit - // FIXME: Tracked (and fixed) in Webkit bug 3537. - // http://bugs.webkit.org/show_bug.cgi?id=3537 - var relobj = new d._Url(_a[i]+""), - uriobj = new d._Url(uri[0]+""); - - if( - relobj.path == "" && - !relobj.scheme && - !relobj.authority && - !relobj.query - ){ - if(relobj.fragment != n){ - uriobj.fragment = relobj.fragment; - } - relobj = uriobj; - }else if(!relobj.scheme){ - relobj.scheme = uriobj.scheme; - - if(!relobj.authority){ - relobj.authority = uriobj.authority; - - if(relobj.path.charAt(0) != "/"){ - var path = uriobj.path.substring(0, - uriobj.path.lastIndexOf("/") + 1) + relobj.path; - - var segs = path.split("/"); - for(var j = 0; j < segs.length; j++){ - if(segs[j] == "."){ - // flatten "./" references - if(j == segs.length - 1){ - segs[j] = ""; - }else{ - segs.splice(j, 1); - j--; - } - }else if(j > 0 && !(j == 1 && segs[0] == "") && - segs[j] == ".." && segs[j-1] != ".."){ - // flatten "../" references - if(j == (segs.length - 1)){ - segs.splice(j, 1); - segs[j - 1] = ""; - }else{ - segs.splice(j - 1, 2); - j -= 2; - } - } - } - relobj.path = segs.join("/"); + // search aliases + var candidateLength = 0, + candidate = 0; + forEach(aliases, function(pair){ + var match = mid.match(pair[0]); + if(match && match.length>candidateLength){ + candidate = isFunction(pair[1]) ? mid.replace(pair[0], pair[1]) : pair[1]; } + }); + if(candidate){ + return getModuleInfo_(candidate, 0, packs, modules, baseUrl, packageMapProg, pathsMapProg, alwaysCreate); } - } - uri = []; - if(relobj.scheme){ - uri.push(relobj.scheme, ":"); - } - if(relobj.authority){ - uri.push("//", relobj.authority); + result = modules[mid]; + if(result){ + return alwaysCreate ? makeModuleInfo(result.pid, result.mid, result.pack, result.url, cacheId) : modules[mid]; + } } - uri.push(relobj.path); - if(relobj.query){ - uri.push("?", relobj.query); + // get here iff the sought-after module does not yet exist; therefore, we need to compute the URL given the + // fully resolved (i.e., all relative indicators and package mapping resolved) module id + + mapItem = runMapProg(mid, pathsMapProg); + if(mapItem){ + url = mapItem[1] + mid.substring(mapItem[3] - 1); + }else if(pid){ + url = pack.location + "/" + midInPackage; + }else if(has("config-tlmSiblingOfDojo")){ + url = "../" + mid; + }else{ + url = mid; } - if(relobj.fragment){ - uri.push("#", relobj.fragment); + // if result is not absolute, add baseUrl + if(!(/(^\/)|(\:)/.test(url))){ + url = baseUrl + url; } - } - - this.uri = uri.join(""); - - // break the uri into its main components - var r = this.uri.match(ore); + url += ".js"; + return makeModuleInfo(pid, mid, pack, compactPath(url), cacheId); + }, - this.scheme = r[2] || (r[1] ? "" : n); - this.authority = r[4] || (r[3] ? "" : n); - this.path = r[5]; // can never be undefined - this.query = r[7] || (r[6] ? "" : n); - this.fragment = r[9] || (r[8] ? "" : n); + getModuleInfo = function(mid, referenceModule){ + return getModuleInfo_(mid, referenceModule, packs, modules, req.baseUrl, packageMapProg, pathsMapProg); + }, - if(this.authority != n){ - // server based naming authority - r = this.authority.match(ire); + resolvePluginResourceId = function(plugin, prid, referenceModule){ + return plugin.normalize ? plugin.normalize(prid, function(mid){return toAbsMid(mid, referenceModule);}) : toAbsMid(prid, referenceModule); + }, - this.user = r[3] || n; - this.password = r[4] || n; - this.host = r[6] || r[7]; // ipv6 || ipv4 - this.port = r[9] || n; - } - } + dynamicPluginUidGenerator = 0, + + getModule = function(mid, referenceModule, immediate){ + // compute and optionally construct (if necessary) the module implied by the mid with respect to referenceModule + var match, plugin, prid, result; + match = mid.match(/^(.+?)\!(.*)$/); + if(match){ + // name was ! + plugin = getModule(match[1], referenceModule, immediate); + + if(1 && legacyMode == sync && !plugin.executed){ + injectModule(plugin); + if(plugin.injected===arrived && !plugin.executed){ + checkCompleteGuard++; + execModule(plugin); + checkIdle(); + } + if(plugin.executed){ + promoteModuleToPlugin(plugin); + }else{ + // we are in xdomain mode for some reason + execQ.unshift(plugin); + } + } - dojo._Url.prototype.toString = function(){ return this.uri; }; - dojo.moduleUrl = function(/*String*/module, /*dojo._Url||String*/url){ - // summary: - // Returns a `dojo._Url` object relative to a module. - // example: - // | var pngPath = dojo.moduleUrl("acme","images/small.png"); - // | console.dir(pngPath); // list the object properties - // | // create an image and set it's source to pngPath's value: - // | var img = document.createElement("img"); - // | // NOTE: we assign the string representation of the url object - // | img.src = pngPath.toString(); - // | // add our image to the document - // | dojo.body().appendChild(img); - // example: - // you may de-reference as far as you like down the package - // hierarchy. This is sometimes handy to avoid lenghty relative - // urls or for building portable sub-packages. In this example, - // the `acme.widget` and `acme.util` directories may be located - // under different roots (see `dojo.registerModulePath`) but the - // the modules which reference them can be unaware of their - // relative locations on the filesystem: - // | // somewhere in a configuration block - // | dojo.registerModulePath("acme.widget", "../../acme/widget"); - // | dojo.registerModulePath("acme.util", "../../util"); - // | - // | // ... - // | - // | // code in a module using acme resources - // | var tmpltPath = dojo.moduleUrl("acme.widget","templates/template.html"); - // | var dataPath = dojo.moduleUrl("acme.util","resources/data.json"); - var loc = d._getModuleSymbols(module).join('/'); - if(!loc){ return null; } - if(loc.lastIndexOf("/") != loc.length-1){ - loc += "/"; - } - - //If the path is an absolute path (starts with a / or is on another - //domain/xdomain) then don't add the baseUrl. - var colonIndex = loc.indexOf(":"); - if(loc.charAt(0) != "/" && (colonIndex == -1 || colonIndex > loc.indexOf("/"))){ - loc = d.baseUrl + loc; - } + if(plugin.executed === executed && !plugin.load){ + // executed the module not knowing it was a plugin + promoteModuleToPlugin(plugin); + } - return new d._Url(loc, url); // dojo._Url - }; + // if the plugin has not been loaded, then can't resolve the prid and must assume this plugin is dynamic until we find out otherwise + if(plugin.load){ + prid = resolvePluginResourceId(plugin, match[2], referenceModule); + mid = (plugin.mid + "!" + (plugin.dynamic ? ++dynamicPluginUidGenerator + "!" : "") + prid); + }else{ + prid = match[2]; + mid = plugin.mid + "!" + (++dynamicPluginUidGenerator) + "!waitingForPlugin"; + } + result = {plugin:plugin, mid:mid, req:createRequire(referenceModule), prid:prid}; + }else{ + result = getModuleInfo(mid, referenceModule); + } + return modules[result.mid] || (!immediate && (modules[result.mid] = result)); + }, + toAbsMid = req.toAbsMid = function(mid, referenceModule){ + return getModuleInfo(mid, referenceModule).mid; + }, + toUrl = req.toUrl = function(name, referenceModule){ + var moduleInfo = getModuleInfo(name+"/x", referenceModule), + url = moduleInfo.url; + return fixupUrl(moduleInfo.pid===0 ? + // if pid===0, then name had a protocol or absolute path; either way, toUrl is the identify function in such cases + name : + // "/x.js" since getModuleInfo automatically appends ".js" and we appended "/x" to make name look likde a module id + url.substring(0, url.length-5) + ); + }, -})(); + nonModuleProps = { + injected: arrived, + executed: executed, + def: nonmodule, + result: nonmodule + }, -/*===== -dojo.isBrowser = { - // example: - // | if(dojo.isBrowser){ ... } -}; + makeCjs = function(mid){ + return modules[mid] = mix({mid:mid}, nonModuleProps); + }, -dojo.isFF = { - // example: - // | if(dojo.isFF > 1){ ... } -}; + cjsRequireModule = makeCjs("require"), + cjsExportsModule = makeCjs("exports"), + cjsModuleModule = makeCjs("module"), -dojo.isIE = { - // example: - // | if(dojo.isIE > 6){ - // | // we are IE7 - // | } -}; + runFactory = function(module, args){ + req.trace("loader-run-factory", [module.mid]); + var factory = module.def, + result; + 1 && syncExecStack.unshift(module); + if(has("config-dojo-loader-catches")){ + try{ + result= isFunction(factory) ? factory.apply(null, args) : factory; + }catch(e){ + signal(error, module.result = makeError("factoryThrew", [module, e])); + } + }else{ + result= isFunction(factory) ? factory.apply(null, args) : factory; + } + module.result = result===undefined && module.cjs ? module.cjs.exports : result; + 1 && syncExecStack.shift(module); + }, -dojo.isSafari = { - // example: - // | if(dojo.isSafari){ ... } - // example: - // Detect iPhone: - // | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){ - // | // we are iPhone. Note, iPod touch reports "iPod" above and fails this test. - // | } -}; + abortExec = {}, -dojo = { - // isBrowser: Boolean - // True if the client is a web-browser - isBrowser: true, - // isFF: Number | undefined - // Version as a Number if client is FireFox. undefined otherwise. Corresponds to - // major detected FireFox version (1.5, 2, 3, etc.) - isFF: 2, - // isIE: Number | undefined - // Version as a Number if client is MSIE(PC). undefined otherwise. Corresponds to - // major detected IE version (6, 7, 8, etc.) - isIE: 6, - // isKhtml: Number | undefined - // Version as a Number if client is a KHTML browser. undefined otherwise. Corresponds to major - // detected version. - isKhtml: 0, - // isWebKit: Number | undefined - // Version as a Number if client is a WebKit-derived browser (Konqueror, - // Safari, Chrome, etc.). undefined otherwise. - isWebKit: 0, - // isMozilla: Number | undefined - // Version as a Number if client is a Mozilla-based browser (Firefox, - // SeaMonkey). undefined otherwise. Corresponds to major detected version. - isMozilla: 0, - // isOpera: Number | undefined - // Version as a Number if client is Opera. undefined otherwise. Corresponds to - // major detected version. - isOpera: 0, - // isSafari: Number | undefined - // Version as a Number if client is Safari or iPhone. undefined otherwise. - isSafari: 0, - // isChrome: Number | undefined - // Version as a Number if client is Chrome browser. undefined otherwise. - isChrome: 0 - // isMac: Boolean - // True if the client runs on Mac -} -=====*/ -if(typeof window != 'undefined'){ - dojo.isBrowser = true; - dojo._name = "browser"; + defOrder = 0, + promoteModuleToPlugin = function(pluginModule){ + var plugin = pluginModule.result; + pluginModule.dynamic = plugin.dynamic; + pluginModule.normalize = plugin.normalize; + pluginModule.load = plugin.load; + return pluginModule; + }, - // attempt to figure out the path to dojo if it isn't set in the config - (function(){ - var d = dojo; - - // this is a scope protection closure. We set browser versions and grab - // the URL we were loaded from here. - - // grab the node we were loaded from - if(document && document.getElementsByTagName){ - var scripts = document.getElementsByTagName("script"); - var rePkg = /dojo(\.xd)?\.js(\W|$)/i; - for(var i = 0; i < scripts.length; i++){ - var src = scripts[i].getAttribute("src"); - if(!src){ continue; } - var m = src.match(rePkg); - if(m){ - // find out where we came from - if(!d.config.baseUrl){ - d.config.baseUrl = src.substring(0, m.index); - } - // and find out if we need to modify our behavior - var cfg = (scripts[i].getAttribute("djConfig") || scripts[i].getAttribute("data-dojo-config")); - if(cfg){ - var cfgo = eval("({ "+cfg+" })"); - for(var x in cfgo){ - dojo.config[x] = cfgo[x]; - } + resolvePluginLoadQ = function(plugin){ + // plugins is a newly executed module that has a loadQ waiting to run + + // step 1: traverse the loadQ and fixup the mid and prid; remember the map from original mid to new mid + // recall the original mid was created before the plugin was on board and therefore it was impossible to + // compute the final mid; accordingly, prid may or may not change, but the mid will definitely change + var map = {}; + forEach(plugin.loadQ, function(pseudoPluginResource){ + // manufacture and insert the real module in modules + var pseudoMid = pseudoPluginResource.mid, + prid = resolvePluginResourceId(plugin, pseudoPluginResource.prid, pseudoPluginResource.req.module), + mid = plugin.dynamic ? pseudoPluginResource.mid.replace(/waitingForPlugin$/, prid) : (plugin.mid + "!" + prid), + pluginResource = mix(mix({}, pseudoPluginResource), {mid:mid, prid:prid, injected:0}); + if(!modules[mid]){ + // create a new (the real) plugin resource and inject it normally now that the plugin is on board + injectPlugin(modules[mid] = pluginResource); + } // else this was a duplicate request for the same (plugin, rid) for a nondynamic plugin + + // pluginResource is really just a placeholder with the wrong mid (because we couldn't calculate it until the plugin was on board) + // mark is as arrived and delete it from modules; the real module was requested above + map[pseudoPluginResource.mid] = modules[mid]; + setArrived(pseudoPluginResource); + delete modules[pseudoPluginResource.mid]; + }); + plugin.loadQ = 0; + + // step2: replace all references to any placeholder modules with real modules + var substituteModules = function(module){ + for(var replacement, deps = module.deps || [], i = 0; i= 0){ d.isOpera = tv; } - if(dua.indexOf("AdobeAIR") >= 0){ d.isAIR = 1; } - d.isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : 0; - d.isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined; - d.isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined; - d.isMac = dav.indexOf("Macintosh") >= 0; + forEach(execQ, substituteModules); + }, - // safari detection derived from: - // http://developer.apple.com/internet/safari/faq.html#anchor2 - // http://developer.apple.com/internet/safari/uamatrix.html - var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0); - if(index && !dojo.isChrome){ - // try to grab the explicit Safari version first. If we don't get - // one, look for less than 419.3 as the indication that we're on something - // "Safari 2-ish". - d.isSafari = parseFloat(dav.split("Version/")[1]); - if(!d.isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){ - d.isSafari = 2; + finishExec = function(module){ + req.trace("loader-finish-exec", [module.mid]); + module.executed = executed; + module.defOrder = defOrder++; + 1 && forEach(module.provides, function(cb){ cb(); }); + if(module.loadQ){ + // the module was a plugin + promoteModuleToPlugin(module); + resolvePluginLoadQ(module); + } + // remove all occurences of this module from the execQ + for(i = 0; i < execQ.length;){ + if(execQ[i] === module){ + execQ.splice(i, 1); + }else{ + i++; + } } - } + }, - if(dua.indexOf("Gecko") >= 0 && !d.isKhtml && !d.isWebKit){ d.isMozilla = d.isMoz = tv; } - if(d.isMoz){ - //We really need to get away from this. Consider a sane isGecko approach for the future. - d.isFF = parseFloat(dua.split("Firefox/")[1] || dua.split("Minefield/")[1]) || undefined; - } - if(document.all && !d.isOpera){ - d.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined; - //In cases where the page has an HTTP header or META tag with - //X-UA-Compatible, then it is in emulation mode. - //Make sure isIE reflects the desired version. - //document.documentMode of 5 means quirks mode. - //Only switch the value if documentMode's major version - //is different from isIE's major version. - var mode = document.documentMode; - if(mode && mode != 5 && Math.floor(d.isIE) != mode){ - d.isIE = mode; - } - } + circleTrace = [], - //Workaround to get local file loads of dojo to work on IE 7 - //by forcing to not use native xhr. - if(dojo.isIE && window.location.protocol === "file:"){ - dojo.config.ieForceActiveXXhr=true; - } - - d.isQuirks = document.compatMode == "BackCompat"; + execModule = function(module, strict){ + // run the dependency vector, then run the factory for module + if(module.executed === executing){ + req.trace("loader-circular-dependency", [circleTrace.concat(mid).join("->")]); + return (!module.def || strict) ? abortExec : (module.cjs && module.cjs.exports); + } + // at this point the module is either not executed or fully executed - // TODO: is the HTML LANG attribute relevant? - d.locale = dojo.config.locale || (d.isIE ? n.userLanguage : n.language).toLowerCase(); - // These are in order of decreasing likelihood; this will change in time. - d._XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0']; - - d._xhrObj = function(){ - // summary: - // does the work of portably generating a new XMLHTTPRequest object. - var http, last_e; - if(!dojo.isIE || !dojo.config.ieForceActiveXXhr){ - try{ http = new XMLHttpRequest(); }catch(e){} - } - if(!http){ - for(var i=0; i<3; ++i){ - var progid = d._XMLHTTP_PROGIDS[i]; - try{ - http = new ActiveXObject(progid); - }catch(e){ - last_e = e; - } + if(!module.executed){ + if(!module.def){ + return abortExec; + } + var mid = module.mid, + deps = module.deps || [], + arg, argResult, + args = [], + i = 0; + + if(0){ + circleTrace.push(mid); + req.trace("loader-exec-module", ["exec", circleTrace.length, mid]); + } - if(http){ - d._XMLHTTP_PROGIDS = [progid]; // so faster next time - break; + // for circular dependencies, assume the first module encountered was executed OK + // modules that circularly depend on a module that has not run its factory will get + // the premade cjs.exports===module.result. They can take a reference to this object and/or + // add properties to it. When the module finally runs its factory, the factory can + // read/write/replace this object. Notice that so long as the object isn't replaced, any + // reference taken earlier while walking the deps list is still valid. + module.executed = executing; + while(i < deps.length){ + arg = deps[i++]; + argResult = ((arg === cjsRequireModule) ? createRequire(module) : + ((arg === cjsExportsModule) ? module.cjs.exports : + ((arg === cjsModuleModule) ? module.cjs : + execModule(arg, strict)))); + if(argResult === abortExec){ + module.executed = 0; + req.trace("loader-exec-module", ["abort", mid]); + 0 && circleTrace.pop(); + return abortExec; } + args.push(argResult); } + runFactory(module, args); + finishExec(module); } - - if(!http){ - throw new Error("XMLHTTP not available: "+last_e); - } + // at this point the module is guaranteed fully executed - return http; // XMLHTTPRequest instance - } - - d._isDocumentOk = function(http){ - var stat = http.status || 0, - lp = location.protocol; - return (stat >= 200 && stat < 300) || // Boolean - stat == 304 || // allow any 2XX response code - stat == 1223 || // get it out of the cache - // Internet Explorer mangled the status code - // Internet Explorer mangled the status code OR we're Titanium/browser chrome/chrome extension requesting a local file - (!stat && (lp == "file:" || lp == "chrome:" || lp == "chrome-extension:" || lp == "app:")); - } - - //See if base tag is in use. - //This is to fix http://trac.dojotoolkit.org/ticket/3973, - //but really, we need to find out how to get rid of the dojo._Url reference - //below and still have DOH work with the dojo.i18n test following some other - //test that uses the test frame to load a document (trac #2757). - //Opera still has problems, but perhaps a larger issue of base tag support - //with XHR requests (hasBase is true, but the request is still made to document - //path, not base path). - var owloc = window.location+""; - var base = document.getElementsByTagName("base"); - var hasBase = (base && base.length > 0); - - d._getText = function(/*URI*/ uri, /*Boolean*/ fail_ok){ - // summary: Read the contents of the specified uri and return those contents. - // uri: - // A relative or absolute uri. If absolute, it still must be in - // the same "domain" as we are. - // fail_ok: - // Default false. If fail_ok and loading fails, return null - // instead of throwing. - // returns: The response text. null is returned when there is a - // failure and failure is okay (an exception otherwise) + 0 && circleTrace.pop(); + return module.result; + }, - // NOTE: must be declared before scope switches ie. this._xhrObj() - var http = d._xhrObj(); - if(!hasBase && dojo._Url){ - uri = (new dojo._Url(owloc, uri)).toString(); - } + checkCompleteGuard = 0, - if(d.config.cacheBust){ - //Make sure we have a string before string methods are used on uri - uri += ""; - uri += (uri.indexOf("?") == -1 ? "?" : "&") + String(d.config.cacheBust).replace(/\W+/g,""); + checkComplete = function(){ + // keep going through the execQ as long as at least one factory is executed + // plugins, recursion, cached modules all make for many execution path possibilities + if(checkCompleteGuard){ + return; } - - http.open('GET', uri, false); - try{ - http.send(null); - if(!d._isDocumentOk(http)){ - var err = Error("Unable to load "+uri+" status:"+ http.status); - err.status = http.status; - err.responseText = http.responseText; - throw err; + checkCompleteGuard++; + checkDojoRequirePlugin(); + for(var currentDefOrder, module, i = 0; i < execQ.length;){ + currentDefOrder = defOrder; + module = execQ[i]; + execModule(module); + if(currentDefOrder!=defOrder){ + // defOrder was bumped one or more times indicating something was executed (note, this indicates + // the execQ was modified, maybe a lot (for example a later module causes an earlier module to execute) + checkDojoRequirePlugin(); + i = 0; + }else{ + // nothing happened; check the next module in the exec queue + i++; } - }catch(e){ - if(fail_ok){ return null; } // null - // rethrow the exception - throw e; } - return http.responseText; // String - } - - - var _w = window; - var _handleNodeEvent = function(/*String*/evtName, /*Function*/fp){ - // summary: - // non-destructively adds the specified function to the node's - // evtName handler. - // evtName: should be in the form "onclick" for "onclick" handlers. - // Make sure you pass in the "on" part. - var _a = _w.attachEvent || _w.addEventListener; - evtName = _w.attachEvent ? evtName : evtName.substring(2); - _a(evtName, function(){ - fp.apply(_w, arguments); - }, false); - }; - + checkIdle(); + }, - d._windowUnloaders = []; - - d.windowUnloaded = function(){ - // summary: - // signal fired by impending window destruction. You may use - // dojo.addOnWindowUnload() to register a listener for this - // event. NOTE: if you wish to dojo.connect() to this method - // to perform page/application cleanup, be aware that this - // event WILL NOT fire if no handler has been registered with - // dojo.addOnWindowUnload. This behavior started in Dojo 1.3. - // Previous versions always triggered dojo.windowUnloaded. See - // dojo.addOnWindowUnload for more info. - var mll = d._windowUnloaders; - while(mll.length){ - (mll.pop())(); + checkIdle = function(){ + checkCompleteGuard--; + if(execComplete()){ + signal("idle", []); } - d = null; }; - var _onWindowUnloadAttached = 0; - d.addOnWindowUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){ - // summary: - // registers a function to be triggered when window.onunload - // fires. - // description: - // The first time that addOnWindowUnload is called Dojo - // will register a page listener to trigger your unload - // handler with. Note that registering these handlers may - // destory "fastback" page caching in browsers that support - // it. Be careful trying to modify the DOM or access - // JavaScript properties during this phase of page unloading: - // they may not always be available. Consider - // dojo.addOnUnload() if you need to modify the DOM or do - // heavy JavaScript work since it fires at the eqivalent of - // the page's "onbeforeunload" event. - // example: - // | dojo.addOnWindowUnload(functionPointer) - // | dojo.addOnWindowUnload(object, "functionName"); - // | dojo.addOnWindowUnload(object, function(){ /* ... */}); - d._onto(d._windowUnloaders, obj, functionName); - if(!_onWindowUnloadAttached){ - _onWindowUnloadAttached = 1; - _handleNodeEvent("onunload", d.windowUnloaded); - } + if(0){ + req.undef = function(moduleId, referenceModule){ + // In order to reload a module, it must be undefined (this routine) and then re-requested. + // This is useful for testing frameworks (at least). + var module = getModule(moduleId, referenceModule); + setArrived(module); + delete modules[module.mid]; }; + } - var _onUnloadAttached = 0; - d.addOnUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){ - // summary: - // registers a function to be triggered when the page unloads. - // description: - // The first time that addOnUnload is called Dojo will - // register a page listener to trigger your unload handler - // with. - // - // In a browser enviroment, the functions will be triggered - // during the window.onbeforeunload event. Be careful of doing - // too much work in an unload handler. onbeforeunload can be - // triggered if a link to download a file is clicked, or if - // the link is a javascript: link. In these cases, the - // onbeforeunload event fires, but the document is not - // actually destroyed. So be careful about doing destructive - // operations in a dojo.addOnUnload callback. - // - // Further note that calling dojo.addOnUnload will prevent - // browsers from using a "fast back" cache to make page - // loading via back button instantaneous. - // example: - // | dojo.addOnUnload(functionPointer) - // | dojo.addOnUnload(object, "functionName") - // | dojo.addOnUnload(object, function(){ /* ... */}); + if(1){ + if(has("dojo-loader-eval-hint-url")===undefined){ + has.add("dojo-loader-eval-hint-url", 1); + } - d._onto(d._unloaders, obj, functionName); - if(!_onUnloadAttached){ - _onUnloadAttached = 1; - _handleNodeEvent("onbeforeunload", dojo.unloaded); - } - }; + var fixupUrl= function(url){ + url += ""; // make sure url is a Javascript string (some paths may be a Java string) + return url + (cacheBust ? ((/\?/.test(url) ? "&" : "?") + cacheBust) : ""); + }, + + injectPlugin = function( + module + ){ + // injects the plugin module given by module; may have to inject the plugin itself + var plugin = module.plugin; - })(); + if(plugin.executed === executed && !plugin.load){ + // executed the module not knowing it was a plugin + promoteModuleToPlugin(plugin); + } - //START DOMContentLoaded - dojo._initFired = false; - dojo._loadInit = function(e){ - if(dojo._scrollIntervalId){ - clearInterval(dojo._scrollIntervalId); - dojo._scrollIntervalId = 0; - } + var onLoad = function(def){ + module.result = def; + setArrived(module); + finishExec(module); + checkComplete(); + }; + + if(plugin.load){ + plugin.load(module.prid, module.req, onLoad); + }else if(plugin.loadQ){ + plugin.loadQ.push(module); + }else{ + // the unshift instead of push is important: we don't want plugins to execute as + // dependencies of some other module because this may cause circles when the plugin + // loadQ is run; also, generally, we want plugins to run early since they may load + // several other modules and therefore can potentially unblock many modules + plugin.loadQ = [module]; + execQ.unshift(plugin); + injectModule(plugin); + } + }, - if(!dojo._initFired){ - dojo._initFired = true; + // for IE, injecting a module may result in a recursive execution if the module is in the cache - //Help out IE to avoid memory leak. - if(!dojo.config.afterOnLoad && window.detachEvent){ - window.detachEvent("onload", dojo._loadInit); - } + cached = 0, - if(dojo._inFlightCount == 0){ - dojo._modulesLoaded(); - } - } - } + injectingModule = 0, - if(!dojo.config.afterOnLoad){ - if(document.addEventListener){ - //Standards. Hooray! Assumption here that if standards based, - //it knows about DOMContentLoaded. It is OK if it does not, the fall through - //to window onload should be good enough. - document.addEventListener("DOMContentLoaded", dojo._loadInit, false); - window.addEventListener("load", dojo._loadInit, false); - }else if(window.attachEvent){ - window.attachEvent("onload", dojo._loadInit); + injectingCachedModule = 0, - //DOMContentLoaded approximation. Diego Perini found this MSDN article - //that indicates doScroll is available after DOM ready, so do a setTimeout - //to check when it is available. - //http://msdn.microsoft.com/en-us/library/ms531426.aspx - if(!dojo.config.skipIeDomLoaded && self === self.top){ - dojo._scrollIntervalId = setInterval(function (){ + evalModuleText = function(text, module){ + // see def() for the injectingCachedModule bracket; it simply causes a short, safe curcuit + injectingCachedModule = 1; + if(has("config-dojo-loader-catches")){ try{ - //When dojo is loaded into an iframe in an IE HTML Application - //(HTA), such as in a selenium test, javascript in the iframe - //can't see anything outside of it, so self===self.top is true, - //but the iframe is not the top window and doScroll will be - //available before document.body is set. Test document.body - //before trying the doScroll trick - if(document.body){ - document.documentElement.doScroll("left"); - dojo._loadInit(); + if(text===cached){ + cached.call(null); + }else{ + req.eval(text, has("dojo-loader-eval-hint-url") ? module.url : module.mid); } - }catch (e){} - }, 30); - } - } - } - - if(dojo.isIE){ - try{ - (function(){ - document.namespaces.add("v", "urn:schemas-microsoft-com:vml"); - var vmlElems = ["*", "group", "roundrect", "oval", "shape", "rect", "imagedata", "path", "textpath", "text"], - i = 0, l = 1, s = document.createStyleSheet(); - if(dojo.isIE >= 8){ - i = 1; - l = vmlElems.length; - } - for(; i < l; ++i){ - s.addRule("v\\:" + vmlElems[i], "behavior:url(#default#VML); display:inline-block"); - } - })(); - }catch(e){} - } - //END DOMContentLoaded - + }catch(e){ + signal(error, makeError("evalModuleThrew", module)); + } + }else{ + if(text===cached){ + cached.call(null); + }else{ + req.eval(text, has("dojo-loader-eval-hint-url") ? module.url : module.mid); + } + } + injectingCachedModule = 0; + }, - /* - OpenAjax.subscribe("OpenAjax", "onload", function(){ - if(dojo._inFlightCount == 0){ - dojo._modulesLoaded(); - } - }); + injectModule = function(module){ + // Inject the module. In the browser environment, this means appending a script element into + // the document; in other environments, it means loading a file. + // + // If in synchronous mode, then get the module synchronously if it's not xdomainLoading. - OpenAjax.subscribe("OpenAjax", "onunload", function(){ - dojo.unloaded(); - }); - */ -} //if (typeof window != 'undefined') + var mid = module.mid, + url = module.url; + if(module.executed || module.injected || waiting[mid] || (module.url && ((module.pack && waiting[module.url]===module.pack) || waiting[module.url]==1))){ + return; + } + setRequested(module); + + if(0){ + var viaCombo = 0; + if(module.plugin && module.plugin.isCombo){ + // a combo plugin; therefore, must be handled by combo service + // the prid should have already been converted to a URL (if required by the plugin) during + // the normalze process; in any event, there is no way for the loader to know how to + // to the conversion; therefore the third argument is zero + req.combo.add(module.plugin.mid, module.prid, 0, req); + viaCombo = 1; + }else if(!module.plugin){ + viaCombo = req.combo.add(0, module.mid, module.url, req); + } + if(viaCombo){ + comboPending= 1; + return; + } + } -//Register any module paths set up in djConfig. Need to do this -//in the hostenvs since hostenv_browser can read djConfig from a -//script tag's attribute. -(function(){ - var mp = dojo.config["modulePaths"]; - if(mp){ - for(var param in mp){ - dojo.registerModulePath(param, mp[param]); - } - } -})(); + if(module.plugin){ + injectPlugin(module); + return; + } // else a normal module (not a plugin) + + + var onLoadCallback = function(){ + runDefQ(module); + if(module.injected !== arrived){ + // the script that contained the module arrived and has been executed yet + // nothing was added to the defQ (so it wasn't an AMD module) and the module + // wasn't marked as arrived by dojo.provide (so it wasn't a v1.6- module); + // therefore, it must not have been a module; adjust state accordingly + setArrived(module); + mix(module, nonModuleProps); + } -//Load debug code if necessary. -if(dojo.config.isDebug){ - dojo.require("dojo._firebug.firebug"); -} + if(1 && legacyMode){ + // must call checkComplete even in for sync loader because we may be in xdomainLoading mode; + // but, if xd loading, then don't call checkComplete until out of the current sync traversal + // in order to preserve order of execution of the dojo.required modules + !syncExecStack.length && checkComplete(); + }else{ + checkComplete(); + } + }; + cached = cache[mid] || cache[module.cacheId]; + if(cached){ + req.trace("loader-inject", ["cache", module.mid, url]); + evalModuleText(cached, module); + onLoadCallback(); + return; + } + if(1 && legacyMode){ + if(module.isXd){ + // switch to async mode temporarily; if current legacyMode!=sync, then is must be one of {legacyAsync, xd, false} + legacyMode==sync && (legacyMode = xd); + // fall through and load via script injection + }else if(module.isAmd && legacyMode!=sync){ + // fall through and load via script injection + }else{ + // mode may be sync, xd/legacyAsync, or async; module may be AMD or legacy; but module is always located on the same domain + var xhrCallback = function(text){ + if(legacyMode==sync){ + // the top of syncExecStack gives the current synchronously executing module; the loader needs + // to know this if it has to switch to async loading in the middle of evaluating a legacy module + // this happens when a modules dojo.require's a module that must be loaded async because it's xdomain + // (using unshift/shift because there is no back() methods for Javascript arrays) + syncExecStack.unshift(module); + evalModuleText(text, module); + syncExecStack.shift(); + + // maybe the module was an AMD module + runDefQ(module); + + // legacy modules never get to defineModule() => cjs and injected never set; also evaluation implies executing + if(!module.cjs){ + setArrived(module); + finishExec(module); + } -if(dojo.config.debugAtAllCosts){ - // this breaks the new AMD based module loader. The XDomain won't be necessary - // anyway if you switch to the asynchronous loader - //dojo.config.useXDomain = true; - //dojo.require("dojo._base._loader.loader_xd"); - dojo.require("dojo._base._loader.loader_debug"); - dojo.require("dojo.i18n"); -} + if(module.finish){ + // while synchronously evaluating this module, dojo.require was applied referencing a module + // that had to be loaded async; therefore, the loader stopped answering all dojo.require + // requests so they could be answered completely in the correct sequence; module.finish gives + // the list of dojo.requires that must be re-applied once all target modules are available; + // make a synthetic module to execute the dojo.require's in the correct order + + // compute a guarnateed-unique mid for the synthetic finish module; remember the finish vector; remove it from the reference module + // TODO: can we just leave the module.finish...what's it hurting? + var finishMid = mid + "*finish", + finish = module.finish; + delete module.finish; + + def(finishMid, ["dojo", ("dojo/require!" + finish.join(",")).replace(/\./g, "/")], function(dojo){ + forEach(finish, function(mid){ dojo.require(mid); }); + }); + // unshift, not push, which causes the current traversal to be reattempted from the top + execQ.unshift(getModule(finishMid)); + } + onLoadCallback(); + }else{ + text = transformToAmd(module, text); + if(text){ + evalModuleText(text, module); + onLoadCallback(); + }else{ + // if transformToAmd returned falsy, then the module was already AMD and it can be script-injected + // do so to improve debugability(even though it means another download...which probably won't happen with a good browser cache) + injectingModule = module; + req.injectUrl(fixupUrl(url), onLoadCallback, module); + injectingModule = 0; + } + } + }; + + req.trace("loader-inject", ["xhr", module.mid, url, legacyMode!=sync]); + if(has("config-dojo-loader-catches")){ + try{ + req.getText(url, legacyMode!=sync, xhrCallback); + }catch(e){ + signal(error, makeError("xhrInjectFailed", [module, e])); + } + }else{ + req.getText(url, legacyMode!=sync, xhrCallback); + } + return; + } + } // else async mode or fell through in xdomain loading mode; either way, load by script injection + req.trace("loader-inject", ["script", module.mid, url]); + injectingModule = module; + req.injectUrl(fixupUrl(url), onLoadCallback, module); + injectingModule = 0; + }, + defineModule = function(module, deps, def){ + req.trace("loader-define-module", [module.mid, deps]); + + if(0 && module.plugin && module.plugin.isCombo){ + // the module is a plugin resource loaded by the combo service + // note: check for module.plugin should be enough since normal plugin resources should + // not follow this path; module.plugin.isCombo is future-proofing belt and suspenders + module.result = isFunction(def) ? def() : def; + setArrived(module); + finishExec(module); + return module; + }; -if(!dojo._hasResource["dojo._base.lang"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo._base.lang"] = true; -dojo.provide("dojo._base.lang"); + var mid = module.mid; + if(module.injected === arrived){ + signal(error, makeError("multipleDefine", module)); + return module; + } + mix(module, { + deps: deps, + def: def, + cjs: { + id: module.mid, + uri: module.url, + exports: (module.result = {}), + setExports: function(exports){ + module.cjs.exports = exports; + } + } + }); + // resolve deps with respect to this module + for(var i = 0; i < deps.length; i++){ + deps[i] = getModule(deps[i], module); + } -(function(){ - var d = dojo, opts = Object.prototype.toString; + if(1 && legacyMode && !waiting[mid]){ + // the module showed up without being asked for; it was probably in a + // + return new dojo.NodeList(); // dojo.NodeList +}; +=====*/ - dojo.style = function( /*DomNode|String*/ node, - /*String?|Object?*/ style, - /*String?*/ value){ +function queryForEngine(engine, NodeList){ + var query = function(/*String*/ query, /*String|DOMNode?*/ root){ // summary: - // Accesses styles on a node. If 2 arguments are - // passed, acts as a getter. If 3 arguments are passed, acts - // as a setter. - // description: - // Getting the style value uses the computed style for the node, so the value - // will be a calculated value, not just the immediate node.style value. - // Also when getting values, use specific style names, - // like "borderBottomWidth" instead of "border" since compound values like - // "border" are not necessarily reflected as expected. - // If you want to get node dimensions, use `dojo.marginBox()`, - // `dojo.contentBox()` or `dojo.position()`. - // node: - // id or reference to node to get/set style for - // style: - // the style property to set in DOM-accessor format - // ("borderWidth", not "border-width") or an object with key/value - // pairs suitable for setting each property. - // value: - // If passed, sets value on the node for style, handling - // cross-browser concerns. When setting a pixel value, - // be sure to include "px" in the value. For instance, top: "200px". - // Otherwise, in some cases, some browsers will not apply the style. - // example: - // Passing only an ID or node returns the computed style object of - // the node: - // | dojo.style("thinger"); - // example: - // Passing a node and a style property returns the current - // normalized, computed value for that property: - // | dojo.style("thinger", "opacity"); // 1 by default - // - // example: - // Passing a node, a style property, and a value changes the - // current display of the node and returns the new computed value - // | dojo.style("thinger", "opacity", 0.5); // == 0.5 - // - // example: - // Passing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node: - // | dojo.style("thinger", { - // | "opacity": 0.5, - // | "border": "3px solid black", - // | "height": "300px" - // | }); - // - // example: - // When the CSS style property is hyphenated, the JavaScript property is camelCased. - // font-size becomes fontSize, and so on. - // | dojo.style("thinger",{ - // | fontSize:"14pt", - // | letterSpacing:"1.2em" - // | }); - // - // example: - // dojo.NodeList implements .style() using the same syntax, omitting the "node" parameter, calling - // dojo.style() on every element of the list. See: `dojo.query()` and `dojo.NodeList()` - // | dojo.query(".someClassName").style("visibility","hidden"); - // | // or - // | dojo.query("#baz > div").style({ - // | opacity:0.75, - // | fontSize:"13pt" - // | }); - - var n = byId(node), args = arguments.length, op = (style == "opacity"); - style = _floatAliases[style] || style; - if(args == 3){ - return op ? d._setOpacity(n, value) : n.style[style] = value; /*Number*/ - } - if(args == 2 && op){ - return d._getOpacity(n); - } - var s = gcs(n); - if(args == 2 && typeof style != "string"){ // inline'd type check - for(var x in style){ - d.style(node, x, style[x]); + // Returns nodes which match the given CSS selector, searching the + // entire document by default but optionally taking a node to scope + // the search by. Returns an instance of dojo.NodeList. + if(typeof root == "string"){ + root = dom.byId(root); + if(!root){ + return new NodeList([]); } - return s; } - return (args == 1) ? s : _toStyleValue(n, style, s[style] || n.style[style]); /* CSS2Properties||String||Number */ + var results = typeof query == "string" ? engine(query, root) : query.orphan ? query : [query]; + if(results.orphan){ + // already wrapped + return results; + } + return new NodeList(results); }; + query.matches = engine.match || function(node, selector, root){ + // summary: + // Test to see if a node matches a selector + return query.filter([node], selector, root).length > 0; + }; + // the engine provides a filtering function, use it to for matching + query.filter = engine.filter || function(nodes, selector, root){ + // summary: + // Filters an array of nodes. Note that this does not guarantee to return a dojo.NodeList, just an array. + return query(selector, root).filter(function(node){ + return array.indexOf(nodes, node) > -1; + }); + }; + if(typeof engine != "function"){ + var search = engine.search; + engine = function(selector, root){ + // Slick does it backwards (or everyone else does it backwards, probably the latter) + return search(root || document, selector); + }; + } + return query; +} +var query = queryForEngine(defaultEngine, NodeList); +// the query that is returned from this module is slightly different than dojo.query, +// because dojo.query has to maintain backwards compatibility with returning a +// true array which has performance problems. The query returned from the module +// does not use true arrays, but rather inherits from Array, making it much faster to +// instantiate. +dojo.query = queryForEngine(defaultEngine, function(array){ + // call it without the new operator to invoke the back-compat behavior that returns a true array + return NodeList(array); +}); + +query.load = /*===== dojo.query.load= ======*/ function(id, parentRequire, loaded, config){ + // summary: can be used as AMD plugin to conditionally load new query engine + // example: + // | define(["dojo/query!custom"], function(qsa){ + // | // loaded selector/custom.js as engine + // | qsa("#foobar").forEach(...); + // | }); + loader.load(id, parentRequire, function(engine){ + loaded(queryForEngine(engine, NodeList)); + }); +}; - // ============================= - // Box Functions - // ============================= - - dojo._getPadExtents = function(/*DomNode*/n, /*Object*/computedStyle){ - // summary: - // Returns object with special values specifically useful for node - // fitting. - // description: - // Returns an object with `w`, `h`, `l`, `t` properties: - // | l/t = left/top padding (respectively) - // | w = the total of the left and right padding - // | h = the total of the top and bottom padding - // If 'node' has position, l/t forms the origin for child nodes. - // The w/h are used for calculating boxes. - // Normally application code will not need to invoke this - // directly, and will use the ...box... functions instead. +dojo._filterQueryResult = query._filterResult = function(nodes, selector, root){ + return new NodeList(query.filter(nodes, selector, root)); +}; +dojo.NodeList = query.NodeList = NodeList; +return query; +}); + +}, +'dojo/has':function(){ +define(["require"], function(require) { + // module: + // dojo/has + // summary: + // Defines the has.js API and several feature tests used by dojo. + // description: + // This module defines the has API as described by the project has.js with the following additional features: + // + // * the has test cache is exposed at has.cache. + // * the method has.add includes a forth parameter that controls whether or not existing tests are replaced + // * the loader's has cache may be optionally copied into this module's has cahce. + // + // This module adopted from https://github.com/phiggins42/has.js; thanks has.js team! + + // try to pull the has implementation from the loader; both the dojo loader and bdLoad provide one + // WARNING: if a foreign loader defines require.has to be something other than the has.js API, then this implementation fail + var has = require.has || function(){}; + if(!1){ + // notice the condition is written so that if 1 is transformed to 1 during a build + // the conditional will be (!1 && typeof has=="function") which is statically false and the closure + // compiler will discard the block. var - s = computedStyle||gcs(n), - l = px(n, s.paddingLeft), - t = px(n, s.paddingTop); - return { - l: l, - t: t, - w: l+px(n, s.paddingRight), - h: t+px(n, s.paddingBottom) + isBrowser = + // the most fundamental decision: are we in the browser? + typeof window != "undefined" && + typeof location != "undefined" && + typeof document != "undefined" && + window.location == location && window.document == document, + + // has API variables + global = this, + doc = isBrowser && document, + element = doc && doc.createElement("DiV"), + cache = {}; + + has = /*===== dojo.has= =====*/ function(name){ + // summary: + // Return the current value of the named feature. + // + // name: String|Integer + // The name (if a string) or identifier (if an integer) of the feature to test. + // + // description: + // Returns the value of the feature named by name. The feature must have been + // previously added to the cache by has.add. + + return typeof cache[name] == "function" ? (cache[name] = cache[name](global, doc, element)) : cache[name]; // Boolean }; - }; - dojo._getBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){ - // summary: - // returns an object with properties useful for noting the border - // dimensions. - // description: - // * l/t = the sum of left/top border (respectively) - // * w = the sum of the left and right border - // * h = the sum of the top and bottom border - // - // The w/h are used for calculating boxes. - // Normally application code will not need to invoke this - // directly, and will use the ...box... functions instead. - var - ne = "none", - s = computedStyle||gcs(n), - bl = (s.borderLeftStyle != ne ? px(n, s.borderLeftWidth) : 0), - bt = (s.borderTopStyle != ne ? px(n, s.borderTopWidth) : 0); - return { - l: bl, - t: bt, - w: bl + (s.borderRightStyle!=ne ? px(n, s.borderRightWidth) : 0), - h: bt + (s.borderBottomStyle!=ne ? px(n, s.borderBottomWidth) : 0) + has.cache = cache; + + has.add = /*====== dojo.has.add= ======*/ function(name, test, now, force){ + // summary: + // Register a new feature test for some named feature. + // + // name: String|Integer + // The name (if a string) or identifier (if an integer) of the feature to test. + // + // test: Function + // A test function to register. If a function, queued for testing until actually + // needed. The test function should return a boolean indicating + // the presence of a feature or bug. + // + // now: Boolean? + // Optional. Omit if `test` is not a function. Provides a way to immediately + // run the test and cache the result. + // + // force: Boolean? + // Optional. If the test already exists and force is truthy, then the existing + // test will be replaced; otherwise, add does not replace an existing test (that + // is, by default, the first test advice wins). + // + // example: + // A redundant test, testFn with immediate execution: + // | has.add("javascript", function(){ return true; }, true); + // + // example: + // Again with the redundantness. You can do this in your tests, but we should + // not be doing this in any internal has.js tests + // | has.add("javascript", true); + // + // example: + // Three things are passed to the testFunction. `global`, `document`, and a generic element + // from which to work your test should the need arise. + // | has.add("bug-byid", function(g, d, el){ + // | // g == global, typically window, yadda yadda + // | // d == document object + // | // el == the generic element. a `has` element. + // | return false; // fake test, byid-when-form-has-name-matching-an-id is slightly longer + // | }); + + (typeof cache[name]=="undefined" || force) && (cache[name]= test); + return now && has(name); }; + + // since we're operating under a loader that doesn't provide a has API, we must explicitly initialize + // has as it would have otherwise been initialized by the dojo loader; use has.add to the builder + // can optimize these away iff desired + true || has.add("host-browser", isBrowser); + true || has.add("dom", isBrowser); + true || has.add("dojo-dom-ready-api", 1); + true || has.add("dojo-sniff", 1); + } + + if(1){ + var agent = navigator.userAgent; + // Common application level tests + has.add("dom-addeventlistener", !!document.addEventListener); + has.add("touch", "ontouchstart" in document); + // I don't know if any of these tests are really correct, just a rough guess + has.add("device-width", screen.availWidth || innerWidth); + has.add("agent-ios", !!agent.match(/iPhone|iP[ao]d/)); + has.add("agent-android", agent.indexOf("android") > 1); + } + + has.clearElement = /*===== dojo.has.clearElement= ======*/ function(element) { + // summary: + // Deletes the contents of the element passed to test functions. + element.innerHTML= ""; + return element; }; - dojo._getPadBorderExtents = function(/*DomNode*/n, /*Object*/computedStyle){ - // summary: - // Returns object with properties useful for box fitting with - // regards to padding. - // description: - // * l/t = the sum of left/top padding and left/top border (respectively) - // * w = the sum of the left and right padding and border - // * h = the sum of the top and bottom padding and border + has.normalize = /*===== dojo.has.normalize= ======*/ function(id, toAbsMid){ + // summary: + // Resolves id into a module id based on possibly-nested tenary expression that branches on has feature test value(s). // - // The w/h are used for calculating boxes. - // Normally application code will not need to invoke this - // directly, and will use the ...box... functions instead. + // toAbsMid: Function + // Resolves a relative module id into an absolute module id var - s = computedStyle||gcs(n), - p = d._getPadExtents(n, s), - b = d._getBorderExtents(n, s); - return { - l: p.l + b.l, - t: p.t + b.t, - w: p.w + b.w, - h: p.h + b.h - }; + tokens = id.match(/[\?:]|[^:\?]*/g), i = 0, + get = function(skip){ + var term = tokens[i++]; + if(term == ":"){ + // empty string module name, resolves to 0 + return 0; + }else{ + // postfixed with a ? means it is a feature to branch on, the term is the name of the feature + if(tokens[i++] == "?"){ + if(!skip && has(term)){ + // matched the feature, get the first value from the options + return get(); + }else{ + // did not match, get the second value, passing over the first + get(true); + return get(skip); + } + } + // a module + return term || 0; + } + }; + id = get(); + return id && toAbsMid(id); }; - dojo._getMarginExtents = function(n, computedStyle){ - // summary: - // returns object with properties useful for box fitting with - // regards to box margins (i.e., the outer-box). + has.load = /*===== dojo.has.load= ======*/ function(id, parentRequire, loaded){ + // summary: + // Conditional loading of AMD modules based on a has feature test value. // - // * l/t = marginLeft, marginTop, respectively - // * w = total width, margin inclusive - // * h = total height, margin inclusive + // id: String + // Gives the resolved module id to load. // - // The w/h are used for calculating boxes. - // Normally application code will not need to invoke this - // directly, and will use the ...box... functions instead. - var - s = computedStyle||gcs(n), - l = px(n, s.marginLeft), - t = px(n, s.marginTop), - r = px(n, s.marginRight), - b = px(n, s.marginBottom); - if(d.isWebKit && (s.position != "absolute")){ - // FIXME: Safari's version of the computed right margin - // is the space between our right edge and the right edge - // of our offsetParent. - // What we are looking for is the actual margin value as - // determined by CSS. - // Hack solution is to assume left/right margins are the same. - r = l; + // parentRequire: Function + // The loader require function with respect to the module that contained the plugin resource in it's + // dependency list. + // + // loaded: Function + // Callback to loader that consumes result of plugin demand. + + if(id){ + parentRequire([id], loaded); + }else{ + loaded(); } - return { - l: l, - t: t, - w: l+r, - h: t+b - }; }; - // Box getters work in any box context because offsetWidth/clientWidth - // are invariant wrt box context - // - // They do *not* work for display: inline objects that have padding styles - // because the user agent ignores padding (it's bogus styling in any case) - // - // Be careful with IMGs because they are inline or block depending on - // browser and browser mode. + return has; +}); - // Although it would be easier to read, there are not separate versions of - // _getMarginBox for each browser because: - // 1. the branching is not expensive - // 2. factoring the shared code wastes cycles (function call overhead) - // 3. duplicating the shared code wastes bytes +}, +'dojo/_base/loader':function(){ +define(["./kernel", "../has", "require", "module", "./json", "./lang", "./array"], function(dojo, has, require, thisModule, json, lang, array) { + // module: + // dojo/_base/lader + // summary: + // This module defines the v1.x synchronous loader API. - dojo._getMarginBox = function(/*DomNode*/node, /*Object*/computedStyle){ - // summary: - // returns an object that encodes the width, height, left and top - // positions of the node's margin box. - var s = computedStyle || gcs(node), me = d._getMarginExtents(node, s); - var l = node.offsetLeft - me.l, t = node.offsetTop - me.t, p = node.parentNode; - if(d.isMoz){ - // Mozilla: - // If offsetParent has a computed overflow != visible, the offsetLeft is decreased - // by the parent's border. - // We don't want to compute the parent's style, so instead we examine node's - // computed left/top which is more stable. - var sl = parseFloat(s.left), st = parseFloat(s.top); - if(!isNaN(sl) && !isNaN(st)){ - l = sl, t = st; - }else{ - // If child's computed left/top are not parseable as a number (e.g. "auto"), we - // have no choice but to examine the parent's computed style. - if(p && p.style){ - var pcs = gcs(p); - if(pcs.overflow != "visible"){ - var be = d._getBorderExtents(p, pcs); - l += be.l, t += be.t; - } - } - } - }else if(d.isOpera || (d.isIE > 7 && !d.isQuirks)){ - // On Opera and IE 8, offsetLeft/Top includes the parent's border - if(p){ - be = d._getBorderExtents(p); - l -= be.l; - t -= be.t; - } - } - return { - l: l, - t: t, - w: node.offsetWidth + me.w, - h: node.offsetHeight + me.h - }; - } - - dojo._getMarginSize = function(/*DomNode*/node, /*Object*/computedStyle){ - // summary: - // returns an object that encodes the width and height of - // the node's margin box - node = byId(node); - var me = d._getMarginExtents(node, computedStyle || gcs(node)); + // signal the loader in sync mode... + //>>pure-amd - var size = node.getBoundingClientRect(); - return { - w: (size.right - size.left) + me.w, - h: (size.bottom - size.top) + me.h - } + if (!1){ + console.error("cannot load the Dojo v1.x loader with a foreign loader"); + return 0; } - dojo._getContentBox = function(node, computedStyle){ - // summary: - // Returns an object that encodes the width, height, left and top - // positions of the node's content box, irrespective of the - // current box model. + var makeErrorToken = function(id){ + return {src:thisModule.id, id:id}; + }, - // clientWidth/Height are important since the automatically account for scrollbars - // fallback to offsetWidth/Height for special cases (see #3378) - var s = computedStyle || gcs(node), - pe = d._getPadExtents(node, s), - be = d._getBorderExtents(node, s), - w = node.clientWidth, - h - ; - if(!w){ - w = node.offsetWidth, h = node.offsetHeight; - }else{ - h = node.clientHeight, be.w = be.h = 0; - } - // On Opera, offsetLeft includes the parent's border - if(d.isOpera){ pe.l += be.l; pe.t += be.t; }; - return { - l: pe.l, - t: pe.t, - w: w - pe.w - be.w, - h: h - pe.h - be.h - }; - }; + slashName = function(name){ + return name.replace(/\./g, "/"); + }, - dojo._getBorderBox = function(node, computedStyle){ - var s = computedStyle || gcs(node), - pe = d._getPadExtents(node, s), - cb = d._getContentBox(node, s) - ; - return { - l: cb.l - pe.l, - t: cb.t - pe.t, - w: cb.w + pe.w, - h: cb.h + pe.h - }; - }; + buildDetectRe = /\/\/>>built/, - // Box setters depend on box context because interpretation of width/height styles - // vary wrt box context. - // - // The value of dojo.boxModel is used to determine box context. - // dojo.boxModel can be set directly to change behavior. - // - // Beware of display: inline objects that have padding styles - // because the user agent ignores padding (it's a bogus setup anyway) - // - // Be careful with IMGs because they are inline or block depending on - // browser and browser mode. - // - // Elements other than DIV may have special quirks, like built-in - // margins or padding, or values not detectable via computedStyle. - // In particular, margins on TABLE do not seems to appear - // at all in computedStyle on Mozilla. + dojoRequireCallbacks = [], + dojoRequireModuleStack = [], - dojo._setBox = function(/*DomNode*/node, /*Number?*/l, /*Number?*/t, /*Number?*/w, /*Number?*/h, /*String?*/u){ - // summary: - // sets width/height/left/top in the current (native) box-model - // dimentions. Uses the unit passed in u. - // node: - // DOM Node reference. Id string not supported for performance - // reasons. - // l: - // left offset from parent. - // t: - // top offset from parent. - // w: - // width in current box model. - // h: - // width in current box model. - // u: - // unit measure to use for other measures. Defaults to "px". - u = u || "px"; - var s = node.style; - if(!isNaN(l)){ s.left = l + u; } - if(!isNaN(t)){ s.top = t + u; } - if(w >= 0){ s.width = w + u; } - if(h >= 0){ s.height = h + u; } - }; + dojoRequirePlugin = function(mid, require, loaded){ + dojoRequireCallbacks.push(loaded); + array.forEach(mid.split(","), function(mid){ + var module = getModule(mid, require.module); + dojoRequireModuleStack.push(module); + injectModule(module); + }); + checkDojoRequirePlugin(); + }, - dojo._isButtonTag = function(/*DomNode*/node) { - // summary: - // True if the node is BUTTON or INPUT.type="button". - return node.tagName == "BUTTON" - || node.tagName=="INPUT" && (node.getAttribute("type")||'').toUpperCase() == "BUTTON"; // boolean - }; + // checkDojoRequirePlugin inspects all of the modules demanded by a dojo/require! dependency + // to see if they have arrived. The loader does not release *any* of these modules to be instantiated + // until *all* of these modules are on board, thereby preventing the evaluation of a module with dojo.require's + // that reference modules that are not available. + // + // The algorithm works by traversing the dependency graphs (remember, there can be cycles so they are not trees) + // of each module in the dojoRequireModuleStack array (which contains the list of modules demanded by dojo/require!). + // The moment a single module is discovered that is missing, the algorithm gives up and indicates that not all + // modules are on board. dojo/loadInit! and dojo/require! are ignored because there dependencies are inserted + // directly in dojoRequireModuleStack. For example, if "your/module" module depends on "dojo/require!my/module", then + // *both* "dojo/require!my/module" and "my/module" will be in dojoRequireModuleStack. Obviously, if "my/module" + // is on board, then "dojo/require!my/module" is also satisfied, so the algorithm doesn't check for "dojo/require!my/module". + // + // Note: inserting a dojo/require! dependency in the dojoRequireModuleStack achieves nothing + // with the current algorithm; however, having such modules present makes it possible to optimize the algorithm + // + // Note: prior versions of this algorithm had an optimization that signaled loaded on dojo/require! dependencies + // individually (rather than waiting for them all to be resolved). The implementation proved problematic with cycles + // and plugins. However, it is possible to reattach that strategy in the future. + + // a set from module-id to {undefined | 1 | 0}, where... + // undefined => the module has not been inspected + // 0 => the module or at least one of its dependencies has not arrived + // 1 => the module is a loadInit! or require! plugin resource, or is currently being traversed (therefore, assume + // OK until proven otherwise), or has been completely traversed and all dependencies have arrived + touched, + + traverse = function(m){ + touched[m.mid] = 1; + for(var t, module, deps = m.deps || [], i= 0; i= 0){ widthPx += pb.w; } - if(heightPx >= 0){ heightPx += pb.h; } - } - d._setBox(node, NaN, NaN, widthPx, heightPx); - }; + // requireList is the list of modules that need to be downloaded but not executed before the callingModule can be executed + requireList.length && deps.push("dojo/require!" + requireList.join(",")); - dojo._setMarginBox = function(/*DomNode*/node, /*Number?*/leftPx, /*Number?*/topPx, - /*Number?*/widthPx, /*Number?*/heightPx, - /*Object*/computedStyle){ - // summary: - // sets the size of the node's margin box and placement - // (left/top), irrespective of box model. Think of it as a - // passthrough to dojo._setBox that handles box-model vagaries for - // you. + dojoRequireCallbacks.push(loaded); + array.forEach(requireList, function(mid){ + var module = getModule(mid, require.module); + dojoRequireModuleStack.push(module); + injectModule(module); + }); + checkDojoRequirePlugin(); + }); + }); + }, - var s = computedStyle || gcs(node), - // Some elements have special padding, margin, and box-model settings. - // To use box functions you may need to set padding, margin explicitly. - // Controlling box-model is harder, in a pinch you might set dojo.boxModel. - bb = d._usesBorderBox(node), - pb = bb ? _nilExtents : d._getPadBorderExtents(node, s) - ; - if(d.isWebKit){ - // on Safari (3.1.2), button nodes with no explicit size have a default margin - // setting an explicit size eliminates the margin. - // We have to swizzle the width to get correct margin reading. - if(d._isButtonTag(node)){ - var ns = node.style; - if(widthPx >= 0 && !ns.width) { ns.width = "4px"; } - if(heightPx >= 0 && !ns.height) { ns.height = "4px"; } + extractApplication = function( + text, // the text to search + startSearch, // the position in text to start looking for the closing paren + startApplication // the position in text where the function application expression starts + ){ + // find end of the call by finding the matching end paren + // Warning: as usual, this will fail in the presense of unmatched right parans contained in strings, regexs, or unremoved comments + var parenRe = /\(|\)/g, + matchCount = 1, + match; + parenRe.lastIndex = startSearch; + while((match = parenRe.exec(text))){ + if(match[0] == ")"){ + matchCount -= 1; + }else{ + matchCount += 1; + } + if(matchCount == 0){ + break; + } } - } - var mb = d._getMarginExtents(node, s); - if(widthPx >= 0){ widthPx = Math.max(widthPx - pb.w - mb.w, 0); } - if(heightPx >= 0){ heightPx = Math.max(heightPx - pb.h - mb.h, 0); } - d._setBox(node, leftPx, topPx, widthPx, heightPx); - }; - var _nilExtents = { l:0, t:0, w:0, h:0 }; + if(matchCount != 0){ + throw "unmatched paren around character " + parenRe.lastIndex + " in: " + text; + } - // public API + //Put the master matching string in the results. + return [dojo.trim(text.substring(startApplication, parenRe.lastIndex))+";\n", parenRe.lastIndex]; + }, - dojo.marginBox = function(/*DomNode|String*/node, /*Object?*/box){ - // summary: - // Getter/setter for the margin-box of node. - // description: - // Getter/setter for the margin-box of node. - // Returns an object in the expected format of box (regardless - // if box is passed). The object might look like: - // `{ l: 50, t: 200, w: 300: h: 150 }` - // for a node offset from its parent 50px to the left, 200px from - // the top with a margin width of 300px and a margin-height of - // 150px. - // node: - // id or reference to DOM Node to get/set box for - // box: - // If passed, denotes that dojo.marginBox() should - // update/set the margin box for node. Box is an object in the - // above format. All properties are optional if passed. - // example: - // Retrieve the marginbox of a passed node - // | var box = dojo.marginBox("someNodeId"); - // | console.dir(box); + // the following regex is taken from 1.6. It is a very poor technique to remove comments and + // will fail in some cases; for example, consider the code... // - // example: - // Set a node's marginbox to the size of another node - // | var box = dojo.marginBox("someNodeId"); - // | dojo.marginBox("someOtherNode", box); - - var n = byId(node), s = gcs(n), b = box; - return !b ? d._getMarginBox(n, s) : d._setMarginBox(n, b.l, b.t, b.w, b.h, s); // Object - }; + // var message = "Category-1 */* Category-2"; + // + // The regex that follows will see a /* comment and trash the code accordingly. In fact, there are all + // kinds of cases like this with strings and regexs that will cause this design to fail miserably. + // + // Alternative regex designs exist that will result in less-likely failures, but will still fail in many cases. + // The only solution guaranteed 100% correct is to parse the code and that seems overkill for this + // backcompat/unbuilt-xdomain layer. In the end, since it's been this way for a while, we won't change it. + // See the opening paragraphs of Chapter 7 or ECME-262 which describes the lexical abiguity further. + removeCommentRe = /(\/\*([\s\S]*?)\*\/|\/\/(.*)$)/mg, - dojo.contentBox = function(/*DomNode|String*/node, /*Object?*/box){ - // summary: - // Getter/setter for the content-box of node. - // description: - // Returns an object in the expected format of box (regardless if box is passed). - // The object might look like: - // `{ l: 50, t: 200, w: 300: h: 150 }` - // for a node offset from its parent 50px to the left, 200px from - // the top with a content width of 300px and a content-height of - // 150px. Note that the content box may have a much larger border - // or margin box, depending on the box model currently in use and - // CSS values set/inherited for node. - // While the getter will return top and left values, the - // setter only accepts setting the width and height. - // node: - // id or reference to DOM Node to get/set box for - // box: - // If passed, denotes that dojo.contentBox() should - // update/set the content box for node. Box is an object in the - // above format, but only w (width) and h (height) are supported. - // All properties are optional if passed. - var n = byId(node), s = gcs(n), b = box; - return !b ? d._getContentBox(n, s) : d._setContentSize(n, b.w, b.h, s); // Object - }; + syncLoaderApiRe = /(^|\s)dojo\.(loadInit|require|provide|requireLocalization|requireIf|requireAfterIf|platformRequire)\s*\(/mg, - // ============================= - // Positioning - // ============================= + amdLoaderApiRe = /(^|\s)(require|define)\s*\(/m, + + extractLegacyApiApplications = function(text, noCommentText){ + // scan the noCommentText for any legacy loader API applications. Copy such applications into result (this is + // used by the builder). Move dojo.loadInit applications to loadInitApplications string. Copy all other applications + // to otherApplications string. If no applications were found, return 0, signalling an AMD module. Otherwise, return + // loadInitApplications + otherApplications. Fixup text by replacing + // + // dojo.loadInit(// etc... + // + // with + // + // \n 0 && dojo.loadInit(// etc... + // + // Which results in the dojo.loadInit from *not* being applied. This design goes a long way towards protecting the + // code from an over-agressive removeCommentRe. However... + // + // WARNING: the removeCommentRe will cause an error if a detected comment removes all or part of a legacy-loader application + // that is not in a comment. + + var match, startSearch, startApplication, application, + loadInitApplications = [], + otherApplications = [], + allApplications = []; + + // noCommentText may be provided by a build app with comments extracted by a better method than regex (hopefully) + noCommentText = noCommentText || text.replace(removeCommentRe, function(match){ + // remove iff the detected comment has text that looks like a sync loader API application; this helps by + // removing as little as possible, minimizing the changes the janky regex will kill the module + syncLoaderApiRe.lastIndex = amdLoaderApiRe.lastIndex = 0; + return (syncLoaderApiRe.test(match) || amdLoaderApiRe.test(match)) ? "" : match; + }); - var _sumAncestorProperties = function(node, prop){ - if(!(node = (node||0).parentNode)){return 0;} - var val, retVal = 0, _b = d.body(); - while(node && node.style){ - if(gcs(node).position == "fixed"){ + // find and extract all dojo.loadInit applications + while((match = syncLoaderApiRe.exec(noCommentText))){ + startSearch = syncLoaderApiRe.lastIndex; + startApplication = startSearch - match[0].length; + application = extractApplication(noCommentText, startSearch, startApplication); + if(match[2]=="loadInit"){ + loadInitApplications.push(application[0]); + }else{ + otherApplications.push(application[0]); + } + syncLoaderApiRe.lastIndex = application[1]; + } + allApplications = loadInitApplications.concat(otherApplications); + if(allApplications.length || !amdLoaderApiRe.test(noCommentText)){ + // either there were some legacy loader API applications or there were no AMD API applications + return [text.replace(/(^|\s)dojo\.loadInit\s*\(/g, "\n0 && dojo.loadInit("), allApplications.join(""), allApplications]; + }else{ + // legacy loader API *was not* detected and AMD API *was* detected; therefore, assume it's an AMD module return 0; } - val = node[prop]; - if(val){ - retVal += val - 0; - // opera and khtml #body & #html has the same values, we only - // need one value - if(node == _b){ break; } + }, + + transformToAmd = function(module, text){ + // This is roughly the equivalent of dojo._xdCreateResource in 1.6-; however, it expresses a v1.6- dojo + // module in terms of AMD define instead of creating the dojo proprietary xdomain module expression. + // The module could have originated from several sources: + // + // * amd require() a module, e.g., require(["my/module"]) + // * amd require() a nonmodule, e.g., require(["my/resource.js"') + // * amd define() deps vector (always a module) + // * dojo.require() a module, e.g. dojo.require("my.module") + // * dojo.require() a nonmodule, e.g., dojo.require("my.module", true) + // * dojo.requireIf/requireAfterIf/platformRequire a module + // + // The module is scanned for legacy loader API applications; if none are found, then assume the module is an + // AMD module and return 0. Otherwise, a synthetic dojo/loadInit plugin resource is created and the module text + // is rewritten as an AMD module with the single dependency of this synthetic resource. When the dojo/loadInit + // plugin loaded the synthetic resource, it will cause all dojo.loadInit's to be executed, find all dojo.require's + // (either directly consequent to dojo.require or indirectly consequent to dojo.require[After]If or + // dojo.platformRequire, and finally cause loading of all dojo.required modules with the dojo/require plugin. Thus, + // when the dojo/loadInit plugin reports it has been loaded, all modules required by the given module are guaranteed + // loaded (but not executed). This then allows the module to execute it's code path without interupts, thereby + // following the synchronous code path. + + var extractResult, id, names = [], namesAsStrings = []; + if(buildDetectRe.test(text) || !(extractResult = extractLegacyApiApplications(text))){ + // buildDetectRe.test(text) => a built module, always AMD + // extractResult==0 => no sync API + return 0; } - node = node.parentNode; - } - return retVal; // integer - }; - dojo._docScroll = function(){ - var n = d.global; - return "pageXOffset" in n - ? { x:n.pageXOffset, y:n.pageYOffset } - : (n = d.isQuirks? d.doc.body : d.doc.documentElement, { x:d._fixIeBiDiScrollLeft(n.scrollLeft || 0), y:n.scrollTop || 0 }); - }; + // manufacture a synthetic module id that can never be a real mdule id (just like require does) + id = module.mid + "-*loadInit"; - dojo._isBodyLtr = function(){ - return "_bodyLtr" in d? d._bodyLtr : - d._bodyLtr = (d.body().dir || d.doc.documentElement.dir || "ltr").toLowerCase() == "ltr"; // Boolean - }; + // construct the dojo/loadInit names vector which causes any relocated names to be defined as lexical variables under their not-relocated name + // the dojo/loadInit plugin assumes the first name in names is "dojo" - dojo._getIeDocumentElementOffset = function(){ - // summary: - // returns the offset in x and y from the document body to the - // visual edge of the page - // description: - // The following values in IE contain an offset: - // | event.clientX - // | event.clientY - // | node.getBoundingClientRect().left - // | node.getBoundingClientRect().top - // But other position related values do not contain this offset, - // such as node.offsetLeft, node.offsetTop, node.style.left and - // node.style.top. The offset is always (2, 2) in LTR direction. - // When the body is in RTL direction, the offset counts the width - // of left scroll bar's width. This function computes the actual - // offset. + for(var p in getModule("dojo", module).result.scopeMap){ + names.push(p); + namesAsStrings.push('"' + p + '"'); + } - //NOTE: assumes we're being called in an IE browser + // rewrite the module as a synthetic dojo/loadInit plugin resource + the module expressed as an AMD module that depends on this synthetic resource + return "// xdomain rewrite of " + module.path + "\n" + + "define('" + id + "',{\n" + + "\tnames:" + dojo.toJson(names) + ",\n" + + "\tdef:function(" + names.join(",") + "){" + extractResult[1] + "}" + + "});\n\n" + + "define(" + dojo.toJson(names.concat(["dojo/loadInit!"+id])) + ", function(" + names.join(",") + "){\n" + extractResult[0] + "});"; + }, - var de = d.doc.documentElement; // only deal with HTML element here, _abs handles body/quirks + loaderVars = require.initSyncLoader(dojoRequirePlugin, checkDojoRequirePlugin, transformToAmd), - if(d.isIE < 8){ - var r = de.getBoundingClientRect(); // works well for IE6+ - //console.debug('rect left,top = ' + r.left+','+r.top + ', html client left/top = ' + de.clientLeft+','+de.clientTop + ', rtl = ' + (!d._isBodyLtr()) + ', quirks = ' + d.isQuirks); - var l = r.left, - t = r.top; - if(d.isIE < 7){ - l += de.clientLeft; // scrollbar size in strict/RTL, or, - t += de.clientTop; // HTML border size in strict - } - return { - x: l < 0? 0 : l, // FRAME element border size can lead to inaccurate negative values - y: t < 0? 0 : t - }; - }else{ - return { - x: 0, - y: 0 - }; - } + sync = + loaderVars.sync, - }; - - dojo._fixIeBiDiScrollLeft = function(/*Integer*/ scrollLeft){ - // In RTL direction, scrollLeft should be a negative value, but IE - // returns a positive one. All codes using documentElement.scrollLeft - // must call this function to fix this error, otherwise the position - // will offset to right when there is a horizontal scrollbar. + xd = + loaderVars.xd, - var ie = d.isIE; - if(ie && !d._isBodyLtr()){ - var qk = d.isQuirks, - de = qk ? d.doc.body : d.doc.documentElement; - if(ie == 6 && !qk && d.global.frameElement && de.scrollHeight > de.clientHeight){ - scrollLeft += de.clientLeft; // workaround ie6+strict+rtl+iframe+vertical-scrollbar bug where clientWidth is too small by clientLeft pixels - } - return (ie < 8 || qk) ? (scrollLeft + de.clientWidth - de.scrollWidth) : -scrollLeft; // Integer - } - return scrollLeft; // Integer - }; + arrived = + loaderVars.arrived, - // FIXME: need a setter for coords or a moveTo!! - dojo._abs = dojo.position = function(/*DomNode*/node, /*Boolean?*/includeScroll){ - // summary: - // Gets the position and size of the passed element relative to - // the viewport (if includeScroll==false), or relative to the - // document root (if includeScroll==true). - // - // description: - // Returns an object of the form: - // { x: 100, y: 300, w: 20, h: 15 } - // If includeScroll==true, the x and y values will include any - // document offsets that may affect the position relative to the - // viewport. - // Uses the border-box model (inclusive of border and padding but - // not margin). Does not act as a setter. + nonmodule = + loaderVars.nonmodule, - node = byId(node); - var db = d.body(), - dh = db.parentNode, - ret = node.getBoundingClientRect(); - ret = { x: ret.left, y: ret.top, w: ret.right - ret.left, h: ret.bottom - ret.top }; - if(d.isIE){ - // On IE there's a 2px offset that we need to adjust for, see _getIeDocumentElementOffset() - var offset = d._getIeDocumentElementOffset(); - - // fixes the position in IE, quirks mode - ret.x -= offset.x + (d.isQuirks ? db.clientLeft+db.offsetLeft : 0); - ret.y -= offset.y + (d.isQuirks ? db.clientTop+db.offsetTop : 0); - }else if(d.isFF == 3){ - // In FF3 you have to subtract the document element margins. - // Fixed in FF3.5 though. - var cs = gcs(dh); - ret.x -= px(dh, cs.marginLeft) + px(dh, cs.borderLeftWidth); - ret.y -= px(dh, cs.marginTop) + px(dh, cs.borderTopWidth); + executing = + loaderVars.executing, + + executed = + loaderVars.executed, + + syncExecStack = + loaderVars.syncExecStack, + + modules = + loaderVars.modules, + + execQ = + loaderVars.execQ, + + getModule = + loaderVars.getModule, + + injectModule = + loaderVars.injectModule, + + setArrived = + loaderVars.setArrived, + + signal = + loaderVars.signal, + + finishExec = + loaderVars.finishExec, + + execModule = + loaderVars.execModule, + + getLegacyMode = + loaderVars.getLegacyMode; + + dojo.provide = function(mid){ + var executingModule = syncExecStack[0], + module = lang.mixin(getModule(slashName(mid), require.module), { + executed:executing, + result:lang.getObject(mid, true) + }); + setArrived(module); + if(executingModule){ + (executingModule.provides || (executingModule.provides = [])).push(function(){ + module.result = lang.getObject(mid); + delete module.provides; + module.executed!==executed && finishExec(module); + }); + }// else dojo.provide called not consequent to loading; therefore, give up trying to publish module value to loader namespace + return module.result; + }; + + has.add("config-publishRequireResult", 1, 0, 0); + + dojo.require = function(moduleName, omitModuleCheck) { + // summary: + // loads a Javascript module from the appropriate URI + // + // moduleName: String + // module name to load, using periods for separators, + // e.g. "dojo.date.locale". Module paths are de-referenced by dojo's + // internal mapping of locations to names and are disambiguated by + // longest prefix. See `dojo.registerModulePath()` for details on + // registering new modules. + // + // omitModuleCheck: Boolean? + // if `true`, omitModuleCheck skips the step of ensuring that the + // loaded file actually defines the symbol it is referenced by. + // For example if it called as `dojo.require("a.b.c")` and the + // file located at `a/b/c.js` does not define an object `a.b.c`, + // and exception will be throws whereas no exception is raised + // when called as `dojo.require("a.b.c", true)` + // + // description: + // Modules are loaded via dojo.require by using one of two loaders: the normal loader + // and the xdomain loader. The xdomain loader is used when dojo was built with a + // custom build that specified loader=xdomain and the module lives on a modulePath + // that is a whole URL, with protocol and a domain. The versions of Dojo that are on + // the Google and AOL CDNs use the xdomain loader. + // + // If the module is loaded via the xdomain loader, it is an asynchronous load, since + // the module is added via a dynamically created script tag. This + // means that dojo.require() can return before the module has loaded. However, this + // should only happen in the case where you do dojo.require calls in the top-level + // HTML page, or if you purposely avoid the loader checking for dojo.require + // dependencies in your module by using a syntax like dojo["require"] to load the module. + // + // Sometimes it is useful to not have the loader detect the dojo.require calls in the + // module so that you can dynamically load the modules as a result of an action on the + // page, instead of right at module load time. + // + // Also, for script blocks in an HTML page, the loader does not pre-process them, so + // it does not know to download the modules before the dojo.require calls occur. + // + // So, in those two cases, when you want on-the-fly module loading or for script blocks + // in the HTML page, special care must be taken if the dojo.required code is loaded + // asynchronously. To make sure you can execute code that depends on the dojo.required + // modules, be sure to add the code that depends on the modules in a dojo.addOnLoad() + // callback. dojo.addOnLoad waits for all outstanding modules to finish loading before + // executing. + // + // This type of syntax works with both xdomain and normal loaders, so it is good + // practice to always use this idiom for on-the-fly code loading and in HTML script + // blocks. If at some point you change loaders and where the code is loaded from, + // it will all still work. + // + // More on how dojo.require + // `dojo.require("A.B")` first checks to see if symbol A.B is + // defined. If it is, it is simply returned (nothing to do). + // + // If it is not defined, it will look for `A/B.js` in the script root + // directory. + // + // `dojo.require` throws an exception if it cannot find a file + // to load, or if the symbol `A.B` is not defined after loading. + // + // It returns the object `A.B`, but note the caveats above about on-the-fly loading and + // HTML script blocks when the xdomain loader is loading a module. + // + // `dojo.require()` does nothing about importing symbols into + // the current namespace. It is presumed that the caller will + // take care of that. + // + // example: + // To use dojo.require in conjunction with dojo.ready: + // + // | dojo.require("foo"); + // | dojo.require("bar"); + // | dojo.addOnLoad(function(){ + // | //you can now safely do something with foo and bar + // | }); + // + // example: + // For example, to import all symbols into a local block, you might write: + // + // | with (dojo.require("A.B")) { + // | ... + // | } + // + // And to import just the leaf symbol to a local variable: + // + // | var B = dojo.require("A.B"); + // | ... + // + // returns: + // the required namespace object + function doRequire(mid, omitModuleCheck){ + var module = getModule(slashName(mid), require.module); + if(syncExecStack.length && syncExecStack[0].finish){ + // switched to async loading in the middle of evaluating a legacy module; stop + // applying dojo.require so the remaining dojo.requires are applied in order + syncExecStack[0].finish.push(mid); + return undefined; + } + + // recall module.executed has values {0, executing, executed}; therefore, truthy indicates executing or executed + if(module.executed){ + return module.result; + } + omitModuleCheck && (module.result = nonmodule); + + var currentMode = getLegacyMode(); + + // recall, in sync mode to inject is to *eval* the module text + // if the module is a legacy module, this is the same as executing + // but if the module is an AMD module, this means defining, not executing + injectModule(module); + // the inject may have changed the mode + currentMode = getLegacyMode(); + + // in sync mode to dojo.require is to execute + if(module.executed!==executed && module.injected===arrived){ + // the module was already here before injectModule was called probably finishing up a xdomain + // load, but maybe a module given to the loader directly rather than having the loader retrieve it + loaderVars.holdIdle(); + execModule(module); + loaderVars.releaseIdle(); + } + if(module.executed){ + return module.result; + } + + if(currentMode==sync){ + // the only way to get here is in sync mode and dojo.required a module that + // * was loaded async in the injectModule application a few lines up + // * was an AMD module that had deps that are being loaded async and therefore couldn't execute + if(module.cjs){ + // the module was an AMD module; unshift, not push, which causes the current traversal to be reattempted from the top + execQ.unshift(module); + }else{ + // the module was a legacy module + syncExecStack.length && (syncExecStack[0].finish= [mid]); + } + }else{ + // the loader wasn't in sync mode on entry; probably async mode; therefore, no expectation of getting + // the module value synchronously; make sure it gets executed though + execQ.push(module); } - // account for document scrolling - if(includeScroll){ - var scroll = d._docScroll(); - ret.x += scroll.x; - ret.y += scroll.y; + return undefined; } - return ret; // Object + var result = doRequire(moduleName, omitModuleCheck); + if(has("config-publishRequireResult") && !lang.exists(moduleName) && result!==undefined){ + lang.setObject(moduleName, result); + } + return result; }; - dojo.coords = function(/*DomNode|String*/node, /*Boolean?*/includeScroll){ + dojo.loadInit = function(f) { + f(); + }; + + dojo.registerModulePath = function(/*String*/moduleName, /*String*/prefix){ // summary: - // Deprecated: Use position() for border-box x/y/w/h - // or marginBox() for margin-box w/h/l/t. - // Returns an object representing a node's size and position. - // + // Maps a module name to a path // description: - // Returns an object that measures margin-box (w)idth/(h)eight - // and absolute position x/y of the border-box. Also returned - // is computed (l)eft and (t)op values in pixels from the - // node's offsetParent as returned from marginBox(). - // Return value will be in the form: - //| { l: 50, t: 200, w: 300: h: 150, x: 100, y: 300 } - // Does not act as a setter. If includeScroll is passed, the x and - // y params are affected as one would expect in dojo.position(). - var n = byId(node), s = gcs(n), mb = d._getMarginBox(n, s); - var abs = d.position(n, includeScroll); - mb.x = abs.x; - mb.y = abs.y; - return mb; + // An unregistered module is given the default path of ../[module], + // relative to Dojo root. For example, module acme is mapped to + // ../acme. If you want to use a different module name, use + // dojo.registerModulePath. + // example: + // If your dojo.js is located at this location in the web root: + // | /myapp/js/dojo/dojo/dojo.js + // and your modules are located at: + // | /myapp/js/foo/bar.js + // | /myapp/js/foo/baz.js + // | /myapp/js/foo/thud/xyzzy.js + // Your application can tell Dojo to locate the "foo" namespace by calling: + // | dojo.registerModulePath("foo", "../../foo"); + // At which point you can then use dojo.require() to load the + // modules (assuming they provide() the same things which are + // required). The full code might be: + // | + // | + + var paths = {}; + paths[moduleName.replace(/\./g, "/")] = prefix; + require({paths:paths}); }; - // ============================= - // Element attribute Functions - // ============================= + dojo.platformRequire = function(/*Object*/modMap){ + // summary: + // require one or more modules based on which host environment + // Dojo is currently operating in + // description: + // This method takes a "map" of arrays which one can use to + // optionally load dojo modules. The map is indexed by the + // possible dojo.name_ values, with two additional values: + // "default" and "common". The items in the "default" array will + // be loaded if none of the other items have been choosen based on + // dojo.name_, set by your host environment. The items in the + // "common" array will *always* be loaded, regardless of which + // list is chosen. + // example: + // | dojo.platformRequire({ + // | browser: [ + // | "foo.sample", // simple module + // | "foo.test", + // | ["foo.bar.baz", true] // skip object check in _loadModule (dojo.require) + // | ], + // | default: [ "foo.sample._base" ], + // | common: [ "important.module.common" ] + // | }); - // dojo.attr() should conform to http://www.w3.org/TR/DOM-Level-2-Core/ + var result = (modMap.common || []).concat(modMap[dojo._name] || modMap["default"] || []), + temp; + while(result.length){ + if(lang.isArray(temp = result.shift())){ + dojo.require.apply(dojo, temp); + }else{ + dojo.require(temp); + } + } + }; - var _propNames = { - // properties renamed to avoid clashes with reserved words - "class": "className", - "for": "htmlFor", - // properties written as camelCase - tabindex: "tabIndex", - readonly: "readOnly", - colspan: "colSpan", - frameborder: "frameBorder", - rowspan: "rowSpan", - valuetype: "valueType" - }, - _attrNames = { - // original attribute names - classname: "class", - htmlfor: "for", - // for IE - tabindex: "tabIndex", - readonly: "readOnly" - }, - _forcePropNames = { - innerHTML: 1, - className: 1, - htmlFor: d.isIE, - value: 1 - }; + dojo.requireIf = dojo.requireAfterIf = function(/*Boolean*/ condition, /*String*/ moduleName, /*Boolean?*/omitModuleCheck){ + // summary: + // If the condition is true then call `dojo.require()` for the specified + // resource + // + // example: + // | dojo.requireIf(dojo.isBrowser, "my.special.Module"); - var _fixAttrName = function(/*String*/ name){ - return _attrNames[name.toLowerCase()] || name; + if(condition){ + dojo.require(moduleName, omitModuleCheck); + } }; - var _hasAttr = function(node, name){ - var attr = node.getAttributeNode && node.getAttributeNode(name); - return attr && attr.specified; // Boolean + dojo.requireLocalization = function(/*String*/moduleName, /*String*/bundleName, /*String?*/locale){ + require(["../i18n"], function(i18n){ + i18n.getLocalization(moduleName, bundleName, locale); + }); + }; + + return { + extractLegacyApiApplications:extractLegacyApiApplications, + require:loaderVars.dojoRequirePlugin, + loadInit:dojoLoadInitPlugin + }; +}); + +}, +'dojo/json':function(){ +define(["./has"], function(has){ + "use strict"; + var hasJSON = typeof JSON != "undefined"; + has.add("json-parse", hasJSON); // all the parsers work fine + // Firefox 3.5/Gecko 1.9 fails to use replacer in stringify properly https://bugzilla.mozilla.org/show_bug.cgi?id=509184 + has.add("json-stringify", hasJSON && JSON.stringify({a:0}, function(k,v){return v||1;}) == '{"a":1}'); + if(has("json-stringify")){ + return JSON; + } + else{ + var escapeString = function(/*String*/str){ + //summary: + // Adds escape sequences for non-visual characters, double quote and + // backslash and surrounds with double quotes to form a valid string + // literal. + return ('"' + str.replace(/(["\\])/g, '\\$1') + '"'). + replace(/[\f]/g, "\\f").replace(/[\b]/g, "\\b").replace(/[\n]/g, "\\n"). + replace(/[\t]/g, "\\t").replace(/[\r]/g, "\\r"); // string + }; + return { + parse: has("json-parse") ? JSON.parse : function(str, strict){ + // summary: + // Parses a [JSON](http://json.org) string to return a JavaScript object. + // description: + // This function follows [native JSON API](https://developer.mozilla.org/en/JSON) + // Throws for invalid JSON strings. This delegates to eval() if native JSON + // support is not available. By default this will evaluate any valid JS expression. + // With the strict parameter set to true, the parser will ensure that only + // valid JSON strings are parsed (otherwise throwing an error). Without the strict + // parameter, the content passed to this method must come + // from a trusted source. + // str: + // a string literal of a JSON item, for instance: + // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'` + // strict: + // When set to true, this will ensure that only valid, secure JSON is ever parsed. + // Make sure this is set to true for untrusted content. Note that on browsers/engines + // without native JSON support, setting this to true will run slower. + if(strict && !/^([\s\[\{]*(?:"(?:\\.|[^"])+"|-?\d[\d\.]*(?:[Ee][+-]?\d+)?|null|true|false|)[\s\]\}]*(?:,|:|$))+$/.test(str)){ + throw new SyntaxError("Invalid characters in JSON"); + } + return eval('(' + str + ')'); + }, + stringify: function(value, replacer, spacer){ + // summary: + // Returns a [JSON](http://json.org) serialization of an object. + // description: + // Returns a [JSON](http://json.org) serialization of an object. + // This function follows [native JSON API](https://developer.mozilla.org/en/JSON) + // Note that this doesn't check for infinite recursion, so don't do that! + // value: + // A value to be serialized. + // replacer: + // A replacer function that is called for each value and can return a replacement + // spacer: + // A spacer string to be used for pretty printing of JSON + // + // example: + // simple serialization of a trivial object + // | define(["dojo/json"], function(JSON){ + // | var jsonStr = JSON.stringify({ howdy: "stranger!", isStrange: true }); + // | doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr); + var undef; + if(typeof replacer == "string"){ + spacer = replacer; + replacer = null; + } + function stringify(it, indent, key){ + if(replacer){ + it = replacer(key, it); + } + var val, objtype = typeof it; + if(objtype == "number"){ + return isFinite(it) ? it + "" : "null"; + } + if(objtype == "boolean"){ + return it + ""; + } + if(it === null){ + return "null"; + } + if(typeof it == "string"){ + return escapeString(it); + } + if(objtype == "function" || objtype == "undefined"){ + return undef; // undefined + } + // short-circuit for objects that support "json" serialization + // if they return "self" then just pass-through... + if(typeof it.toJSON == "function"){ + return stringify(it.toJSON(key), indent, key); + } + if(it instanceof Date){ + return '"{FullYear}-{Month+}-{Date}T{Hours}:{Minutes}:{Seconds}Z"'.replace(/\{(\w+)(\+)?\}/g, function(t, prop, plus){ + var num = it["getUTC" + prop]() + (plus ? 1 : 0); + return num < 10 ? "0" + num : num; + }); + } + if(it.valueOf() !== it){ + // primitive wrapper, try again unwrapped: + return stringify(it.valueOf(), indent, key); + } + var nextIndent= spacer ? (indent + spacer) : ""; + /* we used to test for DOM nodes and throw, but FF serializes them as {}, so cross-browser consistency is probably not efficiently attainable */ + + var sep = spacer ? " " : ""; + var newLine = spacer ? "\n" : ""; + + // array + if(it instanceof Array){ + var itl = it.length, res = []; + for(key = 0; key < itl; key++){ + var obj = it[key]; + val = stringify(obj, nextIndent, key); + if(typeof val != "string"){ + val = "null"; + } + res.push(newLine + nextIndent + val); + } + return "[" + res.join(",") + newLine + indent + "]"; + } + // generic object code path + var output = []; + for(key in it){ + var keyStr; + if(typeof key == "number"){ + keyStr = '"' + key + '"'; + }else if(typeof key == "string"){ + keyStr = escapeString(key); + }else{ + // skip non-string or number keys + continue; + } + val = stringify(it[key], nextIndent, key); + if(typeof val != "string"){ + // skip non-serializable values + continue; + } + // At this point, the most non-IE browsers don't get in this branch + // (they have native JSON), so push is definitely the way to + output.push(newLine + nextIndent + keyStr + ":" + sep + val); + } + return "{" + output.join(",") + newLine + indent + "}"; // String + } + return stringify(value, "", ""); + } + }; + } +}); + +}, +'dojo/_base/declare':function(){ +define(["./kernel", "../has", "./lang"], function(dojo, has, lang){ + // module: + // dojo/_base/declare + // summary: + // This module defines dojo.declare. + + var mix = lang.mixin, op = Object.prototype, opts = op.toString, + xtor = new Function, counter = 0, cname = "constructor"; + + function err(msg, cls){ throw new Error("declare" + (cls ? " " + cls : "") + ": " + msg); } + + // C3 Method Resolution Order (see http://www.python.org/download/releases/2.3/mro/) + function c3mro(bases, className){ + var result = [], roots = [{cls: 0, refs: []}], nameMap = {}, clsCount = 1, + l = bases.length, i = 0, j, lin, base, top, proto, rec, name, refs; + + // build a list of bases naming them if needed + for(; i < l; ++i){ + base = bases[i]; + if(!base){ + err("mixin #" + i + " is unknown. Did you use dojo.require to pull it in?", className); + }else if(opts.call(base) != "[object Function]"){ + err("mixin #" + i + " is not a callable constructor.", className); + } + lin = base._meta ? base._meta.bases : [base]; + top = 0; + // add bases to the name map + for(j = lin.length - 1; j >= 0; --j){ + proto = lin[j].prototype; + if(!proto.hasOwnProperty("declaredClass")){ + proto.declaredClass = "uniqName_" + (counter++); + } + name = proto.declaredClass; + if(!nameMap.hasOwnProperty(name)){ + nameMap[name] = {count: 0, refs: [], cls: lin[j]}; + ++clsCount; + } + rec = nameMap[name]; + if(top && top !== rec){ + rec.refs.push(top); + ++top.count; + } + top = rec; + } + ++top.count; + roots[0].refs.push(top); + } + + // remove classes without external references recursively + while(roots.length){ + top = roots.pop(); + result.push(top.cls); + --clsCount; + // optimization: follow a single-linked chain + while(refs = top.refs, refs.length == 1){ + top = refs[0]; + if(!top || --top.count){ + // branch or end of chain => do not end to roots + top = 0; + break; + } + result.push(top.cls); + --clsCount; + } + if(top){ + // branch + for(i = 0, l = refs.length; i < l; ++i){ + top = refs[i]; + if(!--top.count){ + roots.push(top); + } + } + } + } + if(clsCount){ + err("can't build consistent linearization", className); + } + + // calculate the superclass offset + base = bases[0]; + result[0] = base ? + base._meta && base === result[result.length - base._meta.bases.length] ? + base._meta.bases.length : 1 : 0; + + return result; + } + + function inherited(args, a, f){ + var name, chains, bases, caller, meta, base, proto, opf, pos, + cache = this._inherited = this._inherited || {}; + + // crack arguments + if(typeof args == "string"){ + name = args; + args = a; + a = f; + } + f = 0; + + caller = args.callee; + name = name || caller.nom; + if(!name){ + err("can't deduce a name to call inherited()", this.declaredClass); + } + + meta = this.constructor._meta; + bases = meta.bases; + + pos = cache.p; + if(name != cname){ + // method + if(cache.c !== caller){ + // cache bust + pos = 0; + base = bases[0]; + meta = base._meta; + if(meta.hidden[name] !== caller){ + // error detection + chains = meta.chains; + if(chains && typeof chains[name] == "string"){ + err("calling chained method with inherited: " + name, this.declaredClass); + } + // find caller + do{ + meta = base._meta; + proto = base.prototype; + if(meta && (proto[name] === caller && proto.hasOwnProperty(name) || meta.hidden[name] === caller)){ + break; + } + }while(base = bases[++pos]); // intentional assignment + pos = base ? pos : -1; + } + } + // find next + base = bases[++pos]; + if(base){ + proto = base.prototype; + if(base._meta && proto.hasOwnProperty(name)){ + f = proto[name]; + }else{ + opf = op[name]; + do{ + proto = base.prototype; + f = proto[name]; + if(f && (base._meta ? proto.hasOwnProperty(name) : f !== opf)){ + break; + } + }while(base = bases[++pos]); // intentional assignment + } + } + f = base && f || op[name]; + }else{ + // constructor + if(cache.c !== caller){ + // cache bust + pos = 0; + meta = bases[0]._meta; + if(meta && meta.ctor !== caller){ + // error detection + chains = meta.chains; + if(!chains || chains.constructor !== "manual"){ + err("calling chained constructor with inherited", this.declaredClass); + } + // find caller + while(base = bases[++pos]){ // intentional assignment + meta = base._meta; + if(meta && meta.ctor === caller){ + break; + } + } + pos = base ? pos : -1; + } + } + // find next + while(base = bases[++pos]){ // intentional assignment + meta = base._meta; + f = meta ? meta.ctor : base; + if(f){ + break; + } + } + f = base && f; + } + + // cache the found super method + cache.c = f; + cache.p = pos; + + // now we have the result + if(f){ + return a === true ? f : f.apply(this, a || args); + } + // intentionally no return if a super method was not found + } + + function getInherited(name, args){ + if(typeof name == "string"){ + return this.__inherited(name, args, true); + } + return this.__inherited(name, true); + } + + function inherited__debug(args, a1, a2){ + var f = this.getInherited(args, a1); + if(f){ return f.apply(this, a2 || a1 || args); } + // intentionally no return if a super method was not found + } + + var inheritedImpl = dojo.config.isDebug ? inherited__debug : inherited; + + // emulation of "instanceof" + function isInstanceOf(cls){ + var bases = this.constructor._meta.bases; + for(var i = 0, l = bases.length; i < l; ++i){ + if(bases[i] === cls){ + return true; + } + } + return this instanceof cls; + } + + function mixOwn(target, source){ + // add props adding metadata for incoming functions skipping a constructor + for(var name in source){ + if(name != cname && source.hasOwnProperty(name)){ + target[name] = source[name]; + } + } + if(has("bug-for-in-skips-shadowed")){ + for(var extraNames= lang._extraNames, i= extraNames.length; i;){ + name = extraNames[--i]; + if(name != cname && source.hasOwnProperty(name)){ + target[name] = source[name]; + } + } + } + } + + // implementation of safe mixin function + function safeMixin(target, source){ + var name, t; + // add props adding metadata for incoming functions skipping a constructor + for(name in source){ + t = source[name]; + if((t !== op[name] || !(name in op)) && name != cname){ + if(opts.call(t) == "[object Function]"){ + // non-trivial function method => attach its name + t.nom = name; + } + target[name] = t; + } + } + if(has("bug-for-in-skips-shadowed")){ + for(var extraNames= lang._extraNames, i= extraNames.length; i;){ + name = extraNames[--i]; + t = source[name]; + if((t !== op[name] || !(name in op)) && name != cname){ + if(opts.call(t) == "[object Function]"){ + // non-trivial function method => attach its name + t.nom = name; + } + target[name] = t; + } + } + } + return target; + } + + function extend(source){ + declare.safeMixin(this.prototype, source); + return this; + } + + // chained constructor compatible with the legacy dojo.declare() + function chainedConstructor(bases, ctorSpecial){ + return function(){ + var a = arguments, args = a, a0 = a[0], f, i, m, + l = bases.length, preArgs; + + if(!(this instanceof a.callee)){ + // not called via new, so force it + return applyNew(a); + } + + //this._inherited = {}; + // perform the shaman's rituals of the original dojo.declare() + // 1) call two types of the preamble + if(ctorSpecial && (a0 && a0.preamble || this.preamble)){ + // full blown ritual + preArgs = new Array(bases.length); + // prepare parameters + preArgs[0] = a; + for(i = 0;;){ + // process the preamble of the 1st argument + a0 = a[0]; + if(a0){ + f = a0.preamble; + if(f){ + a = f.apply(this, a) || a; + } + } + // process the preamble of this class + f = bases[i].prototype; + f = f.hasOwnProperty("preamble") && f.preamble; + if(f){ + a = f.apply(this, a) || a; + } + // one peculiarity of the preamble: + // it is called if it is not needed, + // e.g., there is no constructor to call + // let's watch for the last constructor + // (see ticket #9795) + if(++i == l){ + break; + } + preArgs[i] = a; + } + } + // 2) call all non-trivial constructors using prepared arguments + for(i = l - 1; i >= 0; --i){ + f = bases[i]; + m = f._meta; + f = m ? m.ctor : f; + if(f){ + f.apply(this, preArgs ? preArgs[i] : a); + } + } + // 3) continue the original ritual: call the postscript + f = this.postscript; + if(f){ + f.apply(this, args); + } + }; + } + + + // chained constructor compatible with the legacy dojo.declare() + function singleConstructor(ctor, ctorSpecial){ + return function(){ + var a = arguments, t = a, a0 = a[0], f; + + if(!(this instanceof a.callee)){ + // not called via new, so force it + return applyNew(a); + } + + //this._inherited = {}; + // perform the shaman's rituals of the original dojo.declare() + // 1) call two types of the preamble + if(ctorSpecial){ + // full blown ritual + if(a0){ + // process the preamble of the 1st argument + f = a0.preamble; + if(f){ + t = f.apply(this, t) || t; + } + } + f = this.preamble; + if(f){ + // process the preamble of this class + f.apply(this, t); + // one peculiarity of the preamble: + // it is called even if it is not needed, + // e.g., there is no constructor to call + // let's watch for the last constructor + // (see ticket #9795) + } + } + // 2) call a constructor + if(ctor){ + ctor.apply(this, a); + } + // 3) continue the original ritual: call the postscript + f = this.postscript; + if(f){ + f.apply(this, a); + } + }; + } + + // plain vanilla constructor (can use inherited() to call its base constructor) + function simpleConstructor(bases){ + return function(){ + var a = arguments, i = 0, f, m; + + if(!(this instanceof a.callee)){ + // not called via new, so force it + return applyNew(a); + } + + //this._inherited = {}; + // perform the shaman's rituals of the original dojo.declare() + // 1) do not call the preamble + // 2) call the top constructor (it can use this.inherited()) + for(; f = bases[i]; ++i){ // intentional assignment + m = f._meta; + f = m ? m.ctor : f; + if(f){ + f.apply(this, a); + break; + } + } + // 3) call the postscript + f = this.postscript; + if(f){ + f.apply(this, a); + } + }; + } + + function chain(name, bases, reversed){ + return function(){ + var b, m, f, i = 0, step = 1; + if(reversed){ + i = bases.length - 1; + step = -1; + } + for(; b = bases[i]; i += step){ // intentional assignment + m = b._meta; + f = (m ? m.hidden : b.prototype)[name]; + if(f){ + f.apply(this, arguments); + } + } + }; + } + + // forceNew(ctor) + // return a new object that inherits from ctor.prototype but + // without actually running ctor on the object. + function forceNew(ctor){ + // create object with correct prototype using a do-nothing + // constructor + xtor.prototype = ctor.prototype; + var t = new xtor; + xtor.prototype = null; // clean up + return t; + } + + // applyNew(args) + // just like 'new ctor()' except that the constructor and its arguments come + // from args, which must be an array or an arguments object + function applyNew(args){ + // create an object with ctor's prototype but without + // calling ctor on it. + var ctor = args.callee, t = forceNew(ctor); + // execute the real constructor on the new object + ctor.apply(t, args); + return t; + } + + function declare(className, superclass, props){ + // crack parameters + if(typeof className != "string"){ + props = superclass; + superclass = className; + className = ""; + } + props = props || {}; + + var proto, i, t, ctor, name, bases, chains, mixins = 1, parents = superclass; + + // build a prototype + if(opts.call(superclass) == "[object Array]"){ + // C3 MRO + bases = c3mro(superclass, className); + t = bases[0]; + mixins = bases.length - t; + superclass = bases[mixins]; + }else{ + bases = [0]; + if(superclass){ + if(opts.call(superclass) == "[object Function]"){ + t = superclass._meta; + bases = bases.concat(t ? t.bases : superclass); + }else{ + err("base class is not a callable constructor.", className); + } + }else if(superclass !== null){ + err("unknown base class. Did you use dojo.require to pull it in?", className); + } + } + if(superclass){ + for(i = mixins - 1;; --i){ + proto = forceNew(superclass); + if(!i){ + // stop if nothing to add (the last base) + break; + } + // mix in properties + t = bases[i]; + (t._meta ? mixOwn : mix)(proto, t.prototype); + // chain in new constructor + ctor = new Function; + ctor.superclass = superclass; + ctor.prototype = proto; + superclass = proto.constructor = ctor; + } + }else{ + proto = {}; + } + // add all properties + declare.safeMixin(proto, props); + // add constructor + t = props.constructor; + if(t !== op.constructor){ + t.nom = cname; + proto.constructor = t; + } + + // collect chains and flags + for(i = mixins - 1; i; --i){ // intentional assignment + t = bases[i]._meta; + if(t && t.chains){ + chains = mix(chains || {}, t.chains); + } + } + if(proto["-chains-"]){ + chains = mix(chains || {}, proto["-chains-"]); + } + + // build ctor + t = !chains || !chains.hasOwnProperty(cname); + bases[0] = ctor = (chains && chains.constructor === "manual") ? simpleConstructor(bases) : + (bases.length == 1 ? singleConstructor(props.constructor, t) : chainedConstructor(bases, t)); + + // add meta information to the constructor + ctor._meta = {bases: bases, hidden: props, chains: chains, + parents: parents, ctor: props.constructor}; + ctor.superclass = superclass && superclass.prototype; + ctor.extend = extend; + ctor.prototype = proto; + proto.constructor = ctor; + + // add "standard" methods to the prototype + proto.getInherited = getInherited; + proto.isInstanceOf = isInstanceOf; + proto.inherited = inheritedImpl; + proto.__inherited = inherited; + + // add name if specified + if(className){ + proto.declaredClass = className; + lang.setObject(className, ctor); + } + + // build chains and add them to the prototype + if(chains){ + for(name in chains){ + if(proto[name] && typeof chains[name] == "string" && name != cname){ + t = proto[name] = chain(name, bases, chains[name] === "after"); + t.nom = name; + } + } + } + // chained methods do not return values + // no need to chain "invisible" functions + + return ctor; // Function + } + + /*===== + dojo.declare = function(className, superclass, props){ + // summary: + // Create a feature-rich constructor from compact notation. + // className: String?: + // The optional name of the constructor (loosely, a "class") + // stored in the "declaredClass" property in the created prototype. + // It will be used as a global name for a created constructor. + // superclass: Function|Function[]: + // May be null, a Function, or an Array of Functions. This argument + // specifies a list of bases (the left-most one is the most deepest + // base). + // props: Object: + // An object whose properties are copied to the created prototype. + // Add an instance-initialization function by making it a property + // named "constructor". + // returns: + // New constructor function. + // description: + // Create a constructor using a compact notation for inheritance and + // prototype extension. + // + // Mixin ancestors provide a type of multiple inheritance. + // Prototypes of mixin ancestors are copied to the new class: + // changes to mixin prototypes will not affect classes to which + // they have been mixed in. + // + // Ancestors can be compound classes created by this version of + // dojo.declare. In complex cases all base classes are going to be + // linearized according to C3 MRO algorithm + // (see http://www.python.org/download/releases/2.3/mro/ for more + // details). + // + // "className" is cached in "declaredClass" property of the new class, + // if it was supplied. The immediate super class will be cached in + // "superclass" property of the new class. + // + // Methods in "props" will be copied and modified: "nom" property + // (the declared name of the method) will be added to all copied + // functions to help identify them for the internal machinery. Be + // very careful, while reusing methods: if you use the same + // function under different names, it can produce errors in some + // cases. + // + // It is possible to use constructors created "manually" (without + // dojo.declare) as bases. They will be called as usual during the + // creation of an instance, their methods will be chained, and even + // called by "this.inherited()". + // + // Special property "-chains-" governs how to chain methods. It is + // a dictionary, which uses method names as keys, and hint strings + // as values. If a hint string is "after", this method will be + // called after methods of its base classes. If a hint string is + // "before", this method will be called before methods of its base + // classes. + // + // If "constructor" is not mentioned in "-chains-" property, it will + // be chained using the legacy mode: using "after" chaining, + // calling preamble() method before each constructor, if available, + // and calling postscript() after all constructors were executed. + // If the hint is "after", it is chained as a regular method, but + // postscript() will be called after the chain of constructors. + // "constructor" cannot be chained "before", but it allows + // a special hint string: "manual", which means that constructors + // are not going to be chained in any way, and programmer will call + // them manually using this.inherited(). In the latter case + // postscript() will be called after the construction. + // + // All chaining hints are "inherited" from base classes and + // potentially can be overridden. Be very careful when overriding + // hints! Make sure that all chained methods can work in a proposed + // manner of chaining. + // + // Once a method was chained, it is impossible to unchain it. The + // only exception is "constructor". You don't need to define a + // method in order to supply a chaining hint. + // + // If a method is chained, it cannot use this.inherited() because + // all other methods in the hierarchy will be called automatically. + // + // Usually constructors and initializers of any kind are chained + // using "after" and destructors of any kind are chained as + // "before". Note that chaining assumes that chained methods do not + // return any value: any returned value will be discarded. + // + // example: + // | dojo.declare("my.classes.bar", my.classes.foo, { + // | // properties to be added to the class prototype + // | someValue: 2, + // | // initialization function + // | constructor: function(){ + // | this.myComplicatedObject = new ReallyComplicatedObject(); + // | }, + // | // other functions + // | someMethod: function(){ + // | doStuff(); + // | } + // | }); + // + // example: + // | var MyBase = dojo.declare(null, { + // | // constructor, properties, and methods go here + // | // ... + // | }); + // | var MyClass1 = dojo.declare(MyBase, { + // | // constructor, properties, and methods go here + // | // ... + // | }); + // | var MyClass2 = dojo.declare(MyBase, { + // | // constructor, properties, and methods go here + // | // ... + // | }); + // | var MyDiamond = dojo.declare([MyClass1, MyClass2], { + // | // constructor, properties, and methods go here + // | // ... + // | }); + // + // example: + // | var F = function(){ console.log("raw constructor"); }; + // | F.prototype.method = function(){ + // | console.log("raw method"); + // | }; + // | var A = dojo.declare(F, { + // | constructor: function(){ + // | console.log("A.constructor"); + // | }, + // | method: function(){ + // | console.log("before calling F.method..."); + // | this.inherited(arguments); + // | console.log("...back in A"); + // | } + // | }); + // | new A().method(); + // | // will print: + // | // raw constructor + // | // A.constructor + // | // before calling F.method... + // | // raw method + // | // ...back in A + // + // example: + // | var A = dojo.declare(null, { + // | "-chains-": { + // | destroy: "before" + // | } + // | }); + // | var B = dojo.declare(A, { + // | constructor: function(){ + // | console.log("B.constructor"); + // | }, + // | destroy: function(){ + // | console.log("B.destroy"); + // | } + // | }); + // | var C = dojo.declare(B, { + // | constructor: function(){ + // | console.log("C.constructor"); + // | }, + // | destroy: function(){ + // | console.log("C.destroy"); + // | } + // | }); + // | new C().destroy(); + // | // prints: + // | // B.constructor + // | // C.constructor + // | // C.destroy + // | // B.destroy + // + // example: + // | var A = dojo.declare(null, { + // | "-chains-": { + // | constructor: "manual" + // | } + // | }); + // | var B = dojo.declare(A, { + // | constructor: function(){ + // | // ... + // | // call the base constructor with new parameters + // | this.inherited(arguments, [1, 2, 3]); + // | // ... + // | } + // | }); + // + // example: + // | var A = dojo.declare(null, { + // | "-chains-": { + // | m1: "before" + // | }, + // | m1: function(){ + // | console.log("A.m1"); + // | }, + // | m2: function(){ + // | console.log("A.m2"); + // | } + // | }); + // | var B = dojo.declare(A, { + // | "-chains-": { + // | m2: "after" + // | }, + // | m1: function(){ + // | console.log("B.m1"); + // | }, + // | m2: function(){ + // | console.log("B.m2"); + // | } + // | }); + // | var x = new B(); + // | x.m1(); + // | // prints: + // | // B.m1 + // | // A.m1 + // | x.m2(); + // | // prints: + // | // A.m2 + // | // B.m2 + return new Function(); // Function }; + =====*/ - // There is a difference in the presence of certain properties and their default values - // between browsers. For example, on IE "disabled" is present on all elements, - // but it is value is "false"; "tabIndex" of
returns 0 by default on IE, yet other browsers - // can return -1. - - dojo.hasAttr = function(/*DomNode|String*/node, /*String*/name){ + /*===== + dojo.safeMixin = function(target, source){ // summary: - // Returns true if the requested attribute is specified on the - // given element, and false otherwise. - // node: - // id or reference to the element to check - // name: - // the name of the attribute - // returns: - // true if the requested attribute is specified on the - // given element, and false otherwise - var lc = name.toLowerCase(); - return _forcePropNames[_propNames[lc] || name] || _hasAttr(byId(node), _attrNames[lc] || name); // Boolean + // Mix in properties skipping a constructor and decorating functions + // like it is done by dojo.declare. + // target: Object + // Target object to accept new properties. + // source: Object + // Source object for new properties. + // description: + // This function is used to mix in properties like lang.mixin does, + // but it skips a constructor property and decorates functions like + // dojo.declare does. + // + // It is meant to be used with classes and objects produced with + // dojo.declare. Functions mixed in with dojo.safeMixin can use + // this.inherited() like normal methods. + // + // This function is used to implement extend() method of a constructor + // produced with dojo.declare(). + // + // example: + // | var A = dojo.declare(null, { + // | m1: function(){ + // | console.log("A.m1"); + // | }, + // | m2: function(){ + // | console.log("A.m2"); + // | } + // | }); + // | var B = dojo.declare(A, { + // | m1: function(){ + // | this.inherited(arguments); + // | console.log("B.m1"); + // | } + // | }); + // | B.extend({ + // | m2: function(){ + // | this.inherited(arguments); + // | console.log("B.m2"); + // | } + // | }); + // | var x = new B(); + // | dojo.safeMixin(x, { + // | m1: function(){ + // | this.inherited(arguments); + // | console.log("X.m1"); + // | }, + // | m2: function(){ + // | this.inherited(arguments); + // | console.log("X.m2"); + // | } + // | }); + // | x.m2(); + // | // prints: + // | // A.m1 + // | // B.m1 + // | // X.m1 }; + =====*/ - var _evtHdlrMap = {}, _ctr = 0, - _attrId = dojo._scopeName + "attrid", - // the next dictionary lists elements with read-only innerHTML on IE - _roInnerHtml = {col: 1, colgroup: 1, - // frameset: 1, head: 1, html: 1, style: 1, - table: 1, tbody: 1, tfoot: 1, thead: 1, tr: 1, title: 1}; - - dojo.attr = function(/*DomNode|String*/node, /*String|Object*/name, /*String?*/value){ + /*===== + Object.inherited = function(name, args, newArgs){ // summary: - // Gets or sets an attribute on an HTML element. + // Calls a super method. + // name: String? + // The optional method name. Should be the same as the caller's + // name. Usually "name" is specified in complex dynamic cases, when + // the calling method was dynamically added, undecorated by + // dojo.declare, and it cannot be determined. + // args: Arguments + // The caller supply this argument, which should be the original + // "arguments". + // newArgs: Object? + // If "true", the found function will be returned without + // executing it. + // If Array, it will be used to call a super method. Otherwise + // "args" will be used. + // returns: + // Whatever is returned by a super method, or a super method itself, + // if "true" was specified as newArgs. // description: - // Handles normalized getting and setting of attributes on DOM - // Nodes. If 2 arguments are passed, and a the second argumnt is a - // string, acts as a getter. + // This method is used inside method of classes produced with + // dojo.declare to call a super method (next in the chain). It is + // used for manually controlled chaining. Consider using the regular + // chaining, because it is faster. Use "this.inherited()" only in + // complex cases. // - // If a third argument is passed, or if the second argument is a - // map of attributes, acts as a setter. + // This method cannot me called from automatically chained + // constructors including the case of a special (legacy) + // constructor chaining. It cannot be called from chained methods. // - // When passing functions as values, note that they will not be - // directly assigned to slots on the node, but rather the default - // behavior will be removed and the new behavior will be added - // using `dojo.connect()`, meaning that event handler properties - // will be normalized and that some caveats with regards to - // non-standard behaviors for onsubmit apply. Namely that you - // should cancel form submission using `dojo.stopEvent()` on the - // passed event object instead of returning a boolean value from - // the handler itself. - // node: - // id or reference to the element to get or set the attribute on - // name: - // the name of the attribute to get or set. - // value: - // The value to set for the attribute - // returns: - // when used as a getter, the value of the requested attribute - // or null if that attribute does not have a specified or - // default value; + // If "this.inherited()" cannot find the next-in-chain method, it + // does nothing and returns "undefined". The last method in chain + // can be a default method implemented in Object, which will be + // called last. // - // when used as a setter, the DOM node + // If "name" is specified, it is assumed that the method that + // received "args" is the parent method for this call. It is looked + // up in the chain list and if it is found the next-in-chain method + // is called. If it is not found, the first-in-chain method is + // called. + // + // If "name" is not specified, it will be derived from the calling + // method (using a methoid property "nom"). // // example: - // | // get the current value of the "foo" attribute on a node - // | dojo.attr(dojo.byId("nodeId"), "foo"); - // | // or we can just pass the id: - // | dojo.attr("nodeId", "foo"); + // | var B = dojo.declare(A, { + // | method1: function(a, b, c){ + // | this.inherited(arguments); + // | }, + // | method2: function(a, b){ + // | return this.inherited(arguments, [a + b]); + // | } + // | }); + // | // next method is not in the chain list because it is added + // | // manually after the class was created. + // | B.prototype.method3 = function(){ + // | console.log("This is a dynamically-added method."); + // | this.inherited("method3", arguments); + // | }; + // example: + // | var B = dojo.declare(A, { + // | method: function(a, b){ + // | var super = this.inherited(arguments, true); + // | // ... + // | if(!super){ + // | console.log("there is no super method"); + // | return 0; + // | } + // | return super.apply(this, arguments); + // | } + // | }); + return {}; // Object + } + =====*/ + + /*===== + Object.getInherited = function(name, args){ + // summary: + // Returns a super method. + // name: String? + // The optional method name. Should be the same as the caller's + // name. Usually "name" is specified in complex dynamic cases, when + // the calling method was dynamically added, undecorated by + // dojo.declare, and it cannot be determined. + // args: Arguments + // The caller supply this argument, which should be the original + // "arguments". + // returns: + // Returns a super method (Function) or "undefined". + // description: + // This method is a convenience method for "this.inherited()". + // It uses the same algorithm but instead of executing a super + // method, it returns it, or "undefined" if not found. // // example: - // | // use attr() to set the tab index - // | dojo.attr("nodeId", "tabIndex", 3); + // | var B = dojo.declare(A, { + // | method: function(a, b){ + // | var super = this.getInherited(arguments); + // | // ... + // | if(!super){ + // | console.log("there is no super method"); + // | return 0; + // | } + // | return super.apply(this, arguments); + // | } + // | }); + return {}; // Object + } + =====*/ + + /*===== + Object.isInstanceOf = function(cls){ + // summary: + // Checks the inheritance chain to see if it is inherited from this + // class. + // cls: Function + // Class constructor. + // returns: + // "true", if this object is inherited from this class, "false" + // otherwise. + // description: + // This method is used with instances of classes produced with + // dojo.declare to determine of they support a certain interface or + // not. It models "instanceof" operator. + // + // example: + // | var A = dojo.declare(null, { + // | // constructor, properties, and methods go here + // | // ... + // | }); + // | var B = dojo.declare(null, { + // | // constructor, properties, and methods go here + // | // ... + // | }); + // | var C = dojo.declare([A, B], { + // | // constructor, properties, and methods go here + // | // ... + // | }); + // | var D = dojo.declare(A, { + // | // constructor, properties, and methods go here + // | // ... + // | }); + // | + // | var a = new A(), b = new B(), c = new C(), d = new D(); + // | + // | console.log(a.isInstanceOf(A)); // true + // | console.log(b.isInstanceOf(A)); // false + // | console.log(c.isInstanceOf(A)); // true + // | console.log(d.isInstanceOf(A)); // true + // | + // | console.log(a.isInstanceOf(B)); // false + // | console.log(b.isInstanceOf(B)); // true + // | console.log(c.isInstanceOf(B)); // true + // | console.log(d.isInstanceOf(B)); // false + // | + // | console.log(a.isInstanceOf(C)); // false + // | console.log(b.isInstanceOf(C)); // false + // | console.log(c.isInstanceOf(C)); // true + // | console.log(d.isInstanceOf(C)); // false // | + // | console.log(a.isInstanceOf(D)); // false + // | console.log(b.isInstanceOf(D)); // false + // | console.log(c.isInstanceOf(D)); // false + // | console.log(d.isInstanceOf(D)); // true + return {}; // Object + } + =====*/ + + /*===== + Object.extend = function(source){ + // summary: + // Adds all properties and methods of source to constructor's + // prototype, making them available to all instances created with + // constructor. This method is specific to constructors created with + // dojo.declare. + // source: Object + // Source object which properties are going to be copied to the + // constructor's prototype. + // description: + // Adds source properties to the constructor's prototype. It can + // override existing properties. // - // example: - // Set multiple values at once, including event handlers: - // | dojo.attr("formId", { - // | "foo": "bar", - // | "tabIndex": -1, - // | "method": "POST", - // | "onsubmit": function(e){ - // | // stop submitting the form. Note that the IE behavior - // | // of returning true or false will have no effect here - // | // since our handler is connect()ed to the built-in - // | // onsubmit behavior and so we need to use - // | // dojo.stopEvent() to ensure that the submission - // | // doesn't proceed. - // | dojo.stopEvent(e); - // | - // | // submit the form with Ajax - // | dojo.xhrPost({ form: "formId" }); - // | } - // | }); + // This method is similar to dojo.extend function, but it is specific + // to constructors produced by dojo.declare. It is implemented + // using dojo.safeMixin, and it skips a constructor property, + // and properly decorates copied functions. // // example: - // Style is s special case: Only set with an object hash of styles - // | dojo.attr("someNode",{ - // | id:"bar", - // | style:{ - // | width:"200px", height:"100px", color:"#000" - // | } + // | var A = dojo.declare(null, { + // | m1: function(){}, + // | s1: "Popokatepetl" + // | }); + // | A.extend({ + // | m1: function(){}, + // | m2: function(){}, + // | f1: true, + // | d1: 42 // | }); - // - // example: - // Again, only set style as an object hash of styles: - // | var obj = { color:"#fff", backgroundColor:"#000" }; - // | dojo.attr("someNode", "style", obj); - // | - // | // though shorter to use `dojo.style()` in this case: - // | dojo.style("someNode", obj); - - node = byId(node); - var args = arguments.length, prop; - if(args == 2 && typeof name != "string"){ // inline'd type check - // the object form of setter: the 2nd argument is a dictionary - for(var x in name){ - d.attr(node, x, name[x]); - } - return node; // DomNode - } - var lc = name.toLowerCase(), - propName = _propNames[lc] || name, - forceProp = _forcePropNames[propName], - attrName = _attrNames[lc] || name; - if(args == 3){ - // setter - do{ - if(propName == "style" && typeof value != "string"){ // inline'd type check - // special case: setting a style - d.style(node, value); - break; - } - if(propName == "innerHTML"){ - // special case: assigning HTML - if(d.isIE && node.tagName.toLowerCase() in _roInnerHtml){ - d.empty(node); - node.appendChild(d._toDom(value, node.ownerDocument)); - }else{ - node[propName] = value; - } - break; - } - if(d.isFunction(value)){ - // special case: assigning an event handler - // clobber if we can - var attrId = d.attr(node, _attrId); - if(!attrId){ - attrId = _ctr++; - d.attr(node, _attrId, attrId); - } - if(!_evtHdlrMap[attrId]){ - _evtHdlrMap[attrId] = {}; - } - var h = _evtHdlrMap[attrId][propName]; - if(h){ - d.disconnect(h); - }else{ - try{ - delete node[propName]; - }catch(e){} - } - // ensure that event objects are normalized, etc. - _evtHdlrMap[attrId][propName] = d.connect(node, propName, value); - break; - } - if(forceProp || typeof value == "boolean"){ - // special case: forcing assignment to the property - // special case: setting boolean to a property instead of attribute - node[propName] = value; - break; - } - // node's attribute - node.setAttribute(attrName, value); - }while(false); - return node; // DomNode - } - // getter - // should we access this attribute via a property or - // via getAttribute()? - value = node[propName]; - if(forceProp && typeof value != "undefined"){ - // node's property - return value; // Anything - } - if(propName != "href" && (typeof value == "boolean" || d.isFunction(value))){ - // node's property - return value; // Anything - } - // node's attribute - // we need _hasAttr() here to guard against IE returning a default value - return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything }; + =====*/ - dojo.removeAttr = function(/*DomNode|String*/ node, /*String*/ name){ - // summary: - // Removes an attribute from an HTML element. - // node: - // id or reference to the element to remove the attribute from - // name: - // the name of the attribute to remove - byId(node).removeAttribute(_fixAttrName(name)); - }; + dojo.safeMixin = declare.safeMixin = safeMixin; + dojo.declare = declare; - dojo.getNodeProp = function(/*DomNode|String*/ node, /*String*/ name){ - // summary: - // Returns an effective value of a property or an attribute. - // node: - // id or reference to the element to remove the attribute from - // name: - // the name of the attribute - node = byId(node); - var lc = name.toLowerCase(), - propName = _propNames[lc] || name; - if((propName in node) && propName != "href"){ - // node's property - return node[propName]; // Anything - } - // node's attribute - var attrName = _attrNames[lc] || name; - return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything - }; + return declare; +}); - dojo.create = function(tag, attrs, refNode, pos){ - // summary: - // Create an element, allowing for optional attribute decoration - // and placement. - // - // description: - // A DOM Element creation function. A shorthand method for creating a node or - // a fragment, and allowing for a convenient optional attribute setting step, - // as well as an optional DOM placement reference. - //| - // Attributes are set by passing the optional object through `dojo.attr`. - // See `dojo.attr` for noted caveats and nuances, and API if applicable. - //| - // Placement is done via `dojo.place`, assuming the new node to be the action - // node, passing along the optional reference node and position. - // - // tag: String|DomNode - // A string of the element to create (eg: "div", "a", "p", "li", "script", "br"), - // or an existing DOM node to process. - // - // attrs: Object - // An object-hash of attributes to set on the newly created node. - // Can be null, if you don't want to set any attributes/styles. - // See: `dojo.attr` for a description of available attributes. - // - // refNode: String?|DomNode? - // Optional reference node. Used by `dojo.place` to place the newly created - // node somewhere in the dom relative to refNode. Can be a DomNode reference - // or String ID of a node. - // - // pos: String? - // Optional positional reference. Defaults to "last" by way of `dojo.place`, - // though can be set to "first","after","before","last", "replace" or "only" - // to further control the placement of the new node relative to the refNode. - // 'refNode' is required if a 'pos' is specified. - // - // returns: DomNode +}, +'dojo/dom':function(){ +define(["./_base/sniff", "./_base/lang", "./_base/window"], + function(has, lang, win){ + // module: + // dojo/dom + // summary: + // This module defines the core dojo DOM API. + + // FIXME: need to add unit tests for all the semi-public methods + + try{ + document.execCommand("BackgroundImageCache", false, true); + }catch(e){ + // sane browsers don't have cache "issues" + } + + // ============================= + // DOM Functions + // ============================= + + /*===== + dojo.byId = function(id, doc){ + // summary: + // Returns DOM node with matching `id` attribute or `null` + // if not found. If `id` is a DomNode, this function is a no-op. // - // example: - // Create a DIV: - // | var n = dojo.create("div"); + // id: String|DOMNode + // A string to match an HTML id attribute or a reference to a DOM Node // - // example: - // Create a DIV with content: - // | var n = dojo.create("div", { innerHTML:"

hi

" }); + // doc: Document? + // Document to work in. Defaults to the current value of + // dojo.doc. Can be used to retrieve + // node references from other documents. // // example: - // Place a new DIV in the BODY, with no attributes set - // | var n = dojo.create("div", null, dojo.body()); + // Look up a node by ID: + // | var n = dojo.byId("foo"); // // example: - // Create an UL, and populate it with LI's. Place the list as the first-child of a - // node with id="someId": - // | var ul = dojo.create("ul", null, "someId", "first"); - // | var items = ["one", "two", "three", "four"]; - // | dojo.forEach(items, function(data){ - // | dojo.create("li", { innerHTML: data }, ul); - // | }); + // Check if a node exists, and use it. + // | var n = dojo.byId("bar"); + // | if(n){ doStuff() ... } // // example: - // Create an anchor, with an href. Place in BODY: - // | dojo.create("a", { href:"foo.html", title:"Goto FOO!" }, dojo.body()); + // Allow string or DomNode references to be passed to a custom function: + // | var foo = function(nodeOrId){ + // | nodeOrId = dojo.byId(nodeOrId); + // | // ... more stuff + // | } + =====*/ + + /*===== + dojo.isDescendant = function(node, ancestor){ + // summary: + // Returns true if node is a descendant of ancestor + // node: DOMNode|String + // string id or node reference to test + // ancestor: DOMNode|String + // string id or node reference of potential parent to test against // // example: - // Create a `dojo.NodeList()` from a new element (for syntatic sugar): - // | dojo.query(dojo.create('div')) - // | .addClass("newDiv") - // | .onclick(function(e){ console.log('clicked', e.target) }) - // | .place("#someNode"); // redundant, but cleaner. - - var doc = d.doc; - if(refNode){ - refNode = byId(refNode); - doc = refNode.ownerDocument; - } - if(typeof tag == "string"){ // inline'd type check - tag = doc.createElement(tag); - } - if(attrs){ d.attr(tag, attrs); } - if(refNode){ d.place(tag, refNode, pos); } - return tag; // DomNode + // Test is node id="bar" is a descendant of node id="foo" + // | if(dojo.isDescendant("bar", "foo")){ ... } }; - - /*===== - dojo.empty = function(node){ - // summary: - // safely removes all children of the node. - // node: DOMNode|String - // a reference to a DOM node or an id. - // example: - // Destroy node's children byId: - // | dojo.empty("someId"); - // - // example: - // Destroy all nodes' children in a list by reference: - // | dojo.query(".someNode").forEach(dojo.empty); - } =====*/ - d.empty = - d.isIE ? function(node){ - node = byId(node); - for(var c; c = node.lastChild;){ // intentional assignment - d.destroy(c); - } - } : - function(node){ - byId(node).innerHTML = ""; - }; + // TODO: do we need this function in the base? /*===== - dojo._toDom = function(frag, doc){ - // summary: - // instantiates an HTML fragment returning the corresponding DOM. - // frag: String - // the HTML fragment - // doc: DocumentNode? - // optional document to use when creating DOM nodes, defaults to - // dojo.doc if not specified. - // returns: DocumentFragment - // - // example: - // Create a table row: - // | var tr = dojo._toDom("First!"); - } - =====*/ - - // support stuff for dojo._toDom - var tagWrap = { - option: ["select"], - tbody: ["table"], - thead: ["table"], - tfoot: ["table"], - tr: ["table", "tbody"], - td: ["table", "tbody", "tr"], - th: ["table", "thead", "tr"], - legend: ["fieldset"], - caption: ["table"], - colgroup: ["table"], - col: ["table", "colgroup"], - li: ["ul"] - }, - reTag = /<\s*([\w\:]+)/, - masterNode = {}, masterNum = 0, - masterName = "__" + d._scopeName + "ToDomId"; - - // generate start/end tag strings to use - // for the injection for each special tag wrap case. - for(var param in tagWrap){ - if(tagWrap.hasOwnProperty(param)){ - var tw = tagWrap[param]; - tw.pre = param == "option" ? '' : "<" + tw.join("><") + ">"; + tw.post = ""; + // the last line is destructive: it reverses the array, + // but we don't care at this point + } + } - var specials = ">~+"; + function _insertBefore(/*DomNode*/node, /*DomNode*/ref){ + var parent = ref.parentNode; + if(parent){ + parent.insertBefore(node, ref); + } + } - // global thunk to determine whether we should treat the current query as - // case sensitive or not. This switch is flipped by the query evaluator - // based on the document passed as the context to search. - var caseSensitive = false; + function _insertAfter(/*DomNode*/node, /*DomNode*/ref){ + // summary: + // Try to insert node after ref + var parent = ref.parentNode; + if(parent){ + if(parent.lastChild == ref){ + parent.appendChild(node); + }else{ + parent.insertBefore(node, ref.nextSibling); + } + } + } - // how high? - var yesman = function(){ return true; }; + var _destroyContainer = null, + _destroyDoc; + on(window, "unload", function(){ + _destroyContainer = null; //prevent IE leak + }); + + exports.toDom = function toDom(frag, doc){ + doc = doc || win.doc; + var masterId = doc[masterName]; + if(!masterId){ + doc[masterName] = masterId = ++masterNum + ""; + masterNode[masterId] = doc.createElement("div"); + } - //////////////////////////////////////////////////////////////////////// - // Tokenizer - //////////////////////////////////////////////////////////////////////// + // make sure the frag is a string. + frag += ""; - var getQueryParts = function(query){ - // summary: - // state machine for query tokenization - // description: - // instead of using a brittle and slow regex-based CSS parser, - // dojo.query implements an AST-style query representation. This - // representation is only generated once per query. For example, - // the same query run multiple times or under different root nodes - // does not re-parse the selector expression but instead uses the - // cached data structure. The state machine implemented here - // terminates on the last " " (space) character and returns an - // ordered array of query component structures (or "parts"). Each - // part represents an operator or a simple CSS filtering - // expression. The structure for parts is documented in the code - // below. - - - // NOTE: - // this code is designed to run fast and compress well. Sacrifices - // to readability and maintainability have been made. Your best - // bet when hacking the tokenizer is to put The Donnas on *really* - // loud (may we recommend their "Spend The Night" release?) and - // just assume you're gonna make mistakes. Keep the unit tests - // open and run them frequently. Knowing is half the battle ;-) - if(specials.indexOf(query.slice(-1)) >= 0){ - // if we end with a ">", "+", or "~", that means we're implicitly - // searching all children, so make it explicit - query += " * " + // find the starting tag, and get node wrapper + var match = frag.match(reTag), + tag = match ? match[1].toLowerCase() : "", + master = masterNode[masterId], + wrap, i, fc, df; + if(match && tagWrap[tag]){ + wrap = tagWrap[tag]; + master.innerHTML = wrap.pre + frag + wrap.post; + for(i = wrap.length; i; --i){ + master = master.firstChild; + } }else{ - // if you have not provided a terminator, one will be provided for - // you... - query += " "; + master.innerHTML = frag; } - var ts = function(/*Integer*/ s, /*Integer*/ e){ - // trim and slice. - - // take an index to start a string slice from and an end position - // and return a trimmed copy of that sub-string - return trim(query.slice(s, e)); + // one node shortcut => return the node itself + if(master.childNodes.length == 1){ + return master.removeChild(master.firstChild); // DOMNode } - // the overall data graph of the full query, as represented by queryPart objects - var queryParts = []; - - - // state keeping vars - var inBrackets = -1, inParens = -1, inMatchFor = -1, - inPseudo = -1, inClass = -1, inId = -1, inTag = -1, - lc = "", cc = "", pStart; - - // iteration vars - var x = 0, // index in the query - ql = query.length, - currentPart = null, // data structure representing the entire clause - _cp = null; // the current pseudo or attr matcher - - // several temporary variables are assigned to this structure during a - // potential sub-expression match: - // attr: - // a string representing the current full attribute match in a - // bracket expression - // type: - // if there's an operator in a bracket expression, this is - // used to keep track of it - // value: - // the internals of parenthetical expression for a pseudo. for - // :nth-child(2n+1), value might be "2n+1" + // return multiple nodes as a document fragment + df = doc.createDocumentFragment(); + while(fc = master.firstChild){ // intentional assignment + df.appendChild(fc); + } + return df; // DOMNode + }; - var endTag = function(){ - // called when the tokenizer hits the end of a particular tag name. - // Re-sets state variables for tag matching and sets up the matcher - // to handle the next type of token (tag or operator). - if(inTag >= 0){ - var tv = (inTag == x) ? null : ts(inTag, x); // .toLowerCase(); - currentPart[ (specials.indexOf(tv) < 0) ? "tag" : "oper" ] = tv; - inTag = -1; + exports.place = function place(/*DOMNode|String*/node, /*DOMNode|String*/refNode, /*String|Number?*/position){ + refNode = dom.byId(refNode); + if(typeof node == "string"){ // inline'd type check + node = /^\s*= 0){ - currentPart.id = ts(inId, x).replace(/\\/g, ""); - inId = -1; - } + exports.create = function create(/*DOMNode|String*/tag, /*Object*/attrs, /*DOMNode?|String?*/refNode, /*String?*/pos){ + var doc = win.doc; + if(refNode){ + refNode = dom.byId(refNode); + doc = refNode.ownerDocument; + } + if(typeof tag == "string"){ // inline'd type check + tag = doc.createElement(tag); } + if(attrs){ attr.set(tag, attrs); } + if(refNode){ exports.place(tag, refNode, pos); } + return tag; // DomNode + }; - var endClass = function(){ - // called when the tokenizer might be at the end of a class name - // match. CSS allows for multiple classes, so we augment the - // current item with another class in its list - if(inClass >= 0){ - currentPart.classes.push(ts(inClass+1, x).replace(/\\/g, "")); - inClass = -1; + exports.empty = + has("ie") ? function(node){ + node = dom.byId(node); + for(var c; c = node.lastChild;){ // intentional assignment + exports.destroy(c); } - } + } : + function(node){ + dom.byId(node).innerHTML = ""; + }; - var endAll = function(){ - // at the end of a simple fragment, so wall off the matches - endId(); endTag(); endClass(); + exports.destroy = function destroy(/*DOMNode|String*/node){ + node = dom.byId(node); + try{ + var doc = node.ownerDocument; + // cannot use _destroyContainer.ownerDocument since this can throw an exception on IE + if(!_destroyContainer || _destroyDoc != doc){ + _destroyContainer = doc.createElement("div"); + _destroyDoc = doc; + } + _destroyContainer.appendChild(node.parentNode ? node.parentNode.removeChild(node) : node); + // NOTE: see http://trac.dojotoolkit.org/ticket/2931. This may be a bug and not a feature + _destroyContainer.innerHTML = ""; + }catch(e){ + /* squelch */ } + }; +}); - var endPart = function(){ - endAll(); - if(inPseudo >= 0){ - currentPart.pseudos.push({ name: ts(inPseudo+1, x) }); - } - // hint to the selector engine to tell it whether or not it - // needs to do any iteration. Many simple selectors don't, and - // we can avoid significant construction-time work by advising - // the system to skip them - currentPart.loops = ( - currentPart.pseudos.length || - currentPart.attrs.length || - currentPart.classes.length ); +}, +'dojo/keys':function(){ +define("dojo/keys", ["./_base/kernel", "./_base/sniff"], function(dojo, has) { + // module: + // dojo/keys + // summary: + // key constants +// Constants + +// Public: client code should test +// keyCode against these named constants, as the +// actual codes can vary by browser. +return dojo.keys = { + // summary: + // Definitions for common key values + BACKSPACE: 8, + TAB: 9, + CLEAR: 12, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + META: has("safari") ? 91 : 224, // the apple key on macs + PAUSE: 19, + CAPS_LOCK: 20, + ESCAPE: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT_ARROW: 37, + UP_ARROW: 38, + RIGHT_ARROW: 39, + DOWN_ARROW: 40, + INSERT: 45, + DELETE: 46, + HELP: 47, + LEFT_WINDOW: 91, + RIGHT_WINDOW: 92, + SELECT: 93, + NUMPAD_0: 96, + NUMPAD_1: 97, + NUMPAD_2: 98, + NUMPAD_3: 99, + NUMPAD_4: 100, + NUMPAD_5: 101, + NUMPAD_6: 102, + NUMPAD_7: 103, + NUMPAD_8: 104, + NUMPAD_9: 105, + NUMPAD_MULTIPLY: 106, + NUMPAD_PLUS: 107, + NUMPAD_ENTER: 108, + NUMPAD_MINUS: 109, + NUMPAD_PERIOD: 110, + NUMPAD_DIVIDE: 111, + F1: 112, + F2: 113, + F3: 114, + F4: 115, + F5: 116, + F6: 117, + F7: 118, + F8: 119, + F9: 120, + F10: 121, + F11: 122, + F12: 123, + F13: 124, + F14: 125, + F15: 126, + NUM_LOCK: 144, + SCROLL_LOCK: 145, + UP_DPAD: 175, + DOWN_DPAD: 176, + LEFT_DPAD: 177, + RIGHT_DPAD: 178, + // virtual key mapping + copyKey: has("mac") && !has("air") ? (has("safari") ? 91 : 224 ) : 17 +}; +}); + +}, +'dojo/domReady':function(){ +define(['./has'], function(has){ + var global = this, + doc = document, + readyStates = { 'loaded': 1, 'complete': 1 }, + fixReadyState = typeof doc.readyState != "string", + ready = !!readyStates[doc.readyState]; + + // For FF <= 3.5 + if(fixReadyState){ doc.readyState = "loading"; } + + if(!ready){ + var readyQ = [], tests = [], + detectReady = function(evt){ + evt = evt || global.event; + if(ready || (evt.type == "readystatechange" && !readyStates[doc.readyState])){ return; } + ready = 1; + + // For FF <= 3.5 + if(fixReadyState){ doc.readyState = "complete"; } + + while(readyQ.length){ + (readyQ.shift())(); + } + }, + on = function(node, event){ + node.addEventListener(event, detectReady, false); + readyQ.push(function(){ node.removeEventListener(event, detectReady, false); }); + }; + + if(!has("dom-addeventlistener")){ + on = function(node, event){ + event = "on" + event; + node.attachEvent(event, detectReady); + readyQ.push(function(){ node.detachEvent(event, detectReady); }); + }; - currentPart.oquery = currentPart.query = ts(pStart, x); // save the full expression as a string + var div = doc.createElement("div"); + try{ + if(div.doScroll && global.frameElement === null){ + // the doScroll test is only useful if we're in the top-most frame + tests.push(function(){ + // Derived with permission from Diego Perini's IEContentLoaded + // http://javascript.nwbox.com/IEContentLoaded/ + try{ + div.doScroll("left"); + return 1; + }catch(e){} + }); + } + }catch(e){} + } + on(doc, "DOMContentLoaded"); + on(global, "load"); - // otag/tag are hints to suggest to the system whether or not - // it's an operator or a tag. We save a copy of otag since the - // tag name is cast to upper-case in regular HTML matches. The - // system has a global switch to figure out if the current - // expression needs to be case sensitive or not and it will use - // otag or tag accordingly - currentPart.otag = currentPart.tag = (currentPart["oper"]) ? null : (currentPart.tag || "*"); + if("onreadystatechange" in doc){ + on(doc, "readystatechange"); + }else if(!fixReadyState){ + // if the ready state property exists and there's + // no readystatechange event, poll for the state + // to change + tests.push(function(){ + return readyStates[doc.readyState]; + }); + } - if(currentPart.tag){ - // if we're in a case-insensitive HTML doc, we likely want - // the toUpperCase when matching on element.tagName. If we - // do it here, we can skip the string op per node - // comparison - currentPart.tag = currentPart.tag.toUpperCase(); - } - - // add the part to the list - if(queryParts.length && (queryParts[queryParts.length-1].oper)){ - // operators are always infix, so we remove them from the - // list and attach them to the next match. The evaluator is - // responsible for sorting out how to handle them. - currentPart.infixOper = queryParts.pop(); - currentPart.query = currentPart.infixOper.query + " " + currentPart.query; - /* - console.debug( "swapping out the infix", - currentPart.infixOper, - "and attaching it to", - currentPart); - */ - } - queryParts.push(currentPart); - - currentPart = null; - } - - // iterate over the query, character by character, building up a - // list of query part objects - for(; lc=cc, cc=query.charAt(x), x < ql; x++){ - // cc: the current character in the match - // lc: the last character (if any) - - // someone is trying to escape something, so don't try to match any - // fragments. We assume we're inside a literal. - if(lc == "\\"){ continue; } - if(!currentPart){ // a part was just ended or none has yet been created - // NOTE: I hate all this alloc, but it's shorter than writing tons of if's - pStart = x; - // rules describe full CSS sub-expressions, like: - // #someId - // .className:first-child - // but not: - // thinger > div.howdy[type=thinger] - // the indidual components of the previous query would be - // split into 3 parts that would be represented a structure - // like: - // [ - // { - // query: "thinger", - // tag: "thinger", - // }, - // { - // query: "div.howdy[type=thinger]", - // classes: ["howdy"], - // infixOper: { - // query: ">", - // oper: ">", - // } - // }, - // ] - currentPart = { - query: null, // the full text of the part's rule - pseudos: [], // CSS supports multiple pseud-class matches in a single rule - attrs: [], // CSS supports multi-attribute match, so we need an array - classes: [], // class matches may be additive, e.g.: .thinger.blah.howdy - tag: null, // only one tag... - oper: null, // ...or operator per component. Note that these wind up being exclusive. - id: null, // the id component of a rule - getTag: function(){ - return (caseSensitive) ? this.otag : this.tag; + if(tests.length){ + var poller = function(){ + if(ready){ return; } + var i = tests.length; + while(i--){ + if(tests[i]()){ + detectReady("poller"); + return; } - }; + } + setTimeout(poller, 30); + }; + poller(); + } + } - // if we don't have a part, we assume we're going to start at - // the beginning of a match, which should be a tag name. This - // might fault a little later on, but we detect that and this - // iteration will still be fine. - inTag = x; - } - - if(inBrackets >= 0){ - // look for a the close first - if(cc == "]"){ // if we're in a [...] clause and we end, do assignment - if(!_cp.attr){ - // no attribute match was previously begun, so we - // assume this is an attribute existence match in the - // form of [someAttributeName] - _cp.attr = ts(inBrackets+1, x); - }else{ - // we had an attribute already, so we know that we're - // matching some sort of value, as in [attrName=howdy] - _cp.matchFor = ts((inMatchFor||inBrackets+1), x); - } - var cmf = _cp.matchFor; - if(cmf){ - // try to strip quotes from the matchFor value. We want - // [attrName=howdy] to match the same - // as [attrName = 'howdy' ] - if( (cmf.charAt(0) == '"') || (cmf.charAt(0) == "'") ){ - _cp.matchFor = cmf.slice(1, -1); - } - } - // end the attribute by adding it to the list of attributes. - currentPart.attrs.push(_cp); - _cp = null; // necessary? - inBrackets = inMatchFor = -1; - }else if(cc == "="){ - // if the last char was an operator prefix, make sure we - // record it along with the "=" operator. - var addToCc = ("|~^$*".indexOf(lc) >=0 ) ? lc : ""; - _cp.type = addToCc+cc; - _cp.attr = ts(inBrackets+1, x-addToCc.length); - inMatchFor = x+1; - } - // now look for other clause parts - }else if(inParens >= 0){ - // if we're in a parenthetical expression, we need to figure - // out if it's attached to a pseudo-selector rule like - // :nth-child(1) - if(cc == ")"){ - if(inPseudo >= 0){ - _cp.value = ts(inParens+1, x); - } - inPseudo = inParens = -1; - } - }else if(cc == "#"){ - // start of an ID match - endAll(); - inId = x+1; - }else if(cc == "."){ - // start of a class match - endAll(); - inClass = x; - }else if(cc == ":"){ - // start of a pseudo-selector match - endAll(); - inPseudo = x; - }else if(cc == "["){ - // start of an attribute match. - endAll(); - inBrackets = x; - // provide a new structure for the attribute match to fill-in - _cp = { - /*===== - attr: null, type: null, matchFor: null - =====*/ - }; - }else if(cc == "("){ - // we really only care if we've entered a parenthetical - // expression if we're already inside a pseudo-selector match - if(inPseudo >= 0){ - // provide a new structure for the pseudo match to fill-in - _cp = { - name: ts(inPseudo+1, x), - value: null - } - currentPart.pseudos.push(_cp); - } - inParens = x; - }else if( - (cc == " ") && - // if it's a space char and the last char is too, consume the - // current one without doing more work - (lc != cc) - ){ - endPart(); - } + function domReady(callback){ + if(ready){ + callback(1); + }else{ + readyQ.push(callback); } - return queryParts; + } + domReady.load = function(id, req, load){ + domReady(load); }; - - //////////////////////////////////////////////////////////////////////// - // DOM query infrastructure - //////////////////////////////////////////////////////////////////////// + return domReady; +}); - var agree = function(first, second){ - // the basic building block of the yes/no chaining system. agree(f1, - // f2) generates a new function which returns the boolean results of - // both of the passed functions to a single logical-anded result. If - // either are not passed, the other is used exclusively. - if(!first){ return second; } - if(!second){ return first; } +}, +'dojo/_base/lang':function(){ +define(["./kernel", "../has", "./sniff"], function(dojo, has){ + // module: + // dojo/_base/lang + // summary: + // This module defines Javascript language extensions. - return function(){ - return first.apply(window, arguments) && second.apply(window, arguments); + has.add("bug-for-in-skips-shadowed", function(){ + // if true, the for-in interator skips object properties that exist in Object's prototype (IE 6 - ?) + for(var i in {toString: 1}){ + return 0; } - }; + return 1; + }); - var getArr = function(i, arr){ - // helps us avoid array alloc when we don't need it - var r = arr||[]; // FIXME: should this be 'new d._NodeListCtor()' ? - if(i){ r.push(i); } - return r; - }; + var _extraNames = + has("bug-for-in-skips-shadowed") ? + "hasOwnProperty.valueOf.isPrototypeOf.propertyIsEnumerable.toLocaleString.toString.constructor".split(".") : [], - var _isElement = function(n){ return (1 == n.nodeType); }; + _extraLen = _extraNames.length, - // FIXME: need to coalesce _getAttr with defaultGetter - var blank = ""; - var _getAttr = function(elem, attr){ - if(!elem){ return blank; } - if(attr == "class"){ - return elem.className || blank; - } - if(attr == "for"){ - return elem.htmlFor || blank; - } - if(attr == "style"){ - return elem.style.cssText || blank; - } - return (caseSensitive ? elem.getAttribute(attr) : elem.getAttribute(attr, 2)) || blank; - }; + _mixin = function(dest, source, copyFunc){ + var name, s, i, empty = {}; + for(name in source){ + // the (!(name in empty) || empty[name] !== s) condition avoids copying properties in "source" + // inherited from Object.prototype. For example, if dest has a custom toString() method, + // don't overwrite it with the toString() method that source inherited from Object.prototype + s = source[name]; + if(!(name in dest) || (dest[name] !== s && (!(name in empty) || empty[name] !== s))){ + dest[name] = copyFunc ? copyFunc(s) : s; + } + } - var attrs = { - "*=": function(attr, value){ - return function(elem){ - // E[foo*="bar"] - // an E element whose "foo" attribute value contains - // the substring "bar" - return (_getAttr(elem, attr).indexOf(value)>=0); + if(has("bug-for-in-skips-shadowed")){ + if(source){ + for(i = 0; i < _extraLen; ++i){ + name = _extraNames[i]; + s = source[name]; + if(!(name in dest) || (dest[name] !== s && (!(name in empty) || empty[name] !== s))){ + dest[name] = copyFunc ? copyFunc(s) : s; + } + } + } } + + return dest; // Object }, - "^=": function(attr, value){ - // E[foo^="bar"] - // an E element whose "foo" attribute value begins exactly - // with the string "bar" - return function(elem){ - return (_getAttr(elem, attr).indexOf(value)==0); + + mixin = function(dest, sources){ + if(!dest){ dest = {}; } + for(var i = 1, l = arguments.length; i < l; i++){ + lang._mixin(dest, arguments[i]); } + return dest; // Object }, - "$=": function(attr, value){ - // E[foo$="bar"] - // an E element whose "foo" attribute value ends exactly - // with the string "bar" - var tval = " "+value; - return function(elem){ - var ea = " "+_getAttr(elem, attr); - return (ea.lastIndexOf(value)==(ea.length-value.length)); + + getProp = function(/*Array*/parts, /*Boolean*/create, /*Object*/context){ + var p, i = 0, dojoGlobal = dojo.global; + if(!context){ + if(!parts.length){ + return dojoGlobal; + }else{ + p = parts[i++]; + try{ + context = dojo.scopeMap[p] && dojo.scopeMap[p][1]; + }catch(e){} + context = context || (p in dojoGlobal ? dojoGlobal[p] : (create ? dojoGlobal[p] = {} : undefined)); + } + } + while(context && (p = parts[i++])){ + context = (p in context ? context[p] : (create ? context[p] = {} : undefined)); } + return context; // mixed }, - "~=": function(attr, value){ - // E[foo~="bar"] - // an E element whose "foo" attribute value is a list of - // space-separated values, one of which is exactly equal - // to "bar" - // return "[contains(concat(' ',@"+attr+",' '), ' "+ value +" ')]"; - var tval = " "+value+" "; - return function(elem){ - var ea = " "+_getAttr(elem, attr)+" "; - return (ea.indexOf(tval)>=0); - } + setObject = function(name, value, context){ + var parts = name.split("."), p = parts.pop(), obj = getProp(parts, true, context); + return obj && p ? (obj[p] = value) : undefined; // Object }, - "|=": function(attr, value){ - // E[hreflang|="en"] - // an E element whose "hreflang" attribute has a - // hyphen-separated list of values beginning (from the - // left) with "en" - var valueDash = " "+value+"-"; - return function(elem){ - var ea = " "+_getAttr(elem, attr); - return ( - (ea == value) || - (ea.indexOf(valueDash)==0) - ); - } + + getObject = function(name, create, context){ + return getProp(name.split("."), create, context); // Object }, - "=": function(attr, value){ - return function(elem){ - return (_getAttr(elem, attr) == value); - } - } - }; - // avoid testing for node type if we can. Defining this in the negative - // here to avoid negation in the fast path. - var _noNES = (typeof getDoc().firstChild.nextElementSibling == "undefined"); - var _ns = !_noNES ? "nextElementSibling" : "nextSibling"; - var _ps = !_noNES ? "previousElementSibling" : "previousSibling"; - var _simpleNodeTest = (_noNES ? _isElement : yesman); + exists = function(name, obj){ + return lang.getObject(name, false, obj) !== undefined; // Boolean + }, - var _lookLeft = function(node){ - // look left - while(node = node[_ps]){ - if(_simpleNodeTest(node)){ return false; } - } - return true; - }; + opts = Object.prototype.toString, - var _lookRight = function(node){ - // look right - while(node = node[_ns]){ - if(_simpleNodeTest(node)){ return false; } - } - return true; - }; + // Crockford (ish) functions + + isString = function(it){ + return (typeof it == "string" || it instanceof String); // Boolean + }, + + isArray = function(it){ + return it && (it instanceof Array || typeof it == "array"); // Boolean + }, + + isFunction = function(it){ + return opts.call(it) === "[object Function]"; + }, - var getNodeIndex = function(node){ - var root = node.parentNode; - var i = 0, - tret = root[childNodesName], - ci = (node["_i"]||-1), - cl = (root["_l"]||-1); + isObject = function(it){ + return it !== undefined && + (it === null || typeof it == "object" || lang.isArray(it) || lang.isFunction(it)); // Boolean + }, - if(!tret){ return -1; } - var l = tret.length; + isArrayLike = function(it){ + return it && it !== undefined && // Boolean + // keep out built-in constructors (Number, String, ...) which have length + // properties + !lang.isString(it) && !lang.isFunction(it) && + !(it.tagName && it.tagName.toLowerCase() == 'form') && + (lang.isArray(it) || isFinite(it.length)); + }, - // we calculate the parent length as a cheap way to invalidate the - // cache. It's not 100% accurate, but it's much more honest than what - // other libraries do - if( cl == l && ci >= 0 && cl >= 0 ){ - // if it's legit, tag and release - return ci; - } + isAlien = function(it){ + return it && !lang.isFunction(it) && /\{\s*\[native code\]\s*\}/.test(String(it)); // Boolean + }, - // else re-key things - root["_l"] = l; - ci = -1; - for(var te = root["firstElementChild"]||root["firstChild"]; te; te = te[_ns]){ - if(_simpleNodeTest(te)){ - te["_i"] = ++i; - if(node === te){ - // NOTE: - // shortcutting the return at this step in indexing works - // very well for benchmarking but we avoid it here since - // it leads to potential O(n^2) behavior in sequential - // getNodexIndex operations on a previously un-indexed - // parent. We may revisit this at a later time, but for - // now we just want to get the right answer more often - // than not. - ci = i; - } + extend = function(constructor, props){ + for(var i=1, l=arguments.length; i 2){ + return lang._hitchArgs.apply(dojo, arguments); // Function } + if(!method){ + method = scope; + scope = null; + } + if(lang.isString(method)){ + scope = scope || dojo.global; + if(!scope[method]){ throw(['dojo.hitch: scope["', method, '"] is null (scope="', scope, '")'].join('')); } + return function(){ return scope[method].apply(scope, arguments || []); }; // Function + } + return !scope ? method : function(){ return method.apply(scope, arguments || []); }; // Function }, - "first-child": function(){ return _lookLeft; }, - "last-child": function(){ return _lookRight; }, - "only-child": function(name, condition){ - return function(node){ - if(!_lookLeft(node)){ return false; } - if(!_lookRight(node)){ return false; } - return true; - }; - }, - "empty": function(name, condition){ - return function(elem){ - // DomQuery and jQuery get this wrong, oddly enough. - // The CSS 3 selectors spec is pretty explicit about it, too. - var cn = elem.childNodes; - var cnl = elem.childNodes.length; - // if(!cnl){ return true; } - for(var x=cnl-1; x >= 0; x--){ - var nt = cn[x].nodeType; - if((nt === 1)||(nt == 3)){ return false; } + + delegate = (function(){ + // boodman/crockford delegation w/ cornford optimization + function TMP(){} + return function(obj, props){ + TMP.prototype = obj; + var tmp = new TMP(); + TMP.prototype = null; + if(props){ + lang._mixin(tmp, props); } - return true; - } + return tmp; // Object + }; + })(), + + efficient = function(obj, offset, startWith){ + return (startWith||[]).concat(Array.prototype.slice.call(obj, offset||0)); }, - "contains": function(name, condition){ - var cz = condition.charAt(0); - if( cz == '"' || cz == "'" ){ //remove quote - condition = condition.slice(1, -1); - } - return function(elem){ - return (elem.innerHTML.indexOf(condition) >= 0); - } - }, - "not": function(name, condition){ - var p = getQueryParts(condition)[0]; - var ignores = { el: 1 }; - if(p.tag != "*"){ - ignores.tag = 1; - } - if(!p.classes.length){ - ignores.classes = 1; - } - var ntf = getSimpleFilterFunc(p, ignores); - return function(elem){ - return (!ntf(elem)); - } - }, - "nth-child": function(name, condition){ - var pi = parseInt; - // avoid re-defining function objects if we can - if(condition == "odd"){ - return isOdd; - }else if(condition == "even"){ - return isEven; - } - // FIXME: can we shorten this? - if(condition.indexOf("n") != -1){ - var tparts = condition.split("n", 2); - var pred = tparts[0] ? ((tparts[0] == '-') ? -1 : pi(tparts[0])) : 1; - var idx = tparts[1] ? pi(tparts[1]) : 0; - var lb = 0, ub = -1; - if(pred > 0){ - if(idx < 0){ - idx = (idx % pred) && (pred + (idx % pred)); - }else if(idx>0){ - if(idx >= pred){ - lb = idx - idx % pred; + + _toArray = + has("ie") ? + (function(){ + function slow(obj, offset, startWith){ + var arr = startWith||[]; + for(var x = offset || 0; x < obj.length; x++){ + arr.push(obj[x]); } - idx = idx % pred; + return arr; } - }else if(pred<0){ - pred *= -1; - // idx has to be greater than 0 when pred is negative; - // shall we throw an error here? - if(idx > 0){ - ub = idx; - idx = idx % pred; - } - } - if(pred > 0){ - return function(elem){ - var i = getNodeIndex(elem); - return (i>=lb) && (ub<0 || i<=ub) && ((i % pred) == idx); + return function(obj){ + return ((obj.item) ? slow : efficient).apply(this, arguments); + }; + })() : efficient, + + partial = function(/*Function|String*/method /*, ...*/){ + var arr = [ null ]; + return lang.hitch.apply(dojo, arr.concat(lang._toArray(arguments))); // Function + }, + + clone = function(/*anything*/ src){ + if(!src || typeof src != "object" || lang.isFunction(src)){ + // null, undefined, any non-object, or function + return src; // anything + } + if(src.nodeType && "cloneNode" in src){ + // DOM Node + return src.cloneNode(true); // Node + } + if(src instanceof Date){ + // Date + return new Date(src.getTime()); // Date + } + if(src instanceof RegExp){ + // RegExp + return new RegExp(src); // RegExp + } + var r, i, l; + if(lang.isArray(src)){ + // array + r = []; + for(i = 0, l = src.length; i < l; ++i){ + if(i in src){ + r.push(clone(src[i])); } - }else{ - condition = idx; } + // we don't clone functions for performance reasons + // }else if(d.isFunction(src)){ + // // function + // r = function(){ return src.apply(this, arguments); }; + }else{ + // generic objects + r = src.constructor ? new src.constructor() : {}; } - var ncount = pi(condition); - return function(elem){ - return (getNodeIndex(elem) == ncount); - } - } - }; + return lang._mixin(r, src, clone); + }, - var defaultGetter = (d.isIE < 9 || (dojo.isIE && dojo.isQuirks)) ? function(cond){ - var clc = cond.toLowerCase(); - if(clc == "class"){ cond = "className"; } - return function(elem){ - return (caseSensitive ? elem.getAttribute(cond) : elem[cond]||elem[clc]); - } - } : function(cond){ - return function(elem){ - return (elem && elem.getAttribute && elem.hasAttribute(cond)); - } - }; - var getSimpleFilterFunc = function(query, ignores){ - // generates a node tester function based on the passed query part. The - // query part is one of the structures generated by the query parser - // when it creates the query AST. The "ignores" object specifies which - // (if any) tests to skip, allowing the system to avoid duplicating - // work where it may have already been taken into account by other - // factors such as how the nodes to test were fetched in the first - // place - if(!query){ return yesman; } - ignores = ignores||{}; + trim = String.prototype.trim ? + function(str){ return str.trim(); } : + function(str){ return str.replace(/^\s\s*/, '').replace(/\s\s*$/, ''); }, - var ff = null; - if(!("el" in ignores)){ - ff = agree(ff, _isElement); - } + _pattern = /\{([^\}]+)\}/g, - if(!("tag" in ignores)){ - if(query.tag != "*"){ - ff = agree(ff, function(elem){ - return (elem && (elem.tagName == query.getTag())); - }); - } - } + replace = function(tmpl, map, pattern){ + return tmpl.replace(pattern || _pattern, lang.isFunction(map) ? + map : function(_, k){ return getObject(k, false, map); }); + }, - if(!("classes" in ignores)){ - each(query.classes, function(cname, idx, arr){ - // get the class name - /* - var isWildcard = cname.charAt(cname.length-1) == "*"; - if(isWildcard){ - cname = cname.substr(0, cname.length-1); - } - // I dislike the regex thing, even if memoized in a cache, but it's VERY short - var re = new RegExp("(?:^|\\s)" + cname + (isWildcard ? ".*" : "") + "(?:\\s|$)"); - */ - var re = new RegExp("(?:^|\\s)" + cname + "(?:\\s|$)"); - ff = agree(ff, function(elem){ - return re.test(elem.className); - }); - ff.count = idx; - }); - } + lang = { + _extraNames:_extraNames, + _mixin:_mixin, + mixin:mixin, + setObject:setObject, + getObject:getObject, + exists:exists, + isString:isString, + isArray:isArray, + isFunction:isFunction, + isObject:isObject, + isArrayLike:isArrayLike, + isAlien:isAlien, + extend:extend, + _hitchArgs:_hitchArgs, + hitch:hitch, + delegate:delegate, + _toArray:_toArray, + partial:partial, + clone:clone, + trim:trim, + replace:replace + }; - if(!("pseudos" in ignores)){ - each(query.pseudos, function(pseudo){ - var pn = pseudo.name; - if(pseudos[pn]){ - ff = agree(ff, pseudos[pn](pn, pseudo.value)); - } - }); - } + 1 && mixin(dojo, lang); + return lang; - if(!("attrs" in ignores)){ - each(query.attrs, function(attr){ - var matcher; - var a = attr.attr; - // type, attr, matchFor - if(attr.type && attrs[attr.type]){ - matcher = attrs[attr.type](a, attr.matchFor); - }else if(a.length){ - matcher = defaultGetter(a); - } - if(matcher){ - ff = agree(ff, matcher); - } - }); - } + /*===== + dojo._extraNames + // summary: + // Array of strings. Lists property names that must be explicitly processed during for-in interation + // in environments that have has("bug-for-in-skips-shadowed") true. + =====*/ - if(!("id" in ignores)){ - if(query.id){ - ff = agree(ff, function(elem){ - return (!!elem && (elem.id == query.id)); - }); - } - } + /*===== + dojo._mixin = function(dest, source, copyFunc){ + // summary: + // Copies/adds all properties of source to dest; returns dest. + // dest: Object: + // The object to which to copy/add all properties contained in source. + // source: Object: + // The object from which to draw all properties to copy into dest. + // copyFunc: Function?: + // The process used to copy/add a property in source; defaults to the Javascript assignment operator. + // returns: + // dest, as modified + // description: + // All properties, including functions (sometimes termed "methods"), excluding any non-standard extensions + // found in Object.prototype, are copied/added to dest. Copying/adding each particular property is + // delegated to copyFunc (if any); copyFunc defaults to the Javascript assignment operator if not provided. + // Notice that by default, _mixin executes a so-called "shallow copy" and aggregate types are copied/added by reference. + } + =====*/ - if(!ff){ - if(!("default" in ignores)){ - ff = yesman; - } - } - return ff; - }; + /*===== + dojo.mixin = function(dest, sources){ + // summary: + // Copies/adds all properties of one or more sources to dest; returns dest. + // dest: Object + // The object to which to copy/add all properties contained in source. If dest is falsy, then + // a new object is manufactured before copying/adding properties begins. + // sources: Object... + // One of more objects from which to draw all properties to copy into dest. sources are processed + // left-to-right and if more than one of these objects contain the same property name, the right-most + // value "wins". + // returns: Object + // dest, as modified + // description: + // All properties, including functions (sometimes termed "methods"), excluding any non-standard extensions + // found in Object.prototype, are copied/added from sources to dest. sources are processed left to right. + // The Javascript assignment operator is used to copy/add each property; therefore, by default, mixin + // executes a so-called "shallow copy" and aggregate types are copied/added by reference. + // example: + // make a shallow copy of an object + // | var copy = lang.mixin({}, source); + // example: + // many class constructors often take an object which specifies + // values to be configured on the object. In this case, it is + // often simplest to call `lang.mixin` on the `this` object: + // | dojo.declare("acme.Base", null, { + // | constructor: function(properties){ + // | // property configuration: + // | lang.mixin(this, properties); + // | + // | console.log(this.quip); + // | // ... + // | }, + // | quip: "I wasn't born yesterday, you know - I've seen movies.", + // | // ... + // | }); + // | + // | // create an instance of the class and configure it + // | var b = new acme.Base({quip: "That's what it does!" }); + // example: + // copy in properties from multiple objects + // | var flattened = lang.mixin( + // | { + // | name: "Frylock", + // | braces: true + // | }, + // | { + // | name: "Carl Brutanananadilewski" + // | } + // | ); + // | + // | // will print "Carl Brutanananadilewski" + // | console.log(flattened.name); + // | // will print "true" + // | console.log(flattened.braces); + } + =====*/ - var _nextSibling = function(filterFunc){ - return function(node, ret, bag){ - while(node = node[_ns]){ - if(_noNES && (!_isElement(node))){ continue; } - if( - (!bag || _isUnique(node, bag)) && - filterFunc(node) - ){ - ret.push(node); - } - break; - } - return ret; - } - }; + /*===== + dojo.setObject = function(name, value, context){ + // summary: + // Set a property from a dot-separated string, such as "A.B.C" + // description: + // Useful for longer api chains where you have to test each object in + // the chain, or when you have an object reference in string format. + // Objects are created as needed along `path`. Returns the passed + // value if setting is successful or `undefined` if not. + // name: String + // Path to a property, in the form "A.B.C". + // value: anything + // value or object to place at location given by name + // context: Object? + // Optional. Object to use as root of path. Defaults to + // `dojo.global`. + // example: + // set the value of `foo.bar.baz`, regardless of whether + // intermediate objects already exist: + // | lang.setObject("foo.bar.baz", value); + // example: + // without `lang.setObject`, we often see code like this: + // | // ensure that intermediate objects are available + // | if(!obj["parent"]){ obj.parent = {}; } + // | if(!obj.parent["child"]){ obj.parent.child = {}; } + // | // now we can safely set the property + // | obj.parent.child.prop = "some value"; + // whereas with `lang.setObject`, we can shorten that to: + // | lang.setObject("parent.child.prop", "some value", obj); + } + =====*/ - var _nextSiblings = function(filterFunc){ - return function(root, ret, bag){ - var te = root[_ns]; - while(te){ - if(_simpleNodeTest(te)){ - if(bag && !_isUnique(te, bag)){ - break; - } - if(filterFunc(te)){ - ret.push(te); - } - } - te = te[_ns]; - } - return ret; - } - }; + /*===== + dojo.getObject = function(name, create, context){ + // summary: + // Get a property from a dot-separated string, such as "A.B.C" + // description: + // Useful for longer api chains where you have to test each object in + // the chain, or when you have an object reference in string format. + // name: String + // Path to an property, in the form "A.B.C". + // create: Boolean? + // Optional. Defaults to `false`. If `true`, Objects will be + // created at any point along the 'path' that is undefined. + // context: Object? + // Optional. Object to use as root of path. Defaults to + // 'dojo.global'. Null may be passed. + } + =====*/ - // get an array of child *elements*, skipping text and comment nodes - var _childElements = function(filterFunc){ - filterFunc = filterFunc||yesman; - return function(root, ret, bag){ - // get an array of child elements, skipping text and comment nodes - var te, x = 0, tret = root[childNodesName]; - while(te = tret[x++]){ - if( - _simpleNodeTest(te) && - (!bag || _isUnique(te, bag)) && - (filterFunc(te, x)) - ){ - ret.push(te); - } - } - return ret; - }; - }; - - /* - // thanks, Dean! - var itemIsAfterRoot = d.isIE ? function(item, root){ - return (item.sourceIndex > root.sourceIndex); - } : function(item, root){ - return (item.compareDocumentPosition(root) == 2); - }; - */ + /*===== + dojo.exists = function(name, obj){ + // summary: + // determine if an object supports a given method + // description: + // useful for longer api chains where you have to test each object in + // the chain. Useful for object and method detection. + // name: String + // Path to an object, in the form "A.B.C". + // obj: Object? + // Object to use as root of path. Defaults to + // 'dojo.global'. Null may be passed. + // example: + // | // define an object + // | var foo = { + // | bar: { } + // | }; + // | + // | // search the global scope + // | lang.exists("foo.bar"); // true + // | lang.exists("foo.bar.baz"); // false + // | + // | // search from a particular scope + // | lang.exists("bar", foo); // true + // | lang.exists("bar.baz", foo); // false + } + =====*/ - // test to see if node is below root - var _isDescendant = function(node, root){ - var pn = node.parentNode; - while(pn){ - if(pn == root){ - break; - } - pn = pn.parentNode; - } - return !!pn; - }; - - var _getElementsFuncCache = {}; - - var getElementsFunc = function(query){ - var retFunc = _getElementsFuncCache[query.query]; - // if we've got a cached dispatcher, just use that - if(retFunc){ return retFunc; } - // else, generate a new on - - // NOTE: - // this function returns a function that searches for nodes and - // filters them. The search may be specialized by infix operators - // (">", "~", or "+") else it will default to searching all - // descendants (the " " selector). Once a group of children is - // found, a test function is applied to weed out the ones we - // don't want. Many common cases can be fast-pathed. We spend a - // lot of cycles to create a dispatcher that doesn't do more work - // than necessary at any point since, unlike this function, the - // dispatchers will be called every time. The logic of generating - // efficient dispatchers looks like this in pseudo code: - // - // # if it's a purely descendant query (no ">", "+", or "~" modifiers) - // if infixOperator == " ": - // if only(id): - // return def(root): - // return d.byId(id, root); - // - // elif id: - // return def(root): - // return filter(d.byId(id, root)); - // - // elif cssClass && getElementsByClassName: - // return def(root): - // return filter(root.getElementsByClassName(cssClass)); - // - // elif only(tag): - // return def(root): - // return root.getElementsByTagName(tagName); - // - // else: - // # search by tag name, then filter - // return def(root): - // return filter(root.getElementsByTagName(tagName||"*")); - // - // elif infixOperator == ">": - // # search direct children - // return def(root): - // return filter(root.children); - // - // elif infixOperator == "+": - // # search next sibling - // return def(root): - // return filter(root.nextElementSibling); - // - // elif infixOperator == "~": - // # search rightward siblings - // return def(root): - // return filter(nextSiblings(root)); - - var io = query.infixOper; - var oper = (io ? io.oper : ""); - // the default filter func which tests for all conditions in the query - // part. This is potentially inefficient, so some optimized paths may - // re-define it to test fewer things. - var filterFunc = getSimpleFilterFunc(query, { el: 1 }); - var qt = query.tag; - var wildcardTag = ("*" == qt); - var ecs = getDoc()["getElementsByClassName"]; - - if(!oper){ - // if there's no infix operator, then it's a descendant query. ID - // and "elements by class name" variants can be accelerated so we - // call them out explicitly: - if(query.id){ - // testing shows that the overhead of yesman() is acceptable - // and can save us some bytes vs. re-defining the function - // everywhere. - filterFunc = (!query.loops && wildcardTag) ? - yesman : - getSimpleFilterFunc(query, { el: 1, id: 1 }); - - retFunc = function(root, arr){ - var te = d.byId(query.id, (root.ownerDocument||root)); - if(!te || !filterFunc(te)){ return; } - if(9 == root.nodeType){ // if root's a doc, we just return directly - return getArr(te, arr); - }else{ // otherwise check ancestry - if(_isDescendant(te, root)){ - return getArr(te, arr); - } - } - } - }else if( - ecs && - // isAlien check. Workaround for Prototype.js being totally evil/dumb. - /\{\s*\[native code\]\s*\}/.test(String(ecs)) && - query.classes.length && - !cssCaseBug - ){ - // it's a class-based query and we've got a fast way to run it. - - // ignore class and ID filters since we will have handled both - filterFunc = getSimpleFilterFunc(query, { el: 1, classes: 1, id: 1 }); - var classesString = query.classes.join(" "); - retFunc = function(root, arr, bag){ - var ret = getArr(0, arr), te, x=0; - var tret = root.getElementsByClassName(classesString); - while((te = tret[x++])){ - if(filterFunc(te, root) && _isUnique(te, bag)){ - ret.push(te); - } - } - return ret; - }; + /*===== + dojo.isString = function(it){ + // summary: + // Return true if it is a String + // it: anything + // Item to test. + } + =====*/ - }else if(!wildcardTag && !query.loops){ - // it's tag only. Fast-path it. - retFunc = function(root, arr, bag){ - var ret = getArr(0, arr), te, x=0; - var tret = root.getElementsByTagName(query.getTag()); - while((te = tret[x++])){ - if(_isUnique(te, bag)){ - ret.push(te); - } - } - return ret; - }; - }else{ - // the common case: - // a descendant selector without a fast path. By now it's got - // to have a tag selector, even if it's just "*" so we query - // by that and filter - filterFunc = getSimpleFilterFunc(query, { el: 1, tag: 1, id: 1 }); - retFunc = function(root, arr, bag){ - var ret = getArr(0, arr), te, x=0; - // we use getTag() to avoid case sensitivity issues - var tret = root.getElementsByTagName(query.getTag()); - while((te = tret[x++])){ - if(filterFunc(te, root) && _isUnique(te, bag)){ - ret.push(te); - } - } - return ret; - }; - } - }else{ - // the query is scoped in some way. Instead of querying by tag we - // use some other collection to find candidate nodes - var skipFilters = { el: 1 }; - if(wildcardTag){ - skipFilters.tag = 1; - } - filterFunc = getSimpleFilterFunc(query, skipFilters); - if("+" == oper){ - retFunc = _nextSibling(filterFunc); - }else if("~" == oper){ - retFunc = _nextSiblings(filterFunc); - }else if(">" == oper){ - retFunc = _childElements(filterFunc); - } - } - // cache it and return - return _getElementsFuncCache[query.query] = retFunc; - }; - - var filterDown = function(root, queryParts){ - // NOTE: - // this is the guts of the DOM query system. It takes a list of - // parsed query parts and a root and finds children which match - // the selector represented by the parts - var candidates = getArr(root), qp, x, te, qpl = queryParts.length, bag, ret; - - for(var i = 0; i < qpl; i++){ - ret = []; - qp = queryParts[i]; - x = candidates.length - 1; - if(x > 0){ - // if we have more than one root at this level, provide a new - // hash to use for checking group membership but tell the - // system not to post-filter us since we will already have been - // gauranteed to be unique - bag = {}; - ret.nozip = true; - } - var gef = getElementsFunc(qp); - for(var j = 0; (te = candidates[j]); j++){ - // for every root, get the elements that match the descendant - // selector, adding them to the "ret" array and filtering them - // via membership in this level's bag. If there are more query - // parts, then this level's return will be used as the next - // level's candidates - gef(te, ret, bag); - } - if(!ret.length){ break; } - candidates = ret; - } - return ret; - }; + /*===== + dojo.isArray = function(it){ + // summary: + // Return true if it is an Array. + // Does not work on Arrays created in other windows. + // it: anything + // Item to test. + } + =====*/ - //////////////////////////////////////////////////////////////////////// - // the query runner - //////////////////////////////////////////////////////////////////////// - - // these are the primary caches for full-query results. The query - // dispatcher functions are generated then stored here for hash lookup in - // the future - var _queryFuncCacheDOM = {}, - _queryFuncCacheQSA = {}; - - // this is the second level of spliting, from full-length queries (e.g., - // "div.foo .bar") into simple query expressions (e.g., ["div.foo", - // ".bar"]) - var getStepQueryFunc = function(query){ - var qparts = getQueryParts(trim(query)); - - // if it's trivial, avoid iteration and zipping costs - if(qparts.length == 1){ - // we optimize this case here to prevent dispatch further down the - // chain, potentially slowing things down. We could more elegantly - // handle this in filterDown(), but it's slower for simple things - // that need to be fast (e.g., "#someId"). - var tef = getElementsFunc(qparts[0]); - return function(root){ - var r = tef(root, new qlc()); - if(r){ r.nozip = true; } - return r; - } - } - - // otherwise, break it up and return a runner that iterates over the parts recursively - return function(root){ - return filterDown(root, qparts); - } - }; - - // NOTES: - // * we can't trust QSA for anything but document-rooted queries, so - // caching is split into DOM query evaluators and QSA query evaluators - // * caching query results is dirty and leak-prone (or, at a minimum, - // prone to unbounded growth). Other toolkits may go this route, but - // they totally destroy their own ability to manage their memory - // footprint. If we implement it, it should only ever be with a fixed - // total element reference # limit and an LRU-style algorithm since JS - // has no weakref support. Caching compiled query evaluators is also - // potentially problematic, but even on large documents the size of the - // query evaluators is often < 100 function objects per evaluator (and - // LRU can be applied if it's ever shown to be an issue). - // * since IE's QSA support is currently only for HTML documents and even - // then only in IE 8's "standards mode", we have to detect our dispatch - // route at query time and keep 2 separate caches. Ugg. - - // we need to determine if we think we can run a given query via - // querySelectorAll or if we'll need to fall back on DOM queries to get - // there. We need a lot of information about the environment and the query - // to make the determiniation (e.g. does it support QSA, does the query in - // question work in the native QSA impl, etc.). - var nua = navigator.userAgent; - // some versions of Safari provided QSA, but it was buggy and crash-prone. - // We need te detect the right "internal" webkit version to make this work. - var wk = "WebKit/"; - var is525 = ( - d.isWebKit && - (nua.indexOf(wk) > 0) && - (parseFloat(nua.split(wk)[1]) > 528) - ); + /*===== + dojo.isFunction = function(it){ + // summary: + // Return true if it is a Function + // it: anything + // Item to test. + } + =====*/ - // IE QSA queries may incorrectly include comment nodes, so we throw the - // zipping function into "remove" comments mode instead of the normal "skip - // it" which every other QSA-clued browser enjoys - var noZip = d.isIE ? "commentStrip" : "nozip"; + /*===== + dojo.isObject = function(it){ + // summary: + // Returns true if it is a JavaScript object (or an Array, a Function + // or null) + // it: anything + // Item to test. + } + =====*/ - var qsa = "querySelectorAll"; - var qsaAvail = ( - !!getDoc()[qsa] && - // see #5832 - (!d.isSafari || (d.isSafari > 3.1) || is525 ) - ); + /*===== + dojo.isArrayLike = function(it){ + // summary: + // similar to dojo.isArray() but more permissive + // it: anything + // Item to test. + // returns: + // If it walks like a duck and quacks like a duck, return `true` + // description: + // Doesn't strongly test for "arrayness". Instead, settles for "isn't + // a string or number and has a length property". Arguments objects + // and DOM collections will return true when passed to + // dojo.isArrayLike(), but will return false when passed to + // dojo.isArray(). + } + =====*/ - //Don't bother with n+3 type of matches, IE complains if we modify those. - var infixSpaceRe = /n\+\d|([^ ])?([>~+])([^ =])?/g; - var infixSpaceFunc = function(match, pre, ch, post) { - return ch ? (pre ? pre + " " : "") + ch + (post ? " " + post : "") : /*n+3*/ match; - }; - - var getQueryFunc = function(query, forceDOM){ - //Normalize query. The CSS3 selectors spec allows for omitting spaces around - //infix operators, >, ~ and + - //Do the work here since detection for spaces is used as a simple "not use QSA" - //test below. - query = query.replace(infixSpaceRe, infixSpaceFunc); - - if(qsaAvail){ - // if we've got a cached variant and we think we can do it, run it! - var qsaCached = _queryFuncCacheQSA[query]; - if(qsaCached && !forceDOM){ return qsaCached; } - } - - // else if we've got a DOM cached variant, assume that we already know - // all we need to and use it - var domCached = _queryFuncCacheDOM[query]; - if(domCached){ return domCached; } - - // TODO: - // today we're caching DOM and QSA branches separately so we - // recalc useQSA every time. If we had a way to tag root+query - // efficiently, we'd be in good shape to do a global cache. - - var qcz = query.charAt(0); - var nospace = (-1 == query.indexOf(" ")); - - // byId searches are wicked fast compared to QSA, even when filtering - // is required - if( (query.indexOf("#") >= 0) && (nospace) ){ - forceDOM = true; - } - - var useQSA = ( - qsaAvail && (!forceDOM) && - // as per CSS 3, we can't currently start w/ combinator: - // http://www.w3.org/TR/css3-selectors/#w3cselgrammar - (specials.indexOf(qcz) == -1) && - // IE's QSA impl sucks on pseudos - (!d.isIE || (query.indexOf(":") == -1)) && - - (!(cssCaseBug && (query.indexOf(".") >= 0))) && - - // FIXME: - // need to tighten up browser rules on ":contains" and "|=" to - // figure out which aren't good - // Latest webkit (around 531.21.8) does not seem to do well with :checked on option - // elements, even though according to spec, selected options should - // match :checked. So go nonQSA for it: - // http://bugs.dojotoolkit.org/ticket/5179 - (query.indexOf(":contains") == -1) && (query.indexOf(":checked") == -1) && - (query.indexOf("|=") == -1) // some browsers don't grok it - ); - - // TODO: - // if we've got a descendant query (e.g., "> .thinger" instead of - // just ".thinger") in a QSA-able doc, but are passed a child as a - // root, it should be possible to give the item a synthetic ID and - // trivially rewrite the query to the form "#synid > .thinger" to - // use the QSA branch - - - if(useQSA){ - var tq = (specials.indexOf(query.charAt(query.length-1)) >= 0) ? - (query + " *") : query; - return _queryFuncCacheQSA[query] = function(root){ - try{ - // the QSA system contains an egregious spec bug which - // limits us, effectively, to only running QSA queries over - // entire documents. See: - // http://ejohn.org/blog/thoughts-on-queryselectorall/ - // despite this, we can also handle QSA runs on simple - // selectors, but we don't want detection to be expensive - // so we're just checking for the presence of a space char - // right now. Not elegant, but it's cheaper than running - // the query parser when we might not need to - if(!((9 == root.nodeType) || nospace)){ throw ""; } - var r = root[qsa](tq); - // skip expensive duplication checks and just wrap in a NodeList - r[noZip] = true; - return r; - }catch(e){ - // else run the DOM branch on this query, ensuring that we - // default that way in the future - return getQueryFunc(query, true)(root); - } - } - }else{ - // DOM branch - var parts = query.split(/\s*,\s*/); - return _queryFuncCacheDOM[query] = ((parts.length < 2) ? - // if not a compound query (e.g., ".foo, .bar"), cache and return a dispatcher - getStepQueryFunc(query) : - // if it *is* a complex query, break it up into its - // constituent parts and return a dispatcher that will - // merge the parts when run - function(root){ - var pindex = 0, // avoid array alloc for every invocation - ret = [], - tp; - while((tp = parts[pindex++])){ - ret = ret.concat(getStepQueryFunc(tp)(root)); - } - return ret; - } - ); - } - }; + /*===== + dojo.isAlien = function(it){ + // summary: + // Returns true if it is a built-in function or some other kind of + // oddball that *should* report as a function but doesn't + } + =====*/ - var _zipIdx = 0; + /*===== + dojo.extend = function(constructor, props){ + // summary: + // Adds all properties and methods of props to constructor's + // prototype, making them available to all instances created with + // constructor. + // constructor: Object + // Target constructor to extend. + // props: Object... + // One or more objects to mix into constructor.prototype + } + =====*/ - // NOTE: - // this function is Moo inspired, but our own impl to deal correctly - // with XML in IE - var _nodeUID = d.isIE ? function(node){ - if(caseSensitive){ - // XML docs don't have uniqueID on their nodes - return (node.getAttribute("_uid") || node.setAttribute("_uid", ++_zipIdx) || _zipIdx); + /*===== + dojo.hitch = function(scope, method){ + // summary: + // Returns a function that will only ever execute in the a given scope. + // This allows for easy use of object member functions + // in callbacks and other places in which the "this" keyword may + // otherwise not reference the expected scope. + // Any number of default positional arguments may be passed as parameters + // beyond "method". + // Each of these values will be used to "placehold" (similar to curry) + // for the hitched function. + // scope: Object + // The scope to use when method executes. If method is a string, + // scope is also the object containing method. + // method: Function|String... + // A function to be hitched to scope, or the name of the method in + // scope to be hitched. + // example: + // | dojo.hitch(foo, "bar")(); + // runs foo.bar() in the scope of foo + // example: + // | dojo.hitch(foo, myFunction); + // returns a function that runs myFunction in the scope of foo + // example: + // Expansion on the default positional arguments passed along from + // hitch. Passed args are mixed first, additional args after. + // | var foo = { bar: function(a, b, c){ console.log(a, b, c); } }; + // | var fn = dojo.hitch(foo, "bar", 1, 2); + // | fn(3); // logs "1, 2, 3" + // example: + // | var foo = { bar: 2 }; + // | dojo.hitch(foo, function(){ this.bar = 10; })(); + // execute an anonymous function in scope of foo + } + =====*/ - }else{ - return node.uniqueID; - } - } : - function(node){ - return (node._uid || (node._uid = ++_zipIdx)); - }; - - // determine if a node in is unique in a "bag". In this case we don't want - // to flatten a list of unique items, but rather just tell if the item in - // question is already in the bag. Normally we'd just use hash lookup to do - // this for us but IE's DOM is busted so we can't really count on that. On - // the upside, it gives us a built in unique ID function. - var _isUnique = function(node, bag){ - if(!bag){ return 1; } - var id = _nodeUID(node); - if(!bag[id]){ return bag[id] = 1; } - return 0; - }; + /*===== + dojo.delegate = function(obj, props){ + // summary: + // Returns a new object which "looks" to obj for properties which it + // does not have a value for. Optionally takes a bag of properties to + // seed the returned object with initially. + // description: + // This is a small implementaton of the Boodman/Crockford delegation + // pattern in JavaScript. An intermediate object constructor mediates + // the prototype chain for the returned object, using it to delegate + // down to obj for property lookup when object-local lookup fails. + // This can be thought of similarly to ES4's "wrap", save that it does + // not act on types but rather on pure objects. + // obj: Object + // The object to delegate to for properties not found directly on the + // return object or in props. + // props: Object... + // an object containing properties to assign to the returned object + // returns: + // an Object of anonymous type + // example: + // | var foo = { bar: "baz" }; + // | var thinger = dojo.delegate(foo, { thud: "xyzzy"}); + // | thinger.bar == "baz"; // delegated to foo + // | foo.thud == undefined; // by definition + // | thinger.thud == "xyzzy"; // mixed in from props + // | foo.bar = "thonk"; + // | thinger.bar == "thonk"; // still delegated to foo's bar + } + =====*/ - // attempt to efficiently determine if an item in a list is a dupe, - // returning a list of "uniques", hopefully in doucment order - var _zipIdxName = "_zipIdx"; - var _zip = function(arr){ - if(arr && arr.nozip){ - return (qlc._wrap) ? qlc._wrap(arr) : arr; - } - // var ret = new d._NodeListCtor(); - var ret = new qlc(); - if(!arr || !arr.length){ return ret; } - if(arr[0]){ - ret.push(arr[0]); - } - if(arr.length < 2){ return ret; } + /*===== + dojo.partial = function(method){ + // summary: + // similar to hitch() except that the scope object is left to be + // whatever the execution context eventually becomes. + // method: Function|String + // description: + // Calling dojo.partial is the functional equivalent of calling: + // | dojo.hitch(null, funcName, ...); + } + =====*/ - _zipIdx++; - - // we have to fork here for IE and XML docs because we can't set - // expandos on their nodes (apparently). *sigh* - if(d.isIE && caseSensitive){ - var szidx = _zipIdx+""; - arr[0].setAttribute(_zipIdxName, szidx); - for(var x = 1, te; te = arr[x]; x++){ - if(arr[x].getAttribute(_zipIdxName) != szidx){ - ret.push(te); - } - te.setAttribute(_zipIdxName, szidx); - } - }else if(d.isIE && arr.commentStrip){ - try{ - for(var x = 1, te; te = arr[x]; x++){ - if(_isElement(te)){ - ret.push(te); - } - } - }catch(e){ /* squelch */ } - }else{ - if(arr[0]){ arr[0][_zipIdxName] = _zipIdx; } - for(var x = 1, te; te = arr[x]; x++){ - if(arr[x][_zipIdxName] != _zipIdx){ - ret.push(te); - } - te[_zipIdxName] = _zipIdx; - } - } - return ret; - }; + /*===== + dojo.trim = function(str){ + // summary: + // Trims whitespace from both sides of the string + // str: String + // String to be trimmed + // returns: String + // Returns the trimmed string + // description: + // This version of trim() was selected for inclusion into the base due + // to its compact size and relatively good performance + // (see [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript) + // Uses String.prototype.trim instead, if available. + // The fastest but longest version of this function is located at + // dojo.string.trim() + } + =====*/ + + /*===== + dojo.clone = function(src){ + // summary: + // Clones objects (including DOM nodes) and all children. + // Warning: do not clone cyclic structures. + // src: + // The object to clone + } + =====*/ - // the main executor - d.query = function(/*String*/ query, /*String|DOMNode?*/ root){ + /*===== + dojo._toArray = function(obj, offset, startWith){ // summary: - // Returns nodes which match the given CSS3 selector, searching the - // entire document by default but optionally taking a node to scope - // the search by. Returns an instance of dojo.NodeList. - // description: - // dojo.query() is the swiss army knife of DOM node manipulation in - // Dojo. Much like Prototype's "$$" (bling-bling) function or JQuery's - // "$" function, dojo.query provides robust, high-performance - // CSS-based node selector support with the option of scoping searches - // to a particular sub-tree of a document. - // - // Supported Selectors: - // -------------------- - // - // dojo.query() supports a rich set of CSS3 selectors, including: - // - // * class selectors (e.g., `.foo`) - // * node type selectors like `span` - // * ` ` descendant selectors - // * `>` child element selectors - // * `#foo` style ID selectors - // * `*` universal selector - // * `~`, the preceded-by sibling selector - // * `+`, the immediately preceded-by sibling selector - // * attribute queries: - // | * `[foo]` attribute presence selector - // | * `[foo='bar']` attribute value exact match - // | * `[foo~='bar']` attribute value list item match - // | * `[foo^='bar']` attribute start match - // | * `[foo$='bar']` attribute end match - // | * `[foo*='bar']` attribute substring match - // * `:first-child`, `:last-child`, and `:only-child` positional selectors - // * `:empty` content emtpy selector - // * `:checked` pseudo selector - // * `:nth-child(n)`, `:nth-child(2n+1)` style positional calculations - // * `:nth-child(even)`, `:nth-child(odd)` positional selectors - // * `:not(...)` negation pseudo selectors - // - // Any legal combination of these selectors will work with - // `dojo.query()`, including compound selectors ("," delimited). - // Very complex and useful searches can be constructed with this - // palette of selectors and when combined with functions for - // manipulation presented by dojo.NodeList, many types of DOM - // manipulation operations become very straightforward. - // - // Unsupported Selectors: - // ---------------------- - // - // While dojo.query handles many CSS3 selectors, some fall outside of - // what's reasonable for a programmatic node querying engine to - // handle. Currently unsupported selectors include: - // - // * namespace-differentiated selectors of any form - // * all `::` pseduo-element selectors - // * certain pseduo-selectors which don't get a lot of day-to-day use: - // | * `:root`, `:lang()`, `:target`, `:focus` - // * all visual and state selectors: - // | * `:root`, `:active`, `:hover`, `:visisted`, `:link`, - // `:enabled`, `:disabled` - // * `:*-of-type` pseudo selectors - // - // dojo.query and XML Documents: - // ----------------------------- - // - // `dojo.query` (as of dojo 1.2) supports searching XML documents - // in a case-sensitive manner. If an HTML document is served with - // a doctype that forces case-sensitivity (e.g., XHTML 1.1 - // Strict), dojo.query() will detect this and "do the right - // thing". Case sensitivity is dependent upon the document being - // searched and not the query used. It is therefore possible to - // use case-sensitive queries on strict sub-documents (iframes, - // etc.) or XML documents while still assuming case-insensitivity - // for a host/root document. - // - // Non-selector Queries: - // --------------------- - // - // If something other than a String is passed for the query, - // `dojo.query` will return a new `dojo.NodeList` instance - // constructed from that parameter alone and all further - // processing will stop. This means that if you have a reference - // to a node or NodeList, you can quickly construct a new NodeList - // from the original by calling `dojo.query(node)` or - // `dojo.query(list)`. - // - // query: - // The CSS3 expression to match against. For details on the syntax of - // CSS3 selectors, see - // root: - // A DOMNode (or node id) to scope the search from. Optional. - // returns: dojo.NodeList - // An instance of `dojo.NodeList`. Many methods are available on - // NodeLists for searching, iterating, manipulating, and handling - // events on the matched nodes in the returned list. - // example: - // search the entire document for elements with the class "foo": - // | dojo.query(".foo"); - // these elements will match: - // | - // | - // |

- // example: - // search the entire document for elements with the classes "foo" *and* "bar": - // | dojo.query(".foo.bar"); - // these elements will match: - // | - // while these will not: - // | - // |

- // example: - // find `` elements which are descendants of paragraphs and - // which have a "highlighted" class: - // | dojo.query("p span.highlighted"); - // the innermost span in this fragment matches: - // |

- // | ... - // | ... - // | - // |

+ // Converts an array-like object (i.e. arguments, DOMCollection) to an + // array. Returns a new Array with the elements of obj. + // obj: Object + // the object to "arrayify". We expect the object to have, at a + // minimum, a length property which corresponds to integer-indexed + // properties. + // offset: Number? + // the location in obj to start iterating from. Defaults to 0. + // Optional. + // startWith: Array? + // An array to pack with the properties of obj. If provided, + // properties in obj are appended at the end of startWith and + // startWith is the returned array. + } + =====*/ + + /*===== + dojo.replace = function(tmpl, map, pattern){ + // summary: + // Performs parameterized substitutions on a string. Throws an + // exception if any parameter is unmatched. + // tmpl: String + // String to be used as a template. + // map: Object|Function + // If an object, it is used as a dictionary to look up substitutions. + // If a function, it is called for every substitution with following + // parameters: a whole match, a name, an offset, and the whole template + // string (see https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Global_Objects/String/replace + // for more details). + // pattern: RegEx? + // Optional regular expression objects that overrides the default pattern. + // Must be global and match one item. The default is: /\{([^\}]+)\}/g, + // which matches patterns like that: "{xxx}", where "xxx" is any sequence + // of characters, which doesn't include "}". + // returns: String + // Returns the substituted string. // example: - // set an "odd" class on all odd table rows inside of the table - // `#tabular_data`, using the `>` (direct child) selector to avoid - // affecting any nested tables: - // | dojo.query("#tabular_data > tbody > tr:nth-child(odd)").addClass("odd"); + // | // uses a dictionary for substitutions: + // | dojo.replace("Hello, {name.first} {name.last} AKA {nick}!", + // | { + // | nick: "Bob", + // | name: { + // | first: "Robert", + // | middle: "X", + // | last: "Cringely" + // | } + // | }); + // | // returns: Hello, Robert Cringely AKA Bob! // example: - // remove all elements with the class "error" from the document - // and store them in a list: - // | var errors = dojo.query(".error").orphan(); + // | // uses an array for substitutions: + // | dojo.replace("Hello, {0} {2}!", + // | ["Robert", "X", "Cringely"]); + // | // returns: Hello, Robert Cringely! // example: - // add an onclick handler to every submit button in the document - // which causes the form to be sent via Ajax instead: - // | dojo.query("input[type='submit']").onclick(function(e){ - // | dojo.stopEvent(e); // prevent sending the form - // | var btn = e.target; - // | dojo.xhrPost({ - // | form: btn.form, - // | load: function(data){ - // | // replace the form with the response - // | var div = dojo.doc.createElement("div"); - // | dojo.place(div, btn.form, "after"); - // | div.innerHTML = data; - // | dojo.style(btn.form, "display", "none"); + // | // uses a function for substitutions: + // | function sum(a){ + // | var t = 0; + // | dojo.forEach(a, function(x){ t += x; }); + // | return t; + // | } + // | dojo.replace( + // | "{count} payments averaging {avg} USD per payment.", + // | dojo.hitch( + // | { payments: [11, 16, 12] }, + // | function(_, key){ + // | switch(key){ + // | case "count": return this.payments.length; + // | case "min": return Math.min.apply(Math, this.payments); + // | case "max": return Math.max.apply(Math, this.payments); + // | case "sum": return sum(this.payments); + // | case "avg": return sum(this.payments) / this.payments.length; + // | } // | } - // | }); - // | }); - - //Set list constructor to desired value. This can change - //between calls, so always re-assign here. - qlc = d._NodeListCtor; + // | ) + // | ); + // | // prints: 3 payments averaging 13 USD per payment. + // example: + // | // uses an alternative PHP-like pattern for substitutions: + // | dojo.replace("Hello, ${0} ${2}!", + // | ["Robert", "X", "Cringely"], /\$\{([^\}]+)\}/g); + // | // returns: Hello, Robert Cringely! + return ""; // String + } + =====*/ +}); - if(!query){ - return new qlc(); - } - if(query.constructor == qlc){ - return query; - } - if(typeof query != "string"){ // inline'd type check - return new qlc(query); // dojo.NodeList - } - if(typeof root == "string"){ // inline'd type check - root = d.byId(root); - if(!root){ return new qlc(); } +}, +'dojo/Evented':function(){ +define(["./aspect", "./on"], function(aspect, on){ + // summary: + // The export of this module is a class that can be used as a mixin or base class, + // to add on() and emit() methods to a class + // for listening for events and emiting events: + // |define(["dojo/Evented"], function(Evented){ + // | var EventedWidget = dojo.declare([Evented, dijit._Widget], {...}); + // | widget = new EventedWidget(); + // | widget.on("open", function(event){ + // | ... do something with event + // | }); + // | + // | widget.emit("open", {name:"some event", ...}); + + "use strict"; + var after = aspect.after; + function Evented(){ + } + Evented.prototype = { + on: function(type, listener){ + return on.parse(this, type, listener, function(target, type){ + return after(target, 'on' + type, listener, true); + }); + }, + emit: function(type, event){ + var args = [this]; + args.push.apply(args, arguments); + return on.emit.apply(on, args); } + }; + return Evented; +}); - root = root||getDoc(); - var od = root.ownerDocument||root.documentElement; - - // throw the big case sensitivity switch +}, +'dojo/mouse':function(){ +define(["./_base/kernel", "./on", "./has", "./dom", "./_base/window"], function(dojo, on, has, dom, win){ - // NOTE: - // Opera in XHTML mode doesn't detect case-sensitivity correctly - // and it's not clear that there's any way to test for it - caseSensitive = (root.contentType && root.contentType=="application/xml") || - (d.isOpera && (root.doctype || od.toString() == "[object XMLDocument]")) || - (!!od) && - (d.isIE ? od.xml : (root.xmlVersion||od.xmlVersion)); + /*===== + dojo.mouse = { + // summary: + // This module provide mouse event handling utility functions and exports + // mouseenter and mouseleave event emulation. + // enter: Synthetic Event + // This is an extension event for the mouseenter that IE provides, emulating the + // behavior on other browsers. + // leave: Synthetic Event + // This is an extension event for the mouseleave that IE provides, emulating the + // behavior on other browsers. + // isLeft: Function + // Test an event object (from a mousedown event) to see if the left button was pressed. + // isMiddle: Function + // Test an event object (from a mousedown event) to see if the middle button was pressed. + // isRight: Function + // Test an event object (from a mousedown event) to see if the right button was pressed. + // example: + // To use these events, you register a mouseenter like this: + // | define(["dojo/on", dojo/mouse"], function(on, mouse){ + // | on(targetNode, mouse.enter, function(event){ + // | dojo.addClass(targetNode, "highlighted"); + // | }); + // | on(targetNode, mouse.leave, function(event){ + // | dojo.removeClass(targetNode, "highlighted"); + // | }); + }; + ======*/ - // NOTE: - // adding "true" as the 2nd argument to getQueryFunc is useful for - // testing the DOM branch without worrying about the - // behavior/performance of the QSA branch. - var r = getQueryFunc(query)(root); + has.add("dom-quirks", win.doc && win.doc.compatMode == "BackCompat"); + has.add("events-mouseenter", win.doc && "onmouseenter" in win.doc.createElement("div")); - // FIXME: - // need to investigate this branch WRT #8074 and #8075 - if(r && r.nozip && !qlc._wrap){ - return r; - } - return _zip(r); // dojo.NodeList + var mouseButtons; + if(has("dom-quirks") || !has("dom-addeventlistener")){ + mouseButtons = { + LEFT: 1, + MIDDLE: 4, + RIGHT: 2, + // helper functions + isButton: function(e, button){ return e.button & button; }, + isLeft: function(e){ return e.button & 1; }, + isMiddle: function(e){ return e.button & 4; }, + isRight: function(e){ return e.button & 2; } + }; + }else{ + mouseButtons = { + LEFT: 0, + MIDDLE: 1, + RIGHT: 2, + // helper functions + isButton: function(e, button){ return e.button == button; }, + isLeft: function(e){ return e.button == 0; }, + isMiddle: function(e){ return e.button == 1; }, + isRight: function(e){ return e.button == 2; } + }; } + dojo.mouseButtons = mouseButtons; - // FIXME: need to add infrastructure for post-filtering pseudos, ala :last - d.query.pseudos = pseudos; - - // function for filtering a NodeList based on a selector, optimized for simple selectors - d._filterQueryResult = function(/*NodeList*/ nodeList, /*String*/ filter, /*String|DOMNode?*/ root){ - var tmpNodeList = new d._NodeListCtor(), - parts = getQueryParts(filter), - filterFunc = - (parts.length == 1 && !/[^\w#\.]/.test(filter)) ? - getSimpleFilterFunc(parts[0]) : - function(node) { - return dojo.query(filter, root).indexOf(node) != -1; - }; - for(var x = 0, te; te = nodeList[x]; x++){ - if(filterFunc(te)){ tmpNodeList.push(te); } - } - return tmpNodeList; - } -};//end defineQuery +/*===== + dojo.mouseButtons = { + // LEFT: Number + // Numeric value of the left mouse button for the platform. + LEFT: 0, + // MIDDLE: Number + // Numeric value of the middle mouse button for the platform. + MIDDLE: 1, + // RIGHT: Number + // Numeric value of the right mouse button for the platform. + RIGHT: 2, -var defineAcme= function(){ - // a self-sufficient query impl - acme = { - trim: function(/*String*/ str){ + isButton: function(e, button){ // summary: - // trims whitespaces from both sides of the string - str = str.replace(/^\s+/, ''); - for(var i = str.length - 1; i >= 0; i--){ - if(/\S/.test(str.charAt(i))){ - str = str.substring(0, i + 1); - break; - } - } - return str; // String + // Checks an event object for a pressed button + // e: Event + // Event object to examine + // button: Number + // The button value (example: dojo.mouseButton.LEFT) + return e.button == button; // Boolean }, - forEach: function(/*String*/ arr, /*Function*/ callback, /*Object?*/ thisObject){ - // summary: - // an iterator function that passes items, indexes, - // and the array to a callback - if(!arr || !arr.length){ return; } - for(var i=0,l=arr.length; i= 0) ? tv: undefined; - acme.isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : undefined; - acme.isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined; - acme.isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined; - var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0); - if(index && !acme.isChrome){ - acme.isSafari = parseFloat(dav.split("Version/")[1]); - if(!acme.isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){ - acme.isSafari = 2; + function eventHandler(type, mustBubble){ + // emulation of mouseenter/leave with mouseover/out using descendant checking + var handler = function(node, listener){ + return on(node, type, function(evt){ + if(!dom.isDescendant(evt.relatedTarget, mustBubble ? evt.target : node)){ + return listener.call(this, evt); + } + }); + }; + if(!mustBubble){ + handler.bubble = eventHandler(type, true); } + return handler; } - if(document.all && !acme.isOpera){ - acme.isIE = parseFloat(dav.split("MSIE ")[1]) || undefined; - } - - Array._wrap = function(arr){ return arr; }; - return acme; -}; - - //prefers queryPortability, then acme, then dojo - if(this["dojo"]){ - dojo.provide("dojo._base.query"); - - - defineQuery(this["queryPortability"]||this["acme"]||dojo); - }else{ - defineQuery(this["queryPortability"]||this["acme"]||defineAcme()); - } - -})(); - -/* -*/ - -} - -if(!dojo._hasResource["dojo._base.xhr"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo._base.xhr"] = true; -dojo.provide("dojo._base.xhr"); - - - - - - -(function(){ - var _d = dojo, cfg = _d.config; - - function setValue(/*Object*/obj, /*String*/name, /*String*/value){ - //summary: - // For the named property in object, set the value. If a value - // already exists and it is a string, convert the value to be an - // array of values. - - //Skip it if there is no value - if(value === null){ - return; - } + return { + enter: eventHandler("mouseover"), + leave: eventHandler("mouseout"), + isLeft: mouseButtons.isLeft, + isMiddle: mouseButtons.isMiddle, + isRight: mouseButtons.isRight + }; +}); + +}, +'dojo/topic':function(){ +define(["./Evented"], function(Evented){ + // summary: + // The export of this module is a pubsub hub + // You can also use listen function itself as a pub/sub hub: + // | topic.subscribe("some/topic", function(event){ + // | ... do something with event + // | }); + // | topic.publish("some/topic", {name:"some event", ...}); - var val = obj[name]; - if(typeof val == "string"){ // inline'd type check - obj[name] = [val, value]; - }else if(_d.isArray(val)){ - val.push(value); - }else{ - obj[name] = value; + var hub = new Evented; + return { + publish: function(topic, event){ + // summary: + // Publishes a message to a topic on the pub/sub hub. All arguments after + // the first will be passed to the subscribers, so any number of arguments + // can be provided (not just event). + // topic: String + // The name of the topic to publish to + // event: Object + // An event to distribute to the topic listeners + return hub.emit.apply(hub, arguments); + }, + subscribe: function(topic, listener){ + // summary: + // Subcribes to a topic on the pub/sub hub + // topic: String + // The topic to subscribe to + // listener: Function + // A function to call when a message is published to the given topic + return hub.on.apply(hub, arguments); } } - - dojo.fieldToObject = function(/*DOMNode||String*/ inputNode){ - // summary: - // Serialize a form field to a JavaScript object. - // - // description: - // Returns the value encoded in a form field as - // as a string or an array of strings. Disabled form elements - // and unchecked radio and checkboxes are skipped. Multi-select - // elements are returned as an array of string values. - var ret = null; - var item = _d.byId(inputNode); - if(item){ - var _in = item.name; - var type = (item.type||"").toLowerCase(); - if(_in && type && !item.disabled){ - if(type == "radio" || type == "checkbox"){ - if(item.checked){ ret = item.value; } - }else if(item.multiple){ - ret = []; - _d.query("option", item).forEach(function(opt){ - if(opt.selected){ - ret.push(opt.value); - } - }); - }else{ - ret = item.value; - } - } - } - return ret; // Object - }; - - dojo.formToObject = function(/*DOMNode||String*/ formNode){ - // summary: - // Serialize a form node to a JavaScript object. - // description: - // Returns the values encoded in an HTML form as - // string properties in an object which it then returns. Disabled form - // elements, buttons, and other non-value form elements are skipped. - // Multi-select elements are returned as an array of string values. - // - // example: - // This form: - // |
- // | - // | - // | - // | - // |
- // - // yields this object structure as the result of a call to - // formToObject(): - // - // | { - // | blah: "blah", - // | multi: [ - // | "thud", - // | "thonk" - // | ] - // | }; +}); + +}, +'dojo/_base/xhr':function(){ +define([ + "./kernel", "./sniff", "require", "../io-query", "../dom", "../dom-form", "./Deferred", "./json", "./lang", "./array", "../on" +], function(dojo, has, require, ioq, dom, domForm, deferred, json, lang, array, on){ + // module: + // dojo/_base.xhr + // summary: + // This modules defines the dojo.xhr* API. - var ret = {}; - var exclude = "file|submit|image|reset|button|"; - _d.forEach(dojo.byId(formNode).elements, function(item){ - var _in = item.name; - var type = (item.type||"").toLowerCase(); - if(_in && type && exclude.indexOf(type) == -1 && !item.disabled){ - setValue(ret, _in, _d.fieldToObject(item)); - if(type == "image"){ - ret[_in+".x"] = ret[_in+".y"] = ret[_in].x = ret[_in].y = 0; - } - } - }); - return ret; // Object - }; + has.add("native-xhr", function() { + // if true, the environment has a native XHR implementation + return typeof XMLHttpRequest !== 'undefined'; + }); - dojo.objectToQuery = function(/*Object*/ map){ - // summary: - // takes a name/value mapping object and returns a string representing - // a URL-encoded version of that object. - // example: - // this object: - // - // | { - // | blah: "blah", - // | multi: [ - // | "thud", - // | "thonk" - // | ] - // | }; - // - // yields the following query string: - // - // | "blah=blah&multi=thud&multi=thonk" - - // FIXME: need to implement encodeAscii!! - var enc = encodeURIComponent; - var pairs = []; - var backstop = {}; - for(var name in map){ - var value = map[name]; - if(value != backstop[name]){ - var assign = enc(name) + "="; - if(_d.isArray(value)){ - for(var i=0; i < value.length; i++){ - pairs.push(assign + enc(value[i])); - } - }else{ - pairs.push(assign + enc(value)); - } + if(1 && require.getXhr){ + dojo._xhrObj = require.getXhr; + }else if (has("native-xhr")){ + dojo._xhrObj = function(){ + // summary: + // does the work of portably generating a new XMLHTTPRequest object. + try{ + return new XMLHttpRequest(); + }catch(e){ + throw new Error("XMLHTTP not available: "+e); } - } - return pairs.join("&"); // String - }; - - dojo.formToQuery = function(/*DOMNode||String*/ formNode){ - // summary: - // Returns a URL-encoded string representing the form passed as either a - // node or string ID identifying the form to serialize - return _d.objectToQuery(_d.formToObject(formNode)); // String - }; - - dojo.formToJson = function(/*DOMNode||String*/ formNode, /*Boolean?*/prettyPrint){ - // summary: - // Create a serialized JSON string from a form node or string - // ID identifying the form to serialize - return _d.toJson(_d.formToObject(formNode), prettyPrint); // String - }; - - dojo.queryToObject = function(/*String*/ str){ - // summary: - // Create an object representing a de-serialized query section of a - // URL. Query keys with multiple values are returned in an array. - // - // example: - // This string: - // - // | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&" - // - // results in this object structure: - // - // | { - // | foo: [ "bar", "baz" ], - // | thinger: " spaces =blah", - // | zonk: "blarg" - // | } - // - // Note that spaces and other urlencoded entities are correctly - // handled. - - // FIXME: should we grab the URL string if we're not passed one? - var ret = {}; - var qp = str.split("&"); - var dec = decodeURIComponent; - _d.forEach(qp, function(item){ - if(item.length){ - var parts = item.split("="); - var name = dec(parts.shift()); - var val = dec(parts.join("=")); - if(typeof ret[name] == "string"){ // inline'd type check - ret[name] = [ret[name]]; - } - - if(_d.isArray(ret[name])){ - ret[name].push(val); - }else{ - ret[name] = val; + }; + }else{ + // PROGIDs are in order of decreasing likelihood; this will change in time. + for(var XMLHTTP_PROGIDS = ['Msxml2.XMLHTTP', 'Microsoft.XMLHTTP', 'Msxml2.XMLHTTP.4.0'], progid, i = 0; i < 3;){ + try{ + progid = XMLHTTP_PROGIDS[i++]; + if (new ActiveXObject(progid)) { + // this progid works; therefore, use it from now on + break; } + }catch(e){ + // squelch; we're just trying to find a good ActiveX PROGID + // if they all fail, then progid ends up as the last attempt and that will signal the error + // the first time the client actually tries to exec an xhr } - }); - return ret; // Object - }; + } + dojo._xhrObj= function() { + return new ActiveXObject(progid); + }; + } + + var cfg = dojo.config; + + // mix in io-query and dom-form + dojo.objectToQuery = ioq.objectToQuery; + dojo.queryToObject = ioq.queryToObject; + dojo.fieldToObject = domForm.fieldToObject; + dojo.formToObject = domForm.toObject; + dojo.formToQuery = domForm.toQuery; + dojo.formToJson = domForm.toJson; // need to block async callbacks from snatching this thread as the result // of an async callback might call another sync XHR, this hangs khtml forever @@ -9927,7 +10350,7 @@ dojo.provide("dojo._base.xhr"); dojo._blockAsync = false; // MOW: remove dojo._contentHandlers alias in 2.0 - var handlers = _d._contentHandlers = dojo.contentHandlers = { + var handlers = dojo._contentHandlers = dojo.contentHandlers = { // summary: // A map of availble XHR transport handle types. Name matches the // `handleAs` attribute passed to XHR calls. @@ -9951,13 +10374,13 @@ dojo.provide("dojo._base.xhr"); // | load: function(data){ /* data is a toUpper version of foo.txt */ } // | }); - text: function(xhr){ + "text": function(xhr){ // summary: A contentHandler which simply returns the plaintext response data return xhr.responseText; }, - json: function(xhr){ + "json": function(xhr){ // summary: A contentHandler which returns a JavaScript object created from the response data - return _d.fromJson(xhr.responseText || null); + return json.fromJson(xhr.responseText || null); }, "json-comment-filtered": function(xhr){ // summary: A contentHandler which expects comment-filtered JSON. @@ -9986,33 +10409,36 @@ dojo.provide("dojo._base.xhr"); if(cStartIdx == -1 || cEndIdx == -1){ throw new Error("JSON was not comment filtered"); } - return _d.fromJson(value.substring(cStartIdx+2, cEndIdx)); + return json.fromJson(value.substring(cStartIdx+2, cEndIdx)); }, - javascript: function(xhr){ + "javascript": function(xhr){ // summary: A contentHandler which evaluates the response data, expecting it to be valid JavaScript // FIXME: try Moz and IE specific eval variants? - return _d.eval(xhr.responseText); + return dojo.eval(xhr.responseText); }, - xml: function(xhr){ + "xml": function(xhr){ // summary: A contentHandler returning an XML Document parsed from the response data var result = xhr.responseXML; - if(_d.isIE && (!result || !result.documentElement)){ - //WARNING: this branch used by the xml handling in dojo.io.iframe, - //so be sure to test dojo.io.iframe if making changes below. - var ms = function(n){ return "MSXML" + n + ".DOMDocument"; }; - var dp = ["Microsoft.XMLDOM", ms(6), ms(4), ms(3), ms(2)]; - _d.some(dp, function(p){ - try{ - var dom = new ActiveXObject(p); - dom.async = false; - dom.loadXML(xhr.responseText); - result = dom; - }catch(e){ return false; } - return true; - }); - } - return result; // DOMDocument + + if(has("ie")){ + if((!result || !result.documentElement)){ + //WARNING: this branch used by the xml handling in dojo.io.iframe, + //so be sure to test dojo.io.iframe if making changes below. + var ms = function(n){ return "MSXML" + n + ".DOMDocument"; }; + var dp = ["Microsoft.XMLDOM", ms(6), ms(4), ms(3), ms(2)]; + array.some(dp, function(p){ + try{ + var dom = new ActiveXObject(p); + dom.async = false; + dom.loadXML(xhr.responseText); + result = dom; + }catch(e){ return false; } + return true; + }); + } + } + return result; // DOMDocument }, "json-comment-optional": function(xhr){ // summary: A contentHandler which checks the presence of comment-filtered JSON and @@ -10048,15 +10474,15 @@ dojo.provide("dojo._base.xhr"); // Acceptable values depend on the type of IO // transport (see specific IO calls for more information). // rawBody: String? - // Sets the raw body for an HTTP request. If this is used, then the content - // property is ignored. This is mostly useful for HTTP methods that have - // a body to their requests, like PUT or POST. This property can be used instead - // of postData and putData for dojo.rawXhrPost and dojo.rawXhrPut respectively. + // Sets the raw body for an HTTP request. If this is used, then the content + // property is ignored. This is mostly useful for HTTP methods that have + // a body to their requests, like PUT or POST. This property can be used instead + // of postData and putData for dojo.rawXhrPost and dojo.rawXhrPut respectively. // ioPublish: Boolean? // Set this explicitly to false to prevent publishing of topics related to - // IO operations. Otherwise, if djConfig.ioPublish is set to true, topics - // will be published via dojo.publish for different phases of an IO operation. - // See dojo.__IoPublish for a list of topics that are published. + // IO operations. Otherwise, if djConfig.ioPublish is set to true, topics + // will be published via dojo.publish for different phases of an IO operation. + // See dojo.__IoPublish for a list of topics that are published. // load: Function? // This function will be // called on a successful HTTP response code. @@ -10064,7 +10490,7 @@ dojo.provide("dojo._base.xhr"); // This function will // be called when the request fails due to a network or server error, the url // is invalid, etc. It will also be called if the load or handle callback throws an - // exception, unless djConfig.debugAtAllCosts is true. This allows deployed applications + // exception, unless djConfig.debugAtAllCosts is true. This allows deployed applications // to continue to run even when a logic error happens in the callback, while making // it easier to troubleshoot while in debug mode. // handle: Function? @@ -10150,34 +10576,34 @@ dojo.provide("dojo._base.xhr"); /*===== dojo.__IoPublish = function(){ - // summary: - // This is a list of IO topics that can be published - // if djConfig.ioPublish is set to true. IO topics can be - // published for any Input/Output, network operation. So, - // dojo.xhr, dojo.io.script and dojo.io.iframe can all - // trigger these topics to be published. + // summary: + // This is a list of IO topics that can be published + // if djConfig.ioPublish is set to true. IO topics can be + // published for any Input/Output, network operation. So, + // dojo.xhr, dojo.io.script and dojo.io.iframe can all + // trigger these topics to be published. // start: String // "/dojo/io/start" is sent when there are no outstanding IO - // requests, and a new IO request is started. No arguments - // are passed with this topic. + // requests, and a new IO request is started. No arguments + // are passed with this topic. // send: String // "/dojo/io/send" is sent whenever a new IO request is started. - // It passes the dojo.Deferred for the request with the topic. + // It passes the dojo.Deferred for the request with the topic. // load: String // "/dojo/io/load" is sent whenever an IO request has loaded - // successfully. It passes the response and the dojo.Deferred - // for the request with the topic. + // successfully. It passes the response and the dojo.Deferred + // for the request with the topic. // error: String // "/dojo/io/error" is sent whenever an IO request has errored. - // It passes the error and the dojo.Deferred - // for the request with the topic. + // It passes the error and the dojo.Deferred + // for the request with the topic. // done: String // "/dojo/io/done" is sent whenever an IO request has completed, - // either by loading or by erroring. It passes the error and - // the dojo.Deferred for the request with the topic. + // either by loading or by erroring. It passes the error and + // the dojo.Deferred for the request with the topic. // stop: String // "/dojo/io/stop" is sent when all outstanding IO requests have - // finished. No arguments are passed with this topic. + // finished. No arguments are passed with this topic. this.start = "/dojo/io/start"; this.send = "/dojo/io/send"; this.load = "/dojo/io/load"; @@ -10216,17 +10642,17 @@ dojo.provide("dojo._base.xhr"); //Get values from form if requestd. var formObject = null; if(args.form){ - var form = _d.byId(args.form); + var form = dom.byId(args.form); //IE requires going through getAttributeNode instead of just getAttribute in some form cases, - //so use it for all. See #2844 + //so use it for all. See #2844 var actnNode = form.getAttributeNode("action"); ioArgs.url = ioArgs.url || (actnNode ? actnNode.value : null); - formObject = _d.formToObject(form); + formObject = domForm.toObject(form); } // set up the query params var miArgs = [{}]; - + if(formObject){ // potentially over-ride url-provided params w/ form values miArgs.push(formObject); @@ -10238,11 +10664,11 @@ dojo.provide("dojo._base.xhr"); if(args.preventCache){ miArgs.push({"dojo.preventCache": new Date().valueOf()}); } - ioArgs.query = _d.objectToQuery(_d.mixin.apply(null, miArgs)); - + ioArgs.query = ioq.objectToQuery(lang.mixin.apply(null, miArgs)); + // .. and the real work of getting the deferred in order, etc. ioArgs.handleAs = args.handleAs || "text"; - var d = new _d.Deferred(canceller); + var d = new deferred(canceller); d.addCallbacks(okHandler, function(error){ return errHandler(error, d); }); @@ -10252,44 +10678,44 @@ dojo.provide("dojo._base.xhr"); //The callbacks will get the deferred result value as the //first argument and the ioArgs object as the second argument. var ld = args.load; - if(ld && _d.isFunction(ld)){ + if(ld && lang.isFunction(ld)){ d.addCallback(function(value){ return ld.call(args, value, ioArgs); }); } var err = args.error; - if(err && _d.isFunction(err)){ + if(err && lang.isFunction(err)){ d.addErrback(function(value){ return err.call(args, value, ioArgs); }); } var handle = args.handle; - if(handle && _d.isFunction(handle)){ + if(handle && lang.isFunction(handle)){ d.addBoth(function(value){ return handle.call(args, value, ioArgs); }); } //Plug in topic publishing, if dojo.publish is loaded. - if(cfg.ioPublish && _d.publish && ioArgs.args.ioPublish !== false){ + if(cfg.ioPublish && dojo.publish && ioArgs.args.ioPublish !== false){ d.addCallbacks( function(res){ - _d.publish("/dojo/io/load", [d, res]); + dojo.publish("/dojo/io/load", [d, res]); return res; }, function(res){ - _d.publish("/dojo/io/error", [d, res]); + dojo.publish("/dojo/io/error", [d, res]); return res; } ); d.addBoth(function(res){ - _d.publish("/dojo/io/done", [d, res]); + dojo.publish("/dojo/io/done", [d, res]); return res; }); } d.ioArgs = ioArgs; - + // FIXME: need to wire up the xhr object's abort method to something // analagous in the Deferred return d; @@ -10297,7 +10723,7 @@ dojo.provide("dojo._base.xhr"); var _deferredCancel = function(/*Deferred*/dfd){ // summary: canceller function for dojo._ioSetArgs call. - + dfd.canceled = true; var xhr = dfd.ioArgs.xhr; var _at = typeof xhr.abort; @@ -10330,8 +10756,8 @@ dojo.provide("dojo._base.xhr"); // something fierece if we don't use unified loops. var _inFlightIntvl = null; var _inFlight = []; - - + + //Use a separate count for knowing if we are starting/stopping io calls. //Cannot use _inFlight.length since it can change at a different time than //when we want to do this kind of test. We only want to decrement the count @@ -10341,8 +10767,8 @@ dojo.provide("dojo._base.xhr"); var _checkPubCount = function(dfd){ if(_pubCount <= 0){ _pubCount = 0; - if(cfg.ioPublish && _d.publish && (!dfd || dfd && dfd.ioArgs.args.ioPublish !== false)){ - _d.publish("/dojo/io/stop"); + if(cfg.ioPublish && dojo.publish && (!dfd || dfd && dfd.ioArgs.args.ioPublish !== false)){ + dojo.publish("/dojo/io/stop"); } } }; @@ -10351,12 +10777,12 @@ dojo.provide("dojo._base.xhr"); //summary: // internal method that checks each inflight XMLHttpRequest to see // if it has completed or if the timeout situation applies. - + var now = (new Date()).getTime(); // make sure sync calls stay thread safe, if this callback is called // during a sync call and this results in another sync call before the // first sync call ends the browser hangs - if(!_d._blockAsync){ + if(!dojo._blockAsync){ // we need manual loop because we often modify _inFlight (and therefore 'i') while iterating // note: the second clause is an assigment on purpose, lint may complain for(var i = 0, tif; i < _inFlight.length && (tif = _inFlight[i]); i++){ @@ -10399,7 +10825,6 @@ dojo.provide("dojo._base.xhr"); if(!_inFlight.length){ clearInterval(_inFlightIntvl); _inFlightIntvl = null; - return; } }; @@ -10407,7 +10832,7 @@ dojo.provide("dojo._base.xhr"); //summary: Cancels all pending IO requests, regardless of IO type //(xhr, script, iframe). try{ - _d.forEach(_inFlight, function(i){ + array.forEach(_inFlight, function(i){ try{ i.dfd.cancel(); }catch(e){/*squelch*/} @@ -10417,28 +10842,28 @@ dojo.provide("dojo._base.xhr"); //Automatically call cancel all io calls on unload //in IE for trac issue #2357. - if(_d.isIE){ - _d.addOnWindowUnload(_d._ioCancelAll); + if(has("ie")){ + on(window, "unload", dojo._ioCancelAll); } - - _d._ioNotifyStart = function(/*Deferred*/dfd){ + + dojo._ioNotifyStart = function(/*Deferred*/dfd){ // summary: - // If dojo.publish is available, publish topics - // about the start of a request queue and/or the - // the beginning of request. + // If dojo.publish is available, publish topics + // about the start of a request queue and/or the + // the beginning of request. // description: - // Used by IO transports. An IO transport should - // call this method before making the network connection. - if(cfg.ioPublish && _d.publish && dfd.ioArgs.args.ioPublish !== false){ + // Used by IO transports. An IO transport should + // call this method before making the network connection. + if(cfg.ioPublish && dojo.publish && dfd.ioArgs.args.ioPublish !== false){ if(!_pubCount){ - _d.publish("/dojo/io/start"); + dojo.publish("/dojo/io/start"); } _pubCount += 1; - _d.publish("/dojo/io/send", [dfd]); + dojo.publish("/dojo/io/send", [dfd]); } }; - _d._ioWatch = function(dfd, validCheck, ioCheck, resHandle){ + dojo._ioWatch = function(dfd, validCheck, ioCheck, resHandle){ // summary: // Watches the io request represented by dfd to see if it completes. // dfd: Deferred @@ -10456,7 +10881,7 @@ dojo.provide("dojo._base.xhr"); if(args.timeout){ dfd.startTime = (new Date()).getTime(); } - + _inFlight.push({dfd: dfd, validCheck: validCheck, ioCheck: ioCheck, resHandle: resHandle}); if(!_inFlightIntvl){ _inFlightIntvl = setInterval(_watchInFlight, 50); @@ -10481,12 +10906,13 @@ dojo.provide("dojo._base.xhr"); }; var _resHandle = function(/*Deferred*/dfd){ var xhr = dfd.ioArgs.xhr; - if(_d._isDocumentOk(xhr)){ + if(dojo._isDocumentOk(xhr)){ dfd.callback(dfd); }else{ var err = new Error("Unable to load " + dfd.ioArgs.url + " status:" + xhr.status); err.status = xhr.status; err.responseText = xhr.responseText; + err.xhr = xhr; dfd.errback(err); } }; @@ -10518,6 +10944,10 @@ dojo.provide("dojo._base.xhr"); // false is default. Indicates whether a request should be // allowed to fail (and therefore no console error message in // the event of a failure) + // contentType: String|Boolean + // "application/x-www-form-urlencoded" is default. Set to false to + // prevent a Content-Type header from being sent, or to a string + // to send a different Content-Type. this.handleAs = handleAs; this.sync = sync; this.headers = headers; @@ -10535,17 +10965,17 @@ dojo.provide("dojo._base.xhr"); // for those HTTP methods. There are also methods for "raw" PUT and POST methods // via dojo.rawXhrPut() and dojo.rawXhrPost() respectively. // method: - // HTTP method to be used, such as GET, POST, PUT, DELETE. Should be uppercase. + // HTTP method to be used, such as GET, POST, PUT, DELETE. Should be uppercase. // hasBody: // If the request has an HTTP body, then pass true for hasBody. //Make the Deferred object for this xhr request. - var dfd = _d._ioSetArgs(args, _deferredCancel, _deferredOk, _deferError); + var dfd = dojo._ioSetArgs(args, _deferredCancel, _deferredOk, _deferError); var ioArgs = dfd.ioArgs; //Pass the args to _xhrObj, to allow alternate XHR calls based specific calls, like //the one used for iframe proxies. - var xhr = ioArgs.xhr = _d._xhrObj(ioArgs.args); + var xhr = ioArgs.xhr = dojo._xhrObj(ioArgs.args); //If XHR factory fails, cancel the deferred. if(!xhr){ dfd.cancel(); @@ -10562,7 +10992,7 @@ dojo.provide("dojo._base.xhr"); }else if((arguments.length > 2 && !hasBody) || "POST|PUT".indexOf(method.toUpperCase()) == -1){ //Check for hasBody being passed. If no hasBody, //then only append query string if not a POST or PUT request. - _d._ioAddQueryToUrl(ioArgs); + dojo._ioAddQueryToUrl(ioArgs); } // IE 6 is a steaming pile. It won't let you call apply() on the native function (xhr.open). @@ -10580,12 +11010,14 @@ dojo.provide("dojo._base.xhr"); } } // FIXME: is this appropriate for all content types? - xhr.setRequestHeader("Content-Type", args.contentType || _defaultContentType); + if(args.contentType !== false){ + xhr.setRequestHeader("Content-Type", args.contentType || _defaultContentType); + } if(!args.headers || !("X-Requested-With" in args.headers)){ xhr.setRequestHeader("X-Requested-With", "XMLHttpRequest"); } // FIXME: set other headers here! - _d._ioNotifyStart(dfd); + dojo._ioNotifyStart(dfd); if(dojo.config.debugAtAllCosts){ xhr.send(ioArgs.query); }else{ @@ -10596,768 +11028,3152 @@ dojo.provide("dojo._base.xhr"); dfd.cancel(); } } - _d._ioWatch(dfd, _validCheck, _ioCheck, _resHandle); - xhr = null; - return dfd; // dojo.Deferred - }; + dojo._ioWatch(dfd, _validCheck, _ioCheck, _resHandle); + xhr = null; + return dfd; // dojo.Deferred + }; + + dojo.xhrGet = function(/*dojo.__XhrArgs*/ args){ + // summary: + // Sends an HTTP GET request to the server. + return dojo.xhr("GET", args); // dojo.Deferred + }; + + dojo.rawXhrPost = dojo.xhrPost = function(/*dojo.__XhrArgs*/ args){ + // summary: + // Sends an HTTP POST request to the server. In addtion to the properties + // listed for the dojo.__XhrArgs type, the following property is allowed: + // postData: + // String. Send raw data in the body of the POST request. + return dojo.xhr("POST", args, true); // dojo.Deferred + }; + + dojo.rawXhrPut = dojo.xhrPut = function(/*dojo.__XhrArgs*/ args){ + // summary: + // Sends an HTTP PUT request to the server. In addtion to the properties + // listed for the dojo.__XhrArgs type, the following property is allowed: + // putData: + // String. Send raw data in the body of the PUT request. + return dojo.xhr("PUT", args, true); // dojo.Deferred + }; + + dojo.xhrDelete = function(/*dojo.__XhrArgs*/ args){ + // summary: + // Sends an HTTP DELETE request to the server. + return dojo.xhr("DELETE", args); //dojo.Deferred + }; + + /* + dojo.wrapForm = function(formNode){ + //summary: + // A replacement for FormBind, but not implemented yet. + + // FIXME: need to think harder about what extensions to this we might + // want. What should we allow folks to do w/ this? What events to + // set/send? + throw new Error("dojo.wrapForm not yet implemented"); + } + */ + + dojo._isDocumentOk = function(http){ + var stat = http.status || 0; + stat = + (stat >= 200 && stat < 300) || // allow any 2XX response code + stat == 304 || // or, get it out of the cache + stat == 1223 || // or, Internet Explorer mangled the status code + !stat; // or, we're Titanium/browser chrome/chrome extension requesting a local file + return stat; // Boolean + }; + + dojo._getText = function(url){ + var result; + dojo.xhrGet({url:url, sync:true, load:function(text){ + result = text; + }}); + return result; + }; + + // Add aliases for static functions to dojo.xhr since dojo.xhr is what's returned from this module + lang.mixin(dojo.xhr, { + _xhrObj: dojo._xhrObj, + fieldToObject: domForm.fieldToObject, + formToObject: domForm.toObject, + objectToQuery: ioq.objectToQuery, + formToQuery: domForm.toQuery, + formToJson: domForm.toJson, + queryToObject: ioq.queryToObject, + contentHandlers: handlers, + _ioSetArgs: dojo._ioSetArgs, + _ioCancelAll: dojo._ioCancelAll, + _ioNotifyStart: dojo._ioNotifyStart, + _ioWatch: dojo._ioWatch, + _ioAddQueryToUrl: dojo._ioAddQueryToUrl, + _isDocumentOk: dojo._isDocumentOk, + _getText: dojo._getText, + get: dojo.xhrGet, + post: dojo.xhrPost, + put: dojo.xhrPut, + del: dojo.xhrDelete // because "delete" is a reserved word + }); + + return dojo.xhr; +}); + +}, +'dojo/_base/unload':function(){ +define(["./kernel", "./connect"], function(dojo, connect) { + // module: + // dojo/unload + // summary: + // This module contains the document and window unload detection API. + + var win = window; + + /*===== + dojo.windowUnloaded = function(){ + // summary: + // signal fired by impending window destruction. You may use + // dojo.addOnWindowUnload() to register a listener for this + // event. NOTE: if you wish to dojo.connect() to this method + // to perform page/application cleanup, be aware that this + // event WILL NOT fire if no handler has been registered with + // dojo.addOnWindowUnload. This behavior started in Dojo 1.3. + // Previous versions always triggered dojo.windowUnloaded. See + // dojo.addOnWindowUnload for more info. + }; + =====*/ + + dojo.addOnWindowUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){ + // summary: + // registers a function to be triggered when window.onunload + // fires. + // description: + // The first time that addOnWindowUnload is called Dojo + // will register a page listener to trigger your unload + // handler with. Note that registering these handlers may + // destory "fastback" page caching in browsers that support + // it. Be careful trying to modify the DOM or access + // JavaScript properties during this phase of page unloading: + // they may not always be available. Consider + // dojo.addOnUnload() if you need to modify the DOM or do + // heavy JavaScript work since it fires at the eqivalent of + // the page's "onbeforeunload" event. + // example: + // | dojo.addOnWindowUnload(functionPointer) + // | dojo.addOnWindowUnload(object, "functionName"); + // | dojo.addOnWindowUnload(object, function(){ /* ... */}); + + if (!dojo.windowUnloaded) { + connect.connect(win, "unload", (dojo.windowUnloaded= function(){})); + } + connect.connect(win, "unload", obj, functionName); + }; + + dojo.addOnUnload = function(/*Object?|Function?*/obj, /*String|Function?*/functionName){ + // summary: + // registers a function to be triggered when the page unloads. + // description: + // The first time that addOnUnload is called Dojo will + // register a page listener to trigger your unload handler + // with. + // + // In a browser enviroment, the functions will be triggered + // during the window.onbeforeunload event. Be careful of doing + // too much work in an unload handler. onbeforeunload can be + // triggered if a link to download a file is clicked, or if + // the link is a javascript: link. In these cases, the + // onbeforeunload event fires, but the document is not + // actually destroyed. So be careful about doing destructive + // operations in a dojo.addOnUnload callback. + // + // Further note that calling dojo.addOnUnload will prevent + // browsers from using a "fast back" cache to make page + // loading via back button instantaneous. + // example: + // | dojo.addOnUnload(functionPointer) + // | dojo.addOnUnload(object, "functionName") + // | dojo.addOnUnload(object, function(){ /* ... */}); + + connect.connect(win, "beforeunload", obj, functionName); + }; + + return { + addOnWindowUnload: dojo.addOnWindowUnload, + addOnUnload: dojo.addOnUnload + }; +}); + +}, +'dojo/_base/NodeList':function(){ +define(["./kernel", "../query", "./array", "./html", "../NodeList-dom"], function(dojo, query, array){ + // module: + // dojo/_base/NodeList + // summary: + // This module defines dojo.NodeList. + +var NodeList = query.NodeList; + + /*===== + dojo.extend(dojo.NodeList, { + connect: function(methodName, objOrFunc, funcName){ + // summary: + // attach event handlers to every item of the NodeList. Uses dojo.connect() + // so event properties are normalized + // methodName: String + // the name of the method to attach to. For DOM events, this should be + // the lower-case name of the event + // objOrFunc: Object|Function|String + // if 2 arguments are passed (methodName, objOrFunc), objOrFunc should + // reference a function or be the name of the function in the global + // namespace to attach. If 3 arguments are provided + // (methodName, objOrFunc, funcName), objOrFunc must be the scope to + // locate the bound function in + // funcName: String? + // optional. A string naming the function in objOrFunc to bind to the + // event. May also be a function reference. + // example: + // add an onclick handler to every button on the page + // | dojo.query("div:nth-child(odd)").connect("onclick", function(e){ + // | console.log("clicked!"); + // | }); + // example: + // attach foo.bar() to every odd div's onmouseover + // | dojo.query("div:nth-child(odd)").connect("onmouseover", foo, "bar"); + }, + coords: function(){ + // summary: + // Deprecated: Use position() for border-box x/y/w/h + // or marginBox() for margin-box w/h/l/t. + // Returns the box objects of all elements in a node list as + // an Array (*not* a NodeList). Acts like `dojo.coords`, though assumes + // the node passed is each node in this list. + + return dojo.map(this, dojo.coords); // Array + } + }); + + var NodeList = dojo.NodeList; + =====*/ + var nlp = NodeList.prototype; + + // don't bind early to dojo.connect since we no longer explicitly depend on it + nlp.connect = NodeList._adaptAsForEach(function(){ + return dojo.connect.apply(this, arguments); + }); + nlp.coords = NodeList._adaptAsMap(dojo.coords); + + NodeList.events = [ + // summary: + // list of all DOM events used in NodeList + "blur", "focus", "change", "click", "error", "keydown", "keypress", + "keyup", "load", "mousedown", "mouseenter", "mouseleave", "mousemove", + "mouseout", "mouseover", "mouseup", "submit" + ]; + + // FIXME: pseudo-doc the above automatically generated on-event functions + + // syntactic sugar for DOM events + array.forEach(NodeList.events, function(evt){ + var _oe = "on" + evt; + nlp[_oe] = function(a, b){ + return this.connect(_oe, a, b); + }; + // FIXME: should these events trigger publishes? + /* + return (a ? this.connect(_oe, a, b) : + this.forEach(function(n){ + // FIXME: + // listeners get buried by + // addEventListener and can't be dug back + // out to be triggered externally. + // see: + // http://developer.mozilla.org/en/docs/DOM:element + + console.log(n, evt, _oe); + + // FIXME: need synthetic event support! + var _e = { target: n, faux: true, type: evt }; + // dojo._event_listener._synthesizeEvent({}, { target: n, faux: true, type: evt }); + try{ n[evt](_e); }catch(e){ console.log(e); } + try{ n[_oe](_e); }catch(e){ console.log(e); } + }) + ); + */ + } + ); + + dojo.NodeList = NodeList; + return dojo.NodeList; +}); + +}, +'dojo/_base/Color':function(){ +define(["./kernel", "./lang", "./array", "./config"], function(dojo, lang, ArrayUtil, config){ + + var Color = dojo.Color = function(/*Array|String|Object*/ color){ + // summary: + // Takes a named string, hex string, array of rgb or rgba values, + // an object with r, g, b, and a properties, or another `dojo.Color` object + // and creates a new Color instance to work from. + // + // example: + // Work with a Color instance: + // | var c = new dojo.Color(); + // | c.setColor([0,0,0]); // black + // | var hex = c.toHex(); // #000000 + // + // example: + // Work with a node's color: + // | var color = dojo.style("someNode", "backgroundColor"); + // | var n = new dojo.Color(color); + // | // adjust the color some + // | n.r *= .5; + // | console.log(n.toString()); // rgb(128, 255, 255); + if(color){ this.setColor(color); } + }; + + /*===== + lang.mixin(dojo.Color,{ + named:{ + // summary: Dictionary list of all CSS named colors, by name. Values are 3-item arrays with corresponding RG and B values. + } + }); + =====*/ + + // FIXME: + // there's got to be a more space-efficient way to encode or discover + // these!! Use hex? + Color.named = { + "black": [0,0,0], + "silver": [192,192,192], + "gray": [128,128,128], + "white": [255,255,255], + "maroon": [128,0,0], + "red": [255,0,0], + "purple": [128,0,128], + "fuchsia":[255,0,255], + "green": [0,128,0], + "lime": [0,255,0], + "olive": [128,128,0], + "yellow": [255,255,0], + "navy": [0,0,128], + "blue": [0,0,255], + "teal": [0,128,128], + "aqua": [0,255,255], + "transparent": config.transparentColor || [0,0,0,0] + }; + + lang.extend(Color, { + r: 255, g: 255, b: 255, a: 1, + _set: function(r, g, b, a){ + var t = this; t.r = r; t.g = g; t.b = b; t.a = a; + }, + setColor: function(/*Array|String|Object*/ color){ + // summary: + // Takes a named string, hex string, array of rgb or rgba values, + // an object with r, g, b, and a properties, or another `dojo.Color` object + // and sets this color instance to that value. + // + // example: + // | var c = new dojo.Color(); // no color + // | c.setColor("#ededed"); // greyish + if(lang.isString(color)){ + Color.fromString(color, this); + }else if(lang.isArray(color)){ + Color.fromArray(color, this); + }else{ + this._set(color.r, color.g, color.b, color.a); + if(!(color instanceof Color)){ this.sanitize(); } + } + return this; // dojo.Color + }, + sanitize: function(){ + // summary: + // Ensures the object has correct attributes + // description: + // the default implementation does nothing, include dojo.colors to + // augment it with real checks + return this; // dojo.Color + }, + toRgb: function(){ + // summary: + // Returns 3 component array of rgb values + // example: + // | var c = new dojo.Color("#000000"); + // | console.log(c.toRgb()); // [0,0,0] + var t = this; + return [t.r, t.g, t.b]; // Array + }, + toRgba: function(){ + // summary: + // Returns a 4 component array of rgba values from the color + // represented by this object. + var t = this; + return [t.r, t.g, t.b, t.a]; // Array + }, + toHex: function(){ + // summary: + // Returns a CSS color string in hexadecimal representation + // example: + // | console.log(new dojo.Color([0,0,0]).toHex()); // #000000 + var arr = ArrayUtil.map(["r", "g", "b"], function(x){ + var s = this[x].toString(16); + return s.length < 2 ? "0" + s : s; + }, this); + return "#" + arr.join(""); // String + }, + toCss: function(/*Boolean?*/ includeAlpha){ + // summary: + // Returns a css color string in rgb(a) representation + // example: + // | var c = new dojo.Color("#FFF").toCss(); + // | console.log(c); // rgb('255','255','255') + var t = this, rgb = t.r + ", " + t.g + ", " + t.b; + return (includeAlpha ? "rgba(" + rgb + ", " + t.a : "rgb(" + rgb) + ")"; // String + }, + toString: function(){ + // summary: + // Returns a visual representation of the color + return this.toCss(true); // String + } + }); - dojo.xhrGet = function(/*dojo.__XhrArgs*/ args){ - // summary: - // Sends an HTTP GET request to the server. - return _d.xhr("GET", args); // dojo.Deferred + Color.blendColors = dojo.blendColors = function( + /*dojo.Color*/ start, + /*dojo.Color*/ end, + /*Number*/ weight, + /*dojo.Color?*/ obj + ){ + // summary: + // Blend colors end and start with weight from 0 to 1, 0.5 being a 50/50 blend, + // can reuse a previously allocated dojo.Color object for the result + var t = obj || new Color(); + ArrayUtil.forEach(["r", "g", "b", "a"], function(x){ + t[x] = start[x] + (end[x] - start[x]) * weight; + if(x != "a"){ t[x] = Math.round(t[x]); } + }); + return t.sanitize(); // dojo.Color }; - dojo.rawXhrPost = dojo.xhrPost = function(/*dojo.__XhrArgs*/ args){ - // summary: - // Sends an HTTP POST request to the server. In addtion to the properties - // listed for the dojo.__XhrArgs type, the following property is allowed: - // postData: - // String. Send raw data in the body of the POST request. - return _d.xhr("POST", args, true); // dojo.Deferred + Color.fromRgb = dojo.colorFromRgb = function(/*String*/ color, /*dojo.Color?*/ obj){ + // summary: + // Returns a `dojo.Color` instance from a string of the form + // "rgb(...)" or "rgba(...)". Optionally accepts a `dojo.Color` + // object to update with the parsed value and return instead of + // creating a new object. + // returns: + // A dojo.Color object. If obj is passed, it will be the return value. + var m = color.toLowerCase().match(/^rgba?\(([\s\.,0-9]+)\)/); + return m && Color.fromArray(m[1].split(/\s*,\s*/), obj); // dojo.Color }; - dojo.rawXhrPut = dojo.xhrPut = function(/*dojo.__XhrArgs*/ args){ - // summary: - // Sends an HTTP PUT request to the server. In addtion to the properties - // listed for the dojo.__XhrArgs type, the following property is allowed: - // putData: - // String. Send raw data in the body of the PUT request. - return _d.xhr("PUT", args, true); // dojo.Deferred + Color.fromHex = dojo.colorFromHex = function(/*String*/ color, /*dojo.Color?*/ obj){ + // summary: + // Converts a hex string with a '#' prefix to a color object. + // Supports 12-bit #rgb shorthand. Optionally accepts a + // `dojo.Color` object to update with the parsed value. + // + // returns: + // A dojo.Color object. If obj is passed, it will be the return value. + // + // example: + // | var thing = dojo.colorFromHex("#ededed"); // grey, longhand + // + // example: + // | var thing = dojo.colorFromHex("#000"); // black, shorthand + var t = obj || new Color(), + bits = (color.length == 4) ? 4 : 8, + mask = (1 << bits) - 1; + color = Number("0x" + color.substr(1)); + if(isNaN(color)){ + return null; // dojo.Color + } + ArrayUtil.forEach(["b", "g", "r"], function(x){ + var c = color & mask; + color >>= bits; + t[x] = bits == 4 ? 17 * c : c; + }); + t.a = 1; + return t; // dojo.Color }; - dojo.xhrDelete = function(/*dojo.__XhrArgs*/ args){ - // summary: - // Sends an HTTP DELETE request to the server. - return _d.xhr("DELETE", args); //dojo.Deferred + Color.fromArray = dojo.colorFromArray = function(/*Array*/ a, /*dojo.Color?*/ obj){ + // summary: + // Builds a `dojo.Color` from a 3 or 4 element array, mapping each + // element in sequence to the rgb(a) values of the color. + // example: + // | var myColor = dojo.colorFromArray([237,237,237,0.5]); // grey, 50% alpha + // returns: + // A dojo.Color object. If obj is passed, it will be the return value. + var t = obj || new Color(); + t._set(Number(a[0]), Number(a[1]), Number(a[2]), Number(a[3])); + if(isNaN(t.a)){ t.a = 1; } + return t.sanitize(); // dojo.Color }; - /* - dojo.wrapForm = function(formNode){ - //summary: - // A replacement for FormBind, but not implemented yet. - - // FIXME: need to think harder about what extensions to this we might - // want. What should we allow folks to do w/ this? What events to - // set/send? - throw new Error("dojo.wrapForm not yet implemented"); + Color.fromString = dojo.colorFromString = function(/*String*/ str, /*dojo.Color?*/ obj){ + // summary: + // Parses `str` for a color value. Accepts hex, rgb, and rgba + // style color values. + // description: + // Acceptable input values for str may include arrays of any form + // accepted by dojo.colorFromArray, hex strings such as "#aaaaaa", or + // rgb or rgba strings such as "rgb(133, 200, 16)" or "rgba(10, 10, + // 10, 50)" + // returns: + // A dojo.Color object. If obj is passed, it will be the return value. + var a = Color.named[str]; + return a && Color.fromArray(a, obj) || Color.fromRgb(str, obj) || Color.fromHex(str, obj); // dojo.Color + }; + + return Color; +}); + +}, +'dojo/selector/_loader':function(){ +define(["../has", "require"], + function(has, require){ +// summary: +// This module handles loading the appropriate selector engine for the given browser +"use strict"; +var testDiv = document.createElement("div"); +has.add("dom-qsa2.1", !!testDiv.querySelectorAll); +has.add("dom-qsa3", function(){ + // test to see if we have a reasonable native selector engine available + try{ + testDiv.innerHTML = "

"; // test kind of from sizzle + // Safari can't handle uppercase or unicode characters when + // in quirks mode, IE8 can't handle pseudos like :empty + return testDiv.querySelectorAll(".TEST:empty").length == 1; + }catch(e){} + }); +var fullEngine; +var acme = "./acme", lite = "./lite"; +return { + load: function(id, parentRequire, loaded, config){ + var req = require; + // here we implement the default logic for choosing a selector engine + id = id == "default" ? has("config-selectorEngine") || "css3" : id; + id = id == "css2" || id == "lite" ? lite : + id == "css2.1" ? has("dom-qsa2.1") ? lite : acme : + id == "css3" ? has("dom-qsa3") ? lite : acme : + id == "acme" ? acme : (req = parentRequire) && id; + if(id.charAt(id.length-1) == '?'){ + id = id.substring(0,id.length - 1); + var optionalLoad = true; + } + // the query engine is optional, only load it if a native one is not available or existing one has not been loaded + if(optionalLoad && (has("dom-compliant-qsa") || fullEngine)){ + return loaded(fullEngine); + } + // load the referenced selector engine + req([id], function(engine){ + if(id != "./lite"){ + fullEngine = engine; + } + loaded(engine); + }); } - */ -})(); - -} - -if(!dojo._hasResource["dojo._base.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo._base.fx"] = true; -dojo.provide("dojo._base.fx"); - - - - - - -/* - Animation loosely package based on Dan Pupius' work, contributed under CLA: - http://pupius.co.uk/js/Toolkit.Drawing.js -*/ -(function(){ - var d = dojo; - var _mixin = d._mixin; +}; +}); - dojo._Line = function(/*int*/ start, /*int*/ end){ - // summary: - // dojo._Line is the object used to generate values from a start value - // to an end value - // start: int - // Beginning value for range - // end: int - // Ending value for range - this.start = start; - this.end = end; +}, +'dojo/on':function(){ +define(["./has!dom-addeventlistener?:./aspect", "./_base/kernel", "./has"], function(aspect, dojo, has){ + // summary: + // The export of this module is a function that provides core event listening functionality. With this function + // you can provide a target, event type, and listener to be notified of + // future matching events that are fired. + // target: Element|Object + // This is the target object or DOM element that to receive events from + // type: String|Function + // This is the name of the event to listen for or an extension event type. + // listener: Function + // This is the function that should be called when the event fires. + // returns: Object + // An object with a remove() method that can be used to stop listening for this + // event. + // description: + // To listen for "click" events on a button node, we can do: + // | define(["dojo/on"], function(listen){ + // | on(button, "click", clickHandler); + // | ... + // Evented JavaScript objects can also have their own events. + // | var obj = new Evented; + // | on(obj, "foo", fooHandler); + // And then we could publish a "foo" event: + // | on.emit(obj, "foo", {key: "value"}); + // We can use extension events as well. For example, you could listen for a tap gesture: + // | define(["dojo/on", "dojo/gesture/tap", function(listen, tap){ + // | on(button, tap, tapHandler); + // | ... + // which would trigger fooHandler. Note that for a simple object this is equivalent to calling: + // | obj.onfoo({key:"value"}); + // If you use on.emit on a DOM node, it will use native event dispatching when possible. + + "use strict"; + if(1){ // check to make sure we are in a browser, this module should work anywhere + var major = window.ScriptEngineMajorVersion; + has.add("jscript", major && (major() + ScriptEngineMinorVersion() / 10)); + has.add("event-orientationchange", has("touch") && !has("android")); // TODO: how do we detect this? + } + var on = function(target, type, listener, dontFix){ + if(target.on){ + // delegate to the target's on() method, so it can handle it's own listening if it wants + return target.on(type, listener); + } + // delegate to main listener code + return on.parse(target, type, listener, addListener, dontFix, this); + }; + on.pausable = function(target, type, listener, dontFix){ + // summary: + // This function acts the same as on(), but with pausable functionality. The + // returned signal object has pause() and resume() functions. Calling the + // pause() method will cause the listener to not be called for future events. Calling the + // resume() method will cause the listener to again be called for future events. + var paused; + var signal = on(target, type, function(){ + if(!paused){ + return listener.apply(this, arguments); + } + }, dontFix); + signal.pause = function(){ + paused = true; + }; + signal.resume = function(){ + paused = false; + }; + return signal; }; + on.once = function(target, type, listener, dontFix){ + // summary: + // This function acts the same as on(), but will only call the listener once. The + // listener will be called for the first + // event that takes place and then listener will automatically be removed. + var signal = on(target, type, function(){ + // remove this listener + signal.remove(); + // proceed to call the listener + return listener.apply(this, arguments); + }); + return signal; + }; + on.parse = function(target, type, listener, addListener, dontFix, matchesTarget){ + if(type.call){ + // event handler function + // on(node, dojo.touch.press, touchListener); + return type.call(matchesTarget, target, listener); + } + + if(type.indexOf(",") > -1){ + // we allow comma delimited event names, so you can register for multiple events at once + var events = type.split(/\s*,\s*/); + var handles = []; + var i = 0; + var eventName; + while(eventName = events[i++]){ + handles.push(addListener(target, eventName, listener, dontFix, matchesTarget)); + } + handles.remove = function(){ + for(var i = 0; i < handles.length; i++){ + handles[i].remove(); + } + }; + return handles; + } + return addListener(target, type, listener, dontFix, matchesTarget) + }; + var touchEvents = /^touch/; + function addListener(target, type, listener, dontFix, matchesTarget){ + // event delegation: + var selector = type.match(/(.*):(.*)/); + // if we have a selector:event, the last one is interpreted as an event, and we use event delegation + if(selector){ + type = selector[2]; + selector = selector[1]; + // create the extension event for selectors and directly call it + return on.selector(selector, type).call(matchesTarget, target, listener); + } + // test to see if it a touch event right now, so we don't have to do it every time it fires + if(has("touch")){ + if(touchEvents.test(type)){ + // touch event, fix it + listener = fixTouchListener(listener); + } + if(!has("event-orientationchange") && (type == "orientationchange")){ + //"orientationchange" not supported <= Android 2.1, + //but works through "resize" on window + type = "resize"; + target = window; + listener = fixTouchListener(listener); + } + } + // normal path, the target is |this| + if(target.addEventListener){ + // the target has addEventListener, which should be used if available (might or might not be a node, non-nodes can implement this method as well) + // check for capture conversions + var capture = type in captures; + target.addEventListener(capture ? captures[type] : type, listener, capture); + // create and return the signal + return { + remove: function(){ + target.removeEventListener(type, listener, capture); + } + }; + } + type = "on" + type; + if(fixAttach && target.attachEvent){ + return fixAttach(target, type, listener); + } + throw new Error("Target must be an event emitter"); + } - dojo._Line.prototype.getValue = function(/*float*/ n){ - // summary: Returns the point on the line - // n: a floating point number greater than 0 and less than 1 - return ((this.end - this.start) * n) + this.start; // Decimal + on.selector = function(selector, eventType, children){ + // summary: + // Creates a new extension event with event delegation. This is based on + // the provided event type (can be extension event) that + // only calls the listener when the CSS selector matches the target of the event. + // selector: + // The CSS selector to use for filter events and determine the |this| of the event listener. + // eventType: + // The event to listen for + // children: + // Indicates if children elements of the selector should be allowed. This defaults to + // true (except in the case of normally non-bubbling events like mouse.enter, in which case it defaults to false). + // example: + // define(["dojo/on", "dojo/mouse"], function(listen, mouse){ + // on(node, on.selector(".my-class", mouse.enter), handlerForMyHover); + return function(target, listener){ + var matchesTarget = this; + var bubble = eventType.bubble; + if(bubble){ + // the event type doesn't naturally bubble, but has a bubbling form, use that + eventType = bubble; + }else if(children !== false){ + // for normal bubbling events we default to allowing children of the selector + children = true; + } + return on(target, eventType, function(event){ + var eventTarget = event.target; + // see if we have a valid matchesTarget or default to dojo.query + matchesTarget = matchesTarget && matchesTarget.matches ? matchesTarget : dojo.query; + // there is a selector, so make sure it matches + while(!matchesTarget.matches(eventTarget, selector, target)){ + if(eventTarget == target || !children || !(eventTarget = eventTarget.parentNode)){ // intentional assignment + return; + } + } + return listener.call(eventTarget, event); + }); + }; }; - dojo.Animation = function(args){ - // summary: - // A generic animation class that fires callbacks into its handlers - // object at various states. - // description: - // A generic animation class that fires callbacks into its handlers - // object at various states. Nearly all dojo animation functions - // return an instance of this method, usually without calling the - // .play() method beforehand. Therefore, you will likely need to - // call .play() on instances of `dojo.Animation` when one is - // returned. - // args: Object - // The 'magic argument', mixing all the properties into this - // animation instance. + function syntheticPreventDefault(){ + this.cancelable = false; + } + function syntheticStopPropagation(){ + this.bubbles = false; + } + var slice = [].slice, + syntheticDispatch = on.emit = function(target, type, event){ + // summary: + // Fires an event on the target object. + // target: + // The target object to fire the event on. This can be a DOM element or a plain + // JS object. If the target is a DOM element, native event emiting mechanisms + // are used when possible. + // type: + // The event type name. You can emulate standard native events like "click" and + // "mouseover" or create custom events like "open" or "finish". + // event: + // An object that provides the properties for the event. See https://developer.mozilla.org/en/DOM/event.initEvent + // for some of the properties. These properties are copied to the event object. + // Of particular importance are the cancelable and bubbles properties. The + // cancelable property indicates whether or not the event has a default action + // that can be cancelled. The event is cancelled by calling preventDefault() on + // the event object. The bubbles property indicates whether or not the + // event will bubble up the DOM tree. If bubbles is true, the event will be called + // on the target and then each parent successively until the top of the tree + // is reached or stopPropagation() is called. Both bubbles and cancelable + // default to false. + // returns: + // If the event is cancelable and the event is not cancelled, + // emit will return true. If the event is cancelable and the event is cancelled, + // emit will return false. + // details: + // Note that this is designed to emit events for listeners registered through + // dojo/on. It should actually work with any event listener except those + // added through IE's attachEvent (IE8 and below's non-W3C event emiting + // doesn't support custom event types). It should work with all events registered + // through dojo/on. Also note that the emit method does do any default + // action, it only returns a value to indicate if the default action should take + // place. For example, emiting a keypress event would not cause a character + // to appear in a textbox. + // example: + // To fire our own click event + // | on.emit(dojo.byId("button"), "click", { + // | cancelable: true, + // | bubbles: true, + // | screenX: 33, + // | screenY: 44 + // | }); + // We can also fire our own custom events: + // | on.emit(dojo.byId("slider"), "slide", { + // | cancelable: true, + // | bubbles: true, + // | direction: "left-to-right" + // | }); + var args = slice.call(arguments, 2); + var method = "on" + type; + if("parentNode" in target){ + // node (or node-like), create event controller methods + var newEvent = args[0] = {}; + for(var i in event){ + newEvent[i] = event[i]; + } + newEvent.preventDefault = syntheticPreventDefault; + newEvent.stopPropagation = syntheticStopPropagation; + newEvent.target = target; + newEvent.type = type; + event = newEvent; + } + do{ + // call any node which has a handler (note that ideally we would try/catch to simulate normal event propagation but that causes too much pain for debugging) + target[method] && target[method].apply(target, args); + // and then continue up the parent node chain if it is still bubbling (if started as bubbles and stopPropagation hasn't been called) + }while(event && event.bubbles && (target = target.parentNode)); + return event && event.cancelable && event; // if it is still true (was cancelable and was cancelled), return the event to indicate default action should happen + }; + var captures = {}; + if(has("dom-addeventlistener")){ + // normalize focusin and focusout + captures = { + focusin: "focus", + focusout: "blur" + }; + if(has("opera")){ + captures.keydown = "keypress"; // this one needs to be transformed because Opera doesn't support repeating keys on keydown (and keypress works because it incorrectly fires on all keydown events) + } + + // emiter that works with native event handling + on.emit = function(target, type, event){ + if(target.dispatchEvent && document.createEvent){ + // use the native event emiting mechanism if it is available on the target object + // create a generic event + // we could create branch into the different types of event constructors, but + // that would be a lot of extra code, with little benefit that I can see, seems + // best to use the generic constructor and copy properties over, making it + // easy to have events look like the ones created with specific initializers + var nativeEvent = document.createEvent("HTMLEvents"); + nativeEvent.initEvent(type, !!event.bubbles, !!event.cancelable); + // and copy all our properties over + for(var i in event){ + var value = event[i]; + if(!(i in nativeEvent)){ + nativeEvent[i] = event[i]; + } + } + return target.dispatchEvent(nativeEvent) && nativeEvent; + } + return syntheticDispatch.apply(on, arguments); // emit for a non-node + }; + }else{ + // no addEventListener, basically old IE event normalization + on._fixEvent = function(evt, sender){ + // summary: + // normalizes properties on the event object including event + // bubbling methods, keystroke normalization, and x/y positions + // evt: + // native event object + // sender: + // node to treat as "currentTarget" + if(!evt){ + var w = sender && (sender.ownerDocument || sender.document || sender).parentWindow || window; + evt = w.event; + } + if(!evt){return(evt);} + if(!evt.target){ // check to see if it has been fixed yet + evt.target = evt.srcElement; + evt.currentTarget = (sender || evt.srcElement); + if(evt.type == "mouseover"){ + evt.relatedTarget = evt.fromElement; + } + if(evt.type == "mouseout"){ + evt.relatedTarget = evt.toElement; + } + if(!evt.stopPropagation){ + evt.stopPropagation = stopPropagation; + evt.preventDefault = preventDefault; + } + switch(evt.type){ + case "keypress": + var c = ("charCode" in evt ? evt.charCode : evt.keyCode); + if (c==10){ + // CTRL-ENTER is CTRL-ASCII(10) on IE, but CTRL-ENTER on Mozilla + c=0; + evt.keyCode = 13; + }else if(c==13||c==27){ + c=0; // Mozilla considers ENTER and ESC non-printable + }else if(c==3){ + c=99; // Mozilla maps CTRL-BREAK to CTRL-c + } + // Mozilla sets keyCode to 0 when there is a charCode + // but that stops the event on IE. + evt.charCode = c; + _setKeyChar(evt); + break; + } + } + return evt; + }; + var IESignal = function(handle){ + this.handle = handle; + }; + IESignal.prototype.remove = function(){ + delete _dojoIEListeners_[this.handle]; + }; + var fixListener = function(listener){ + // this is a minimal function for closing on the previous listener with as few as variables as possible + return function(evt){ + evt = on._fixEvent(evt, this); + return listener.call(this, evt); + } + } + var fixAttach = function(target, type, listener){ + listener = fixListener(listener); + if(((target.ownerDocument ? target.ownerDocument.parentWindow : target.parentWindow || target.window || window) != top || + has("jscript") < 5.8) && + !has("config-_allow_leaks")){ + // IE will leak memory on certain handlers in frames (IE8 and earlier) and in unattached DOM nodes for JScript 5.7 and below. + // Here we use global redirection to solve the memory leaks + if(typeof _dojoIEListeners_ == "undefined"){ + _dojoIEListeners_ = []; + } + var emiter = target[type]; + if(!emiter || !emiter.listeners){ + var oldListener = emiter; + target[type] = emiter = Function('event', 'var callee = arguments.callee; for(var i = 0; i 1){ ... } + }; - d.extend(dojo.Animation, { - // duration: Integer - // The time in milliseonds the animation will take to run - duration: 350, + dojo.isIE = { + // example: + // | if(dojo.isIE > 6){ + // | // we are IE7 + // | } + }; - /*===== - // curve: dojo._Line|Array - // A two element array of start and end values, or a `dojo._Line` instance to be - // used in the Animation. - curve: null, + dojo.isSafari = { + // example: + // | if(dojo.isSafari){ ... } + // example: + // Detect iPhone: + // | if(dojo.isSafari && navigator.userAgent.indexOf("iPhone") != -1){ + // | // we are iPhone. Note, iPod touch reports "iPod" above and fails this test. + // | } + }; - // easing: Function? - // A Function to adjust the acceleration (or deceleration) of the progress - // across a dojo._Line - easing: null, + dojo.mixin(dojo, { + // isBrowser: Boolean + // True if the client is a web-browser + isBrowser: true, + // isFF: Number | undefined + // Version as a Number if client is FireFox. undefined otherwise. Corresponds to + // major detected FireFox version (1.5, 2, 3, etc.) + isFF: 2, + // isIE: Number | undefined + // Version as a Number if client is MSIE(PC). undefined otherwise. Corresponds to + // major detected IE version (6, 7, 8, etc.) + isIE: 6, + // isKhtml: Number | undefined + // Version as a Number if client is a KHTML browser. undefined otherwise. Corresponds to major + // detected version. + isKhtml: 0, + // isWebKit: Number | undefined + // Version as a Number if client is a WebKit-derived browser (Konqueror, + // Safari, Chrome, etc.). undefined otherwise. + isWebKit: 0, + // isMozilla: Number | undefined + // Version as a Number if client is a Mozilla-based browser (Firefox, + // SeaMonkey). undefined otherwise. Corresponds to major detected version. + isMozilla: 0, + // isOpera: Number | undefined + // Version as a Number if client is Opera. undefined otherwise. Corresponds to + // major detected version. + isOpera: 0, + // isSafari: Number | undefined + // Version as a Number if client is Safari or iPhone. undefined otherwise. + isSafari: 0, + // isChrome: Number | undefined + // Version as a Number if client is Chrome browser. undefined otherwise. + isChrome: 0, + // isMac: Boolean + // True if the client runs on Mac + isMac: 0, + // isIos: Boolean + // True if client is iPhone, iPod, or iPad + isIos: 0, + // isAndroid: Number | undefined + // Version as a Number if client is android browser. undefined otherwise. + isAndroid: 0, + // isWii: Boolean + // True if client is Wii + isWii: 0 + }); =====*/ - // repeat: Integer? - // The number of times to loop the animation - repeat: 0, + // fill in the rendering support information in dojo.render.* + if(dua.indexOf("AdobeAIR") >= 0){ isAIR = 1; } + isKhtml = (dav.indexOf("Konqueror") >= 0) ? tv : 0; + isWebKit = parseFloat(dua.split("WebKit/")[1]) || undefined; + isChrome = parseFloat(dua.split("Chrome/")[1]) || undefined; + isMac = dav.indexOf("Macintosh") >= 0; + isIos = /iPhone|iPod|iPad/.test(dua); + isAndroid = parseFloat(dua.split("Android ")[1]) || undefined; + isWii = typeof opera != "undefined" && opera.wiiremote; + + // safari detection derived from: + // http://developer.apple.com/internet/safari/faq.html#anchor2 + // http://developer.apple.com/internet/safari/uamatrix.html + var index = Math.max(dav.indexOf("WebKit"), dav.indexOf("Safari"), 0); + if(index && !isChrome){ + // try to grab the explicit Safari version first. If we don't get + // one, look for less than 419.3 as the indication that we're on something + // "Safari 2-ish". + isSafari = parseFloat(dav.split("Version/")[1]); + if(!isSafari || parseFloat(dav.substr(index + 7)) <= 419.3){ + isSafari = 2; + } + } - // rate: Integer? - // the time in milliseconds to wait before advancing to next frame - // (used as a fps timer: 1000/rate = fps) - rate: 20 /* 50 fps */, + if (!has("dojo-webkit")) { + if(dua.indexOf("Opera") >= 0){ + isOpera = tv; + // see http://dev.opera.com/articles/view/opera-ua-string-changes and http://www.useragentstring.com/pages/Opera/ + // 9.8 has both styles; <9.8, 9.9 only old style + if(isOpera >= 9.8){ + isOpera = parseFloat(dua.split("Version/")[1]) || tv; + } + } + + if(dua.indexOf("Gecko") >= 0 && !isKhtml && !isWebKit){ + isMozilla = isMoz = tv; + } + if(isMoz){ + //We really need to get away from this. Consider a sane isGecko approach for the future. + isFF = parseFloat(dua.split("Firefox/")[1] || dua.split("Minefield/")[1]) || undefined; + } + if(document.all && !isOpera){ + isIE = parseFloat(dav.split("MSIE ")[1]) || undefined; + //In cases where the page has an HTTP header or META tag with + //X-UA-Compatible, then it is in emulation mode. + //Make sure isIE reflects the desired version. + //document.documentMode of 5 means quirks mode. + //Only switch the value if documentMode's major version + //is different from isIE's major version. + var mode = document.documentMode; + if(mode && mode != 5 && Math.floor(isIE) != mode){ + isIE = mode; + } + } + } + + isQuirks = document.compatMode == "BackCompat"; + + hasAdd("opera", dojo.isOpera = isOpera); + hasAdd("air", dojo.isAIR = isAIR); + hasAdd("khtml", dojo.isKhtml = isKhtml); + hasAdd("webkit", dojo.isWebKit = isWebKit); + hasAdd("chrome", dojo.isChrome = isChrome); + hasAdd("mac", dojo.isMac = isMac ); + hasAdd("safari", dojo.isSafari = isSafari); + hasAdd("mozilla", dojo.isMozilla = dojo.isMoz = isMozilla ); + hasAdd("ie", dojo.isIE = isIE ); + hasAdd("ff", dojo.isFF = isFF); + hasAdd("quirks", dojo.isQuirks = isQuirks); + hasAdd("ios", dojo.isIos = isIos); + hasAdd("android", dojo.isAndroid = isAndroid); + + dojo.locale = dojo.locale || (isIE ? n.userLanguage : n.language).toLowerCase(); + + return has; +}); + +}, +'dojo/_base/array':function(){ +define("dojo/_base/array", ["./kernel", "../has", "./lang"], function(dojo, has, lang){ + // module: + // dojo/_base/array + // summary: + // This module defines the Javascript v1.6 array extensions. /*===== - // delay: Integer? - // The time in milliseconds to wait before starting animation after it - // has been .play()'ed - delay: null, + dojo.indexOf = function(arr, value, fromIndex, findLast){ + // summary: + // locates the first index of the provided value in the + // passed array. If the value is not found, -1 is returned. + // description: + // This method corresponds to the JavaScript 1.6 Array.indexOf method, with one difference: when + // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript + // 1.6's indexOf skips the holes in the sparse array. + // For details on this method, see: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/indexOf + // arr: Array + // value: Object + // fromIndex: Integer? + // findLast: Boolean? + // returns: Number + }; + dojo.lastIndexOf = function(arr, value, fromIndex){ + // summary: + // locates the last index of the provided value in the passed + // array. If the value is not found, -1 is returned. + // description: + // This method corresponds to the JavaScript 1.6 Array.lastIndexOf method, with one difference: when + // run over sparse arrays, the Dojo function invokes the callback for every index whereas JavaScript + // 1.6's lastIndexOf skips the holes in the sparse array. + // For details on this method, see: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/lastIndexOf + // arr: Array, + // value: Object, + // fromIndex: Integer? + // returns: Number + }; + dojo.forEach = function(arr, callback, thisObject){ + // summary: + // for every item in arr, callback is invoked. Return values are ignored. + // If you want to break out of the loop, consider using dojo.every() or dojo.some(). + // forEach does not allow breaking out of the loop over the items in arr. + // arr: + // the array to iterate over. If a string, operates on individual characters. + // callback: + // a function is invoked with three arguments: item, index, and array + // thisObject: + // may be used to scope the call to callback + // description: + // This function corresponds to the JavaScript 1.6 Array.forEach() method, with one difference: when + // run over sparse arrays, this implementation passes the "holes" in the sparse array to + // the callback function with a value of undefined. JavaScript 1.6's forEach skips the holes in the sparse array. + // For more details, see: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach + // example: + // | // log out all members of the array: + // | dojo.forEach( + // | [ "thinger", "blah", "howdy", 10 ], + // | function(item){ + // | console.log(item); + // | } + // | ); + // example: + // | // log out the members and their indexes + // | dojo.forEach( + // | [ "thinger", "blah", "howdy", 10 ], + // | function(item, idx, arr){ + // | console.log(item, "at index:", idx); + // | } + // | ); + // example: + // | // use a scoped object member as the callback + // | + // | var obj = { + // | prefix: "logged via obj.callback:", + // | callback: function(item){ + // | console.log(this.prefix, item); + // | } + // | }; + // | + // | // specifying the scope function executes the callback in that scope + // | dojo.forEach( + // | [ "thinger", "blah", "howdy", 10 ], + // | obj.callback, + // | obj + // | ); + // | + // | // alternately, we can accomplish the same thing with dojo.hitch() + // | dojo.forEach( + // | [ "thinger", "blah", "howdy", 10 ], + // | dojo.hitch(obj, "callback") + // | ); + // arr: Array|String + // callback: Function|String + // thisObject: Object? + }; + dojo.every = function(arr, callback, thisObject){ + // summary: + // Determines whether or not every item in arr satisfies the + // condition implemented by callback. + // arr: Array|String + // the array to iterate on. If a string, operates on individual characters. + // callback: Function|String + // a function is invoked with three arguments: item, index, + // and array and returns true if the condition is met. + // thisObject: Object? + // may be used to scope the call to callback + // returns: Boolean + // description: + // This function corresponds to the JavaScript 1.6 Array.every() method, with one difference: when + // run over sparse arrays, this implementation passes the "holes" in the sparse array to + // the callback function with a value of undefined. JavaScript 1.6's every skips the holes in the sparse array. + // For more details, see: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/every + // example: + // | // returns false + // | dojo.every([1, 2, 3, 4], function(item){ return item>1; }); + // example: + // | // returns true + // | dojo.every([1, 2, 3, 4], function(item){ return item>0; }); + }; + dojo.some = function(arr, callback, thisObject){ + // summary: + // Determines whether or not any item in arr satisfies the + // condition implemented by callback. + // arr: Array|String + // the array to iterate over. If a string, operates on individual characters. + // callback: Function|String + // a function is invoked with three arguments: item, index, + // and array and returns true if the condition is met. + // thisObject: Object? + // may be used to scope the call to callback + // returns: Boolean + // description: + // This function corresponds to the JavaScript 1.6 Array.some() method, with one difference: when + // run over sparse arrays, this implementation passes the "holes" in the sparse array to + // the callback function with a value of undefined. JavaScript 1.6's some skips the holes in the sparse array. + // For more details, see: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/some + // example: + // | // is true + // | dojo.some([1, 2, 3, 4], function(item){ return item>1; }); + // example: + // | // is false + // | dojo.some([1, 2, 3, 4], function(item){ return item<1; }); + }; + dojo.map = function(arr, callback, thisObject){ + // summary: + // applies callback to each element of arr and returns + // an Array with the results + // arr: Array|String + // the array to iterate on. If a string, operates on + // individual characters. + // callback: Function|String + // a function is invoked with three arguments, (item, index, + // array), and returns a value + // thisObject: Object? + // may be used to scope the call to callback + // returns: Array + // description: + // This function corresponds to the JavaScript 1.6 Array.map() method, with one difference: when + // run over sparse arrays, this implementation passes the "holes" in the sparse array to + // the callback function with a value of undefined. JavaScript 1.6's map skips the holes in the sparse array. + // For more details, see: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map + // example: + // | // returns [2, 3, 4, 5] + // | dojo.map([1, 2, 3, 4], function(item){ return item+1 }); + }; + dojo.filter = function(arr, callback, thisObject){ + // summary: + // Returns a new Array with those items from arr that match the + // condition implemented by callback. + // arr: Array + // the array to iterate over. + // callback: Function|String + // a function that is invoked with three arguments (item, + // index, array). The return of this function is expected to + // be a boolean which determines whether the passed-in item + // will be included in the returned array. + // thisObject: Object? + // may be used to scope the call to callback + // returns: Array + // description: + // This function corresponds to the JavaScript 1.6 Array.filter() method, with one difference: when + // run over sparse arrays, this implementation passes the "holes" in the sparse array to + // the callback function with a value of undefined. JavaScript 1.6's filter skips the holes in the sparse array. + // For more details, see: + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter + // example: + // | // returns [2, 3, 4] + // | dojo.filter([1, 2, 3, 4], function(item){ return item>1; }); + }; + =====*/ - // beforeBegin: Event? - // Synthetic event fired before a dojo.Animation begins playing (synchronous) - beforeBegin: null, + // our old simple function builder stuff + var cache = {}, u, array; // the export object - // onBegin: Event? - // Synthetic event fired as a dojo.Animation begins playing (useful?) - onBegin: null, + function clearCache(){ + cache = {}; + } - // onAnimate: Event? - // Synthetic event fired at each interval of a `dojo.Animation` - onAnimate: null, + function buildFn(fn){ + return cache[fn] = new Function("item", "index", "array", fn); // Function + } + // magic snippet: if(typeof fn == "string") fn = cache[fn] || buildFn(fn); - // onEnd: Event? - // Synthetic event fired after the final frame of a `dojo.Animation` - onEnd: null, + // every & some - // onPlay: Event? - // Synthetic event fired any time a `dojo.Animation` is play()'ed - onPlay: null, + function everyOrSome(some){ + var every = !some; + return function(a, fn, o){ + var i = 0, l = a && a.length || 0, result; + if(l && typeof a == "string") a = a.split(""); + if(typeof fn == "string") fn = cache[fn] || buildFn(fn); + if(o){ + for(; i < l; ++i){ + result = !fn.call(o, a[i], i, a); + if(some ^ result){ + return !result; + } + } + }else{ + for(; i < l; ++i){ + result = !fn(a[i], i, a); + if(some ^ result){ + return !result; + } + } + } + return every; // Boolean + } + } + // var every = everyOrSome(false), some = everyOrSome(true); - // onPause: Event? - // Synthetic event fired when a `dojo.Animation` is paused - onPause: null, + // indexOf, lastIndexOf - // onStop: Event - // Synthetic event fires when a `dojo.Animation` is stopped - onStop: null, + function index(up){ + var delta = 1, lOver = 0, uOver = 0; + if(!up){ + delta = lOver = uOver = -1; + } + return function(a, x, from, last){ + if(last && delta > 0){ + // TODO: why do we use a non-standard signature? why do we need "last"? + return array.lastIndexOf(a, x, from); + } + var l = a && a.length || 0, end = up ? l + uOver : lOver, i; + if(from === u){ + i = up ? lOver : l + uOver; + }else{ + if(from < 0){ + i = l + from; + if(i < 0){ + i = lOver; + } + }else{ + i = from >= l ? l + uOver : from; + } + } + if(l && typeof a == "string") a = a.split(""); + for(; i != end; i += delta){ + if(a[i] == x){ + return i; // Number + } + } + return -1; // Number + } + } + // var indexOf = index(true), lastIndexOf = index(false); - =====*/ + function forEach(a, fn, o){ + var i = 0, l = a && a.length || 0; + if(l && typeof a == "string") a = a.split(""); + if(typeof fn == "string") fn = cache[fn] || buildFn(fn); + if(o){ + for(; i < l; ++i){ + fn.call(o, a[i], i, a); + } + }else{ + for(; i < l; ++i){ + fn(a[i], i, a); + } + } + } - _percent: 0, - _startRepeatCount: 0, + function map(a, fn, o, Ctr){ + // TODO: why do we have a non-standard signature here? do we need "Ctr"? + var i = 0, l = a && a.length || 0, out = new (Ctr || Array)(l); + if(l && typeof a == "string") a = a.split(""); + if(typeof fn == "string") fn = cache[fn] || buildFn(fn); + if(o){ + for(; i < l; ++i){ + out[i] = fn.call(o, a[i], i, a); + } + }else{ + for(; i < l; ++i){ + out[i] = fn(a[i], i, a); + } + } + return out; // Array + } - _getStep: function(){ - var _p = this._percent, - _e = this.easing - ; - return _e ? _e(_p) : _p; - }, - _fire: function(/*Event*/ evt, /*Array?*/ args){ - // summary: - // Convenience function. Fire event "evt" and pass it the - // arguments specified in "args". - // description: - // Convenience function. Fire event "evt" and pass it the - // arguments specified in "args". - // Fires the callback in the scope of the `dojo.Animation` - // instance. - // evt: - // The event to fire. - // args: - // The arguments to pass to the event. - var a = args||[]; - if(this[evt]){ - if(d.config.debugAtAllCosts){ - this[evt].apply(this, a); - }else{ - try{ - this[evt].apply(this, a); - }catch(e){ - // squelch and log because we shouldn't allow exceptions in - // synthetic event handlers to cause the internal timer to run - // amuck, potentially pegging the CPU. I'm not a fan of this - // squelch, but hopefully logging will make it clear what's - // going on - console.error("exception in animation handler for:", evt); - console.error(e); - } + function filter(a, fn, o){ + // TODO: do we need "Ctr" here like in map()? + var i = 0, l = a && a.length || 0, out = [], value; + if(l && typeof a == "string") a = a.split(""); + if(typeof fn == "string") fn = cache[fn] || buildFn(fn); + if(o){ + for(; i < l; ++i){ + value = a[i]; + if(fn.call(o, value, i, a)){ + out.push(value); } } - return this; // dojo.Animation - }, + }else{ + for(; i < l; ++i){ + value = a[i]; + if(fn(value, i, a)){ + out.push(value); + } + } + } + return out; // Array + } - play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){ - // summary: - // Start the animation. - // delay: - // How many milliseconds to delay before starting. - // gotoStart: - // If true, starts the animation from the beginning; otherwise, - // starts it from its current position. - // returns: dojo.Animation - // The instance to allow chaining. + array = { + every: everyOrSome(false), + some: everyOrSome(true), + indexOf: index(true), + lastIndexOf: index(false), + forEach: forEach, + map: map, + filter: filter, + clearCache: clearCache + }; - var _t = this; - if(_t._delayTimer){ _t._clearTimer(); } - if(gotoStart){ - _t._stopTimer(); - _t._active = _t._paused = false; - _t._percent = 0; - }else if(_t._active && !_t._paused){ - return _t; + 1 && lang.mixin(dojo, array); + + /*===== return dojo.array; =====*/ + return array; +}); + +}, +'dojo/_base/json':function(){ +define(["./kernel", "../json"], function(dojo, json){ + // module: + // dojo/_base/json + // summary: + // This module defines the dojo JSON API. + +dojo.fromJson = function(/*String*/ js){ + // summary: + // Parses a JavaScript expression and returns a JavaScript value. + // description: + // Throws for invalid JavaScript expressions. It does not use a strict JSON parser. It + // always delegates to eval(). The content passed to this method must therefore come + // from a trusted source. + // It is recommend that you use dojo/json's parse function for an + // implementation uses the (faster) native JSON parse when available. + // js: + // a string literal of a JavaScript expression, for instance: + // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'` + + return eval("(" + js + ")"); // Object +}; + +/*===== +dojo._escapeString = function(){ + // summary: + // Adds escape sequences for non-visual characters, double quote and + // backslash and surrounds with double quotes to form a valid string + // literal. +}; +=====*/ +dojo._escapeString = json.stringify; // just delegate to json.stringify + +dojo.toJsonIndentStr = "\t"; +dojo.toJson = function(/*Object*/ it, /*Boolean?*/ prettyPrint){ + // summary: + // Returns a [JSON](http://json.org) serialization of an object. + // description: + // Returns a [JSON](http://json.org) serialization of an object. + // Note that this doesn't check for infinite recursion, so don't do that! + // It is recommend that you use dojo/json's stringify function for an lighter + // and faster implementation that matches the native JSON API and uses the + // native JSON serializer when available. + // it: + // an object to be serialized. Objects may define their own + // serialization via a special "__json__" or "json" function + // property. If a specialized serializer has been defined, it will + // be used as a fallback. + // Note that in 1.6, toJson would serialize undefined, but this no longer supported + // since it is not supported by native JSON serializer. + // prettyPrint: + // if true, we indent objects and arrays to make the output prettier. + // The variable `dojo.toJsonIndentStr` is used as the indent string -- + // to use something other than the default (tab), change that variable + // before calling dojo.toJson(). + // Note that if native JSON support is available, it will be used for serialization, + // and native implementations vary on the exact spacing used in pretty printing. + // returns: + // A JSON string serialization of the passed-in object. + // example: + // simple serialization of a trivial object + // | var jsonStr = dojo.toJson({ howdy: "stranger!", isStrange: true }); + // | doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr); + // example: + // a custom serializer for an objects of a particular class: + // | dojo.declare("Furby", null, { + // | furbies: "are strange", + // | furbyCount: 10, + // | __json__: function(){ + // | }, + // | }); + + // use dojo/json + return json.stringify(it, function(key, value){ + if(value){ + var tf = value.__json__||value.json; + if(typeof tf == "function"){ + return tf.call(value); } + } + return value; + }, prettyPrint && dojo.toJsonIndentStr); // String +}; - _t._fire("beforeBegin", [_t.node]); +return dojo; +}); - var de = delay || _t.delay, - _p = dojo.hitch(_t, "_play", gotoStart); +}, +'dojo/dom-class':function(){ +define(["./_base/lang", "./_base/array", "./dom"], function(lang, array, dom){ + // module: + // dojo/dom-class + // summary: + // This module defines the core dojo DOM class API. - if(de > 0){ - _t._delayTimer = setTimeout(_p, de); - return _t; - } - _p(); - return _t; - }, + var className = "className"; - _play: function(gotoStart){ - var _t = this; - if(_t._delayTimer){ _t._clearTimer(); } - _t._startTime = new Date().valueOf(); - if(_t._paused){ - _t._startTime -= _t.duration * _t._percent; - } + /* Part I of classList-based implementation is preserved here for posterity + var classList = "classList"; + has.add("dom-classList", function(){ + return classList in document.createElement("p"); + }); + */ - _t._active = true; - _t._paused = false; - var value = _t.curve.getValue(_t._getStep()); - if(!_t._percent){ - if(!_t._startRepeatCount){ - _t._startRepeatCount = _t.repeat; - } - _t._fire("onBegin", [value]); - } + // ============================= + // (CSS) Class Functions + // ============================= - _t._fire("onPlay", [value]); + /*===== + dojo.hasClass = function(node, classStr){ + // summary: + // Returns whether or not the specified classes are a portion of the + // class list currently applied to the node. + // + // node: String|DOMNode + // String ID or DomNode reference to check the class for. + // + // classStr: String + // A string class name to look for. + // + // returns: Boolean + // + // example: + // Do something if a node with id="someNode" has class="aSillyClassName" present + // | if(dojo.hasClass("someNode","aSillyClassName")){ ... } + }; + =====*/ - _t._cycle(); - return _t; // dojo.Animation - }, + /*===== + dojo.addClass = function(node, classStr){ + // summary: + // Adds the specified classes to the end of the class list on the + // passed node. Will not re-apply duplicate classes. + // + // node: String|DOMNode + // String ID or DomNode reference to add a class string too + // + // classStr: String|Array + // A String class name to add, or several space-separated class names, + // or an array of class names. + // + // example: + // Add a class to some node: + // | dojo.addClass("someNode", "anewClass"); + // + // example: + // Add two classes at once: + // | dojo.addClass("someNode", "firstClass secondClass"); + // + // example: + // Add two classes at once (using array): + // | dojo.addClass("someNode", ["firstClass", "secondClass"]); + // + // example: + // Available in `dojo.NodeList` for multiple additions + // | dojo.query("ul > li").addClass("firstLevel"); + }; + =====*/ - pause: function(){ - // summary: Pauses a running animation. - var _t = this; - if(_t._delayTimer){ _t._clearTimer(); } - _t._stopTimer(); - if(!_t._active){ return _t; /*dojo.Animation*/ } - _t._paused = true; - _t._fire("onPause", [_t.curve.getValue(_t._getStep())]); - return _t; // dojo.Animation - }, + /*===== + dojo.removeClass = function(node, classStr){ + // summary: + // Removes the specified classes from node. No `dojo.hasClass` + // check is required. + // + // node: String|DOMNode + // String ID or DomNode reference to remove the class from. + // + // classStr: String|Array + // An optional String class name to remove, or several space-separated + // class names, or an array of class names. If omitted, all class names + // will be deleted. + // + // example: + // Remove a class from some node: + // | dojo.removeClass("someNode", "firstClass"); + // + // example: + // Remove two classes from some node: + // | dojo.removeClass("someNode", "firstClass secondClass"); + // + // example: + // Remove two classes from some node (using array): + // | dojo.removeClass("someNode", ["firstClass", "secondClass"]); + // + // example: + // Remove all classes from some node: + // | dojo.removeClass("someNode"); + // + // example: + // Available in `dojo.NodeList()` for multiple removal + // | dojo.query(".foo").removeClass("foo"); + }; + =====*/ - gotoPercent: function(/*Decimal*/ percent, /*Boolean?*/ andPlay){ - // summary: - // Sets the progress of the animation. - // percent: - // A percentage in decimal notation (between and including 0.0 and 1.0). - // andPlay: - // If true, play the animation after setting the progress. - var _t = this; - _t._stopTimer(); - _t._active = _t._paused = true; - _t._percent = percent; - if(andPlay){ _t.play(); } - return _t; // dojo.Animation - }, + /*===== + dojo.replaceClass = function(node, addClassStr, removeClassStr){ + // summary: + // Replaces one or more classes on a node if not present. + // Operates more quickly than calling dojo.removeClass and dojo.addClass + // + // node: String|DOMNode + // String ID or DomNode reference to remove the class from. + // + // addClassStr: String|Array + // A String class name to add, or several space-separated class names, + // or an array of class names. + // + // removeClassStr: String|Array? + // A String class name to remove, or several space-separated class names, + // or an array of class names. + // + // example: + // | dojo.replaceClass("someNode", "add1 add2", "remove1 remove2"); + // + // example: + // Replace all classes with addMe + // | dojo.replaceClass("someNode", "addMe"); + // + // example: + // Available in `dojo.NodeList()` for multiple toggles + // | dojo.query(".findMe").replaceClass("addMe", "removeMe"); + }; + =====*/ - stop: function(/*boolean?*/ gotoEnd){ - // summary: Stops a running animation. - // gotoEnd: If true, the animation will end. - var _t = this; - if(_t._delayTimer){ _t._clearTimer(); } - if(!_t._timer){ return _t; /* dojo.Animation */ } - _t._stopTimer(); - if(gotoEnd){ - _t._percent = 1; - } - _t._fire("onStop", [_t.curve.getValue(_t._getStep())]); - _t._active = _t._paused = false; - return _t; // dojo.Animation - }, + /*===== + dojo.toggleClass = function(node, classStr, condition){ + // summary: + // Adds a class to node if not present, or removes if present. + // Pass a boolean condition if you want to explicitly add or remove. + // Returns the condition that was specified directly or indirectly. + // + // node: String|DOMNode + // String ID or DomNode reference to toggle a class string + // + // classStr: String|Array + // A String class name to toggle, or several space-separated class names, + // or an array of class names. + // + // condition: + // If passed, true means to add the class, false means to remove. + // Otherwise dojo.hasClass(node, classStr) is used to detect the class presence. + // + // example: + // | dojo.toggleClass("someNode", "hovered"); + // + // example: + // Forcefully add a class + // | dojo.toggleClass("someNode", "hovered", true); + // + // example: + // Available in `dojo.NodeList()` for multiple toggles + // | dojo.query(".toggleMe").toggleClass("toggleMe"); + }; + =====*/ - status: function(){ - // summary: - // Returns a string token representation of the status of - // the animation, one of: "paused", "playing", "stopped" - if(this._active){ - return this._paused ? "paused" : "playing"; // String + var cls, // exports object + spaces = /\s+/, a1 = [""]; + + function str2array(s){ + if(typeof s == "string" || s instanceof String){ + if(s && !spaces.test(s)){ + a1[0] = s; + return a1; } - return "stopped"; // String - }, + var a = s.split(spaces); + if(a.length && !a[0]){ + a.shift(); + } + if(a.length && !a[a.length - 1]){ + a.pop(); + } + return a; + } + // assumed to be an array + if(!s){ + return []; + } + return array.filter(s, function(x){ return x; }); + } - _cycle: function(){ - var _t = this; - if(_t._active){ - var curr = new Date().valueOf(); - var step = (curr - _t._startTime) / (_t.duration); + /* Part II of classList-based implementation is preserved here for posterity + if(has("dom-classList")){ + // new classList version + cls = { + contains: function containsClass(node, classStr){ + var clslst = classStr && dom.byId(node)[classList]; + return clslst && clslst.contains(classStr); // Boolean + }, - if(step >= 1){ - step = 1; + add: function addClass(node, classStr){ + node = dom.byId(node); + classStr = str2array(classStr); + for(var i = 0, len = classStr.length; i < len; ++i){ + node[classList].add(classStr[i]); } - _t._percent = step; + }, - // Perform easing - if(_t.easing){ - step = _t.easing(step); + remove: function removeClass(node, classStr){ + node = dom.byId(node); + if(classStr === undefined){ + node[className] = ""; + }else{ + classStr = str2array(classStr); + for(var i = 0, len = classStr.length; i < len; ++i){ + node[classList].remove(classStr[i]); + } } + }, - _t._fire("onAnimate", [_t.curve.getValue(step)]); - - if(_t._percent < 1){ - _t._startTimer(); + replace: function replaceClass(node, addClassStr, removeClassStr){ + node = dom.byId(node); + if(removeClassStr === undefined){ + node[className] = ""; }else{ - _t._active = false; + removeClassStr = str2array(removeClassStr); + for(var i = 0, len = removeClassStr.length; i < len; ++i){ + node[classList].remove(removeClassStr[i]); + } + } + addClassStr = str2array(addClassStr); + for(i = 0, len = addClassStr.length; i < len; ++i){ + node[classList].add(addClassStr[i]); + } + }, - if(_t.repeat > 0){ - _t.repeat--; - _t.play(null, true); - }else if(_t.repeat == -1){ - _t.play(null, true); - }else{ - if(_t._startRepeatCount){ - _t.repeat = _t._startRepeatCount; - _t._startRepeatCount = 0; - } + toggle: function toggleClass(node, classStr, condition){ + node = dom.byId(node); + if(condition === undefined){ + classStr = str2array(classStr); + for(var i = 0, len = classStr.length; i < len; ++i){ + node[classList].toggle(classStr[i]); } - _t._percent = 0; - _t._fire("onEnd", [_t.node]); - !_t.repeat && _t._stopTimer(); + }else{ + cls[condition ? "add" : "remove"](node, classStr); + } + return condition; // Boolean + } + } + } + */ + + // regular DOM version + var fakeNode = {}; // for effective replacement + cls = { + contains: function containsClass(/*DomNode|String*/node, /*String*/classStr){ + return ((" " + dom.byId(node)[className] + " ").indexOf(" " + classStr + " ") >= 0); // Boolean + }, + + add: function addClass(/*DomNode|String*/node, /*String|Array*/classStr){ + node = dom.byId(node); + classStr = str2array(classStr); + var cls = node[className], oldLen; + cls = cls ? " " + cls + " " : " "; + oldLen = cls.length; + for(var i = 0, len = classStr.length, c; i < len; ++i){ + c = classStr[i]; + if(c && cls.indexOf(" " + c + " ") < 0){ + cls += c + " "; + } + } + if(oldLen < cls.length){ + node[className] = cls.substr(1, cls.length - 2); + } + }, + + remove: function removeClass(/*DomNode|String*/node, /*String|Array?*/classStr){ + node = dom.byId(node); + var cls; + if(classStr !== undefined){ + classStr = str2array(classStr); + cls = " " + node[className] + " "; + for(var i = 0, len = classStr.length; i < len; ++i){ + cls = cls.replace(" " + classStr[i] + " ", " "); } + cls = lang.trim(cls); + }else{ + cls = ""; } - return _t; // dojo.Animation + if(node[className] != cls){ node[className] = cls; } }, - _clearTimer: function(){ - // summary: Clear the play delay timer - clearTimeout(this._delayTimer); - delete this._delayTimer; + replace: function replaceClass(/*DomNode|String*/node, /*String|Array*/addClassStr, /*String|Array?*/removeClassStr){ + node = dom.byId(node); + fakeNode[className] = node[className]; + cls.remove(fakeNode, removeClassStr); + cls.add(fakeNode, addClassStr); + if(node[className] !== fakeNode[className]){ + node[className] = fakeNode[className]; + } + }, + + toggle: function toggleClass(/*DomNode|String*/node, /*String|Array*/classStr, /*Boolean?*/condition){ + node = dom.byId(node); + if(condition === undefined){ + classStr = str2array(classStr); + for(var i = 0, len = classStr.length, c; i < len; ++i){ + c = classStr[i]; + cls[cls.contains(node, c) ? "remove" : "add"](node, c); + } + }else{ + cls[condition ? "add" : "remove"](node, classStr); + } + return condition; // Boolean } + }; - }); + return cls; +}); - // the local timer, stubbed into all Animation instances - var ctr = 0, - timer = null, - runner = { - run: function(){} - }; +}, +'dojo/_base/window':function(){ +define(["./kernel", "../has", "./sniff"], function(dojo, has){ + // module: + // dojo/window + // summary: + // This module provides an API to save/set/restore the global/document scope. - d.extend(d.Animation, { +/*===== +dojo.doc = { + // summary: + // Alias for the current document. 'dojo.doc' can be modified + // for temporary context shifting. Also see dojo.withDoc(). + // description: + // Refer to dojo.doc rather + // than referring to 'window.document' to ensure your code runs + // correctly in managed contexts. + // example: + // | n.appendChild(dojo.doc.createElement('div')); +} +=====*/ +dojo.doc = this["document"] || null; - _startTimer: function(){ - if(!this._timer){ - this._timer = d.connect(runner, "run", this, "_cycle"); - ctr++; - } - if(!timer){ - timer = setInterval(d.hitch(runner, "run"), this.rate); - } - }, +dojo.body = function(){ + // summary: + // Return the body element of the document + // return the body object associated with dojo.doc + // example: + // | dojo.body().appendChild(dojo.doc.createElement('div')); - _stopTimer: function(){ - if(this._timer){ - d.disconnect(this._timer); - this._timer = null; - ctr--; - } - if(ctr <= 0){ - clearInterval(timer); - timer = null; - ctr = 0; + // Note: document.body is not defined for a strict xhtml document + // Would like to memoize this, but dojo.doc can change vi dojo.withDoc(). + return dojo.doc.body || dojo.doc.getElementsByTagName("body")[0]; // Node +}; + +dojo.setContext = function(/*Object*/globalObject, /*DocumentElement*/globalDocument){ + // summary: + // changes the behavior of many core Dojo functions that deal with + // namespace and DOM lookup, changing them to work in a new global + // context (e.g., an iframe). The varibles dojo.global and dojo.doc + // are modified as a result of calling this function and the result of + // `dojo.body()` likewise differs. + dojo.global = ret.global = globalObject; + dojo.doc = ret.doc = globalDocument; +}; + +dojo.withGlobal = function( /*Object*/globalObject, + /*Function*/callback, + /*Object?*/thisObject, + /*Array?*/cbArguments){ + // summary: + // Invoke callback with globalObject as dojo.global and + // globalObject.document as dojo.doc. + // description: + // Invoke callback with globalObject as dojo.global and + // globalObject.document as dojo.doc. If provided, globalObject + // will be executed in the context of object thisObject + // When callback() returns or throws an error, the dojo.global + // and dojo.doc will be restored to its previous state. + + var oldGlob = dojo.global; + try{ + dojo.global = ret.global = globalObject; + return dojo.withDoc.call(null, globalObject.document, callback, thisObject, cbArguments); + }finally{ + dojo.global = ret.global = oldGlob; + } +}; + +dojo.withDoc = function( /*DocumentElement*/documentObject, + /*Function*/callback, + /*Object?*/thisObject, + /*Array?*/cbArguments){ + // summary: + // Invoke callback with documentObject as dojo.doc. + // description: + // Invoke callback with documentObject as dojo.doc. If provided, + // callback will be executed in the context of object thisObject + // When callback() returns or throws an error, the dojo.doc will + // be restored to its previous state. + + var oldDoc = dojo.doc, + oldQ = dojo.isQuirks, + oldIE = dojo.isIE, isIE, mode, pwin; + + try{ + dojo.doc = ret.doc = documentObject; + // update dojo.isQuirks and the value of the has feature "quirks" + dojo.isQuirks = has.add("quirks", dojo.doc.compatMode == "BackCompat", true, true); // no need to check for QuirksMode which was Opera 7 only + + if(has("ie")){ + if((pwin = documentObject.parentWindow) && pwin.navigator){ + // re-run IE detection logic and update dojo.isIE / has("ie") + // (the only time parentWindow/navigator wouldn't exist is if we were not + // passed an actual legitimate document object) + isIE = parseFloat(pwin.navigator.appVersion.split("MSIE ")[1]) || undefined; + mode = documentObject.documentMode; + if(mode && mode != 5 && Math.floor(isIE) != mode){ + isIE = mode; + } + dojo.isIE = has.add("ie", isIE, true, true); } } - }); + if(thisObject && typeof callback == "string"){ + callback = thisObject[callback]; + } - var _makeFadeable = - d.isIE ? function(node){ - // only set the zoom if the "tickle" value would be the same as the - // default - var ns = node.style; - // don't set the width to auto if it didn't already cascade that way. - // We don't want to f anyones designs - if(!ns.width.length && d.style(node, "width") == "auto"){ - ns.width = "auto"; - } - } : - function(){}; + return callback.apply(thisObject, cbArguments || []); + }finally{ + dojo.doc = ret.doc = oldDoc; + dojo.isQuirks = has.add("quirks", oldQ, true, true); + dojo.isIE = has.add("ie", oldIE, true, true); + } +}; - dojo._fade = function(/*Object*/ args){ - // summary: - // Returns an animation that will fade the node defined by - // args.node from the start to end values passed (args.start - // args.end) (end is mandatory, start is optional) +var ret = { + global: dojo.global, + doc: dojo.doc, + body: dojo.body, + setContext: dojo.setContext, + withGlobal: dojo.withGlobal, + withDoc: dojo.withDoc +}; - args.node = d.byId(args.node); - var fArgs = _mixin({ properties: {} }, args), - props = (fArgs.properties.opacity = {}); +return ret; - props.start = !("start" in fArgs) ? - function(){ - return +d.style(fArgs.node, "opacity")||0; - } : fArgs.start; - props.end = fArgs.end; +}); - var anim = d.animateProperty(fArgs); - d.connect(anim, "beforeBegin", d.partial(_makeFadeable, fArgs.node)); +}, +'dojo/_base/config':function(){ +define(["../has", "require"], function(has, require){ + // module: + // dojo/_base/config + // summary: + // This module defines the user configuration during bootstrap. + // description: + // By defining user configuration as a module value, an entire configuration can be specified in a build, + // thereby eliminating the need for sniffing and or explicitly setting in the global variable dojoConfig. + // Also, when multiple instances of dojo exist in a single application, each will necessarily be located + // at an unique absolute module identifier as given by the package configuration. Implementing configuration + // as a module allows for specifying unique, per-instance configurations. + // example: + // Create a second instance of dojo with a different, instance-uniqe configuration (assume the loader and + // dojo.js are already loaded). + // | // specify a configuration that creates a new instance of dojo at the absolute module identifier "myDojo" + // | require({ + // | packages:[{ + // | name:"myDojo", + // | location:".", //assume baseUrl points to dojo.js + // | }] + // | }); + // | + // | // specify a configuration for the myDojo instance + // | define("myDojo/config", { + // | // normal configuration variables go here, e.g., + // | locale:"fr-ca" + // | }); + // | + // | // load and use the new instance of dojo + // | require(["myDojo"], function(dojo) { + // | // dojo is the new instance of dojo + // | // use as required + // | }); - return anim; // dojo.Animation - }; + var result = {}; + if(1){ + // must be the dojo loader; take a shallow copy of require.rawConfig + var src = require.rawConfig, p; + for(p in src){ + result[p] = src[p]; + } + }else{ + var adviseHas = function(featureSet, prefix, booting){ + for(p in featureSet){ + p!="has" && has.add(prefix + p, featureSet[p], 0, booting); + } + }; + result = 1 ? + // must be a built version of the dojo loader; all config stuffed in require.rawConfig + require.rawConfig : + // a foreign loader + this.dojoConfig || this.djConfig || {}; + adviseHas(result, "config", 1); + adviseHas(result.has, "", 1); + } + return result; - /*===== - dojo.__FadeArgs = function(node, duration, easing){ - // node: DOMNode|String - // The node referenced in the animation - // duration: Integer? - // Duration of the animation in milliseconds. - // easing: Function? - // An easing function. - this.node = node; - this.duration = duration; - this.easing = easing; +/*===== +// note: +// 'dojoConfig' does not exist under 'dojo.*' so that it can be set before the +// 'dojo' variable exists. +// note: +// Setting any of these variables *after* the library has loaded does +// nothing at all. + +// FIXME: can we document these on dojo.config object and explain they must be set via djConfig/dojoConfig global prior to loading dojo.js + +dojoConfig = { + // summary: + // Application code can set the global 'dojoConfig' prior to loading + // the library to control certain global settings for how dojo works. + // + // isDebug: Boolean + // Defaults to `false`. If set to `true`, ensures that Dojo provides + // extended debugging feedback via Firebug. If Firebug is not available + // on your platform, setting `isDebug` to `true` will force Dojo to + // pull in (and display) the version of Firebug Lite which is + // integrated into the Dojo distribution, thereby always providing a + // debugging/logging console when `isDebug` is enabled. Note that + // Firebug's `console.*` methods are ALWAYS defined by Dojo. If + // `isDebug` is false and you are on a platform without Firebug, these + // methods will be defined as no-ops. + isDebug: false, + // locale: String + // The locale to assume for loading localized resources in this page, + // specified according to [RFC 3066](http://www.ietf.org/rfc/rfc3066.txt). + // Must be specified entirely in lowercase, e.g. `en-us` and `zh-cn`. + // See the documentation for `dojo.i18n` and `dojo.requireLocalization` + // for details on loading localized resources. If no locale is specified, + // Dojo assumes the locale of the user agent, according to `navigator.userLanguage` + // or `navigator.language` properties. + locale: undefined, + // extraLocale: Array + // No default value. Specifies additional locales whose + // resources should also be loaded alongside the default locale when + // calls to `dojo.requireLocalization()` are processed. + extraLocale: undefined, + // baseUrl: String + // The directory in which `dojo.js` is located. Under normal + // conditions, Dojo auto-detects the correct location from which it + // was loaded. You may need to manually configure `baseUrl` in cases + // where you have renamed `dojo.js` or in which `` tags confuse + // some browsers (e.g. IE 6). The variable `dojo.baseUrl` is assigned + // either the value of `djConfig.baseUrl` if one is provided or the + // auto-detected root if not. Other modules are located relative to + // this path. The path should end in a slash. + baseUrl: undefined, + // modulePaths: Object + // A map of module names to paths relative to `dojo.baseUrl`. The + // key/value pairs correspond directly to the arguments which + // `dojo.registerModulePath` accepts. Specifiying + // `djConfig.modulePaths = { "foo": "../../bar" }` is the equivalent + // of calling `dojo.registerModulePath("foo", "../../bar");`. Multiple + // modules may be configured via `djConfig.modulePaths`. + modulePaths: {}, + // afterOnLoad: Boolean + // Indicates Dojo was added to the page after the page load. In this case + // Dojo will not wait for the page DOMContentLoad/load events and fire + // its dojo.addOnLoad callbacks after making sure all outstanding + // dojo.required modules have loaded. Only works with a built dojo.js, + // it does not work the dojo.js directly from source control. + afterOnLoad: false, + // addOnLoad: Function or Array + // Adds a callback via dojo.addOnLoad. Useful when Dojo is added after + // the page loads and djConfig.afterOnLoad is true. Supports the same + // arguments as dojo.addOnLoad. When using a function reference, use + // `djConfig.addOnLoad = function(){};`. For object with function name use + // `djConfig.addOnLoad = [myObject, "functionName"];` and for object with + // function reference use + // `djConfig.addOnLoad = [myObject, function(){}];` + addOnLoad: null, + // require: Array + // An array of module names to be loaded immediately after dojo.js has been included + // in a page. + require: [], + // defaultDuration: Array + // Default duration, in milliseconds, for wipe and fade animations within dijits. + // Assigned to dijit.defaultDuration. + defaultDuration: 200, + // dojoBlankHtmlUrl: String + // Used by some modules to configure an empty iframe. Used by dojo.io.iframe and + // dojo.back, and dijit popup support in IE where an iframe is needed to make sure native + // controls do not bleed through the popups. Normally this configuration variable + // does not need to be set, except when using cross-domain/CDN Dojo builds. + // Save dojo/resources/blank.html to your domain and set `djConfig.dojoBlankHtmlUrl` + // to the path on your domain your copy of blank.html. + dojoBlankHtmlUrl: undefined, + // ioPublish: Boolean? + // Set this to true to enable publishing of topics for the different phases of + // IO operations. Publishing is done via dojo.publish. See dojo.__IoPublish for a list + // of topics that are published. + ioPublish: false, + // useCustomLogger: Anything? + // If set to a value that evaluates to true such as a string or array and + // isDebug is true and Firebug is not available or running, then it bypasses + // the creation of Firebug Lite allowing you to define your own console object. + useCustomLogger: undefined, + // transparentColor: Array + // Array containing the r, g, b components used as transparent color in dojo.Color; + // if undefined, [255,255,255] (white) will be used. + transparentColor: undefined, + // skipIeDomLoaded: Boolean + // For IE only, skip the DOMContentLoaded hack used. Sometimes it can cause an Operation + // Aborted error if the rest of the page triggers script defers before the DOM is ready. + // If this is config value is set to true, then dojo.addOnLoad callbacks will not be + // triggered until the page load event, which is after images and iframes load. If you + // want to trigger the callbacks sooner, you can put a script block in the bottom of + // your HTML that calls dojo._loadInit();. If you are using multiversion support, change + // "dojo." to the appropriate scope name for dojo. + skipIeDomLoaded: false +} +=====*/ +}); + + +}, +'dojo/_base/event':function(){ +define(["./kernel", "../on", "../has", "../dom-geometry"], function(dojo, on, has, dom){ + // module: + // dojo/_base/event + // summary: + // This module defines dojo DOM event API. + if(on._fixEvent){ + var fixEvent = on._fixEvent; + on._fixEvent = function(evt, se){ + // add some additional normalization for back-compat, this isn't in on.js because it is somewhat more expensive + evt = fixEvent(evt, se); + if(evt){ + dom.normalizeEvent(evt); + } + return evt; + }; } - =====*/ - - dojo.fadeIn = function(/*dojo.__FadeArgs*/ args){ - // summary: - // Returns an animation that will fade node defined in 'args' from - // its current opacity to fully opaque. - return d._fade(_mixin({ end: 1 }, args)); // dojo.Animation - }; - - dojo.fadeOut = function(/*dojo.__FadeArgs*/ args){ + dojo.fixEvent = function(/*Event*/ evt, /*DOMNode*/ sender){ // summary: - // Returns an animation that will fade node defined in 'args' - // from its current opacity to fully transparent. - return d._fade(_mixin({ end: 0 }, args)); // dojo.Animation - }; - - dojo._defaultEasing = function(/*Decimal?*/ n){ - // summary: The default easing function for dojo.Animation(s) - return 0.5 + ((Math.sin((n + 1.5) * Math.PI)) / 2); - }; - - var PropLine = function(properties){ - // PropLine is an internal class which is used to model the values of - // an a group of CSS properties across an animation lifecycle. In - // particular, the "getValue" function handles getting interpolated - // values between start and end for a particular CSS value. - this._properties = properties; - for(var p in properties){ - var prop = properties[p]; - if(prop.start instanceof d.Color){ - // create a reusable temp color object to keep intermediate results - prop.tempColor = new d.Color(); - } + // normalizes properties on the event object including event + // bubbling methods, keystroke normalization, and x/y positions + // evt: Event + // native event object + // sender: DOMNode + // node to treat as "currentTarget" + if(on._fixEvent){ + return on._fixEvent(evt, sender); } + return evt; // Event }; + + dojo.stopEvent = function(/*Event*/ evt){ + // summary: + // prevents propagation and clobbers the default action of the + // passed event + // evt: Event + // The event object. If omitted, window.event is used on IE. + if(has("dom-addeventlistener") || (evt && evt.preventDefault)){ + evt.preventDefault(); + evt.stopPropagation(); + }else{ + evt = evt || window.event; + evt.cancelBubble = true; + on._preventDefault.call(evt); + } + }; + + return { + fix: dojo.fixEvent, + stop: dojo.stopEvent + }; +}); + +}, +'dojo/main':function(){ +define([ + "./_base/kernel", + "./has", + "require", + "./_base/sniff", + "./_base/lang", + "./_base/array", + "./ready", + "./_base/declare", + "./_base/connect", + "./_base/Deferred", + "./_base/json", + "./_base/Color", + "./has!dojo-firebug?./_firebug/firebug", + "./_base/browser", + "./_base/loader"], function(dojo, has, require, sniff, lang, array, ready){ + // module: + // dojo/main + // summary: + // This is the package main module for the dojo package; it loads dojo base appropriate for the execution environment. + + // the preferred way to load the dojo firebug console is by setting has("dojo-firebug") true in dojoConfig + // the isDebug config switch is for backcompat and will work fine in sync loading mode; it works in + // async mode too, but there's no guarantee when the module is loaded; therefore, if you need a firebug + // console guarnanteed at a particular spot in an app, either set config.has["dojo-firebug"] true before + // loading dojo.js or explicitly include dojo/_firebug/firebug in a dependency list. + if(dojo.config.isDebug){ + require(["./_firebug/firebug"]); + } - PropLine.prototype.getValue = function(r){ - var ret = {}; - for(var p in this._properties){ - var prop = this._properties[p], - start = prop.start; - if(start instanceof d.Color){ - ret[p] = d.blendColors(start, prop.end, r, prop.tempColor).toCss(); - }else if(!d.isArray(start)){ - ret[p] = ((prop.end - start) * r) + start + (p != "opacity" ? prop.units || "px" : 0); + // dojoConfig.require is deprecated; use the loader configuration property deps + true || has.add("dojo-config-require", 1); + if(1){ + var deps= dojo.config.require; + if(deps){ + // dojo.config.require may be dot notation + deps= array.map(lang.isArray(deps) ? deps : [deps], function(item){ return item.replace(/\./g, "/"); }); + if(dojo.isAsync){ + require(deps); + }else{ + // this is a bit janky; in 1.6- dojo is defined before these requires are applied; but in 1.7+ + // dojo isn't defined until returning from this module; this is only a problem in sync mode + // since we're in sync mode, we know we've got our loader with its priority ready queue + ready(1, function(){require(deps);}); } } - return ret; - }; + } - /*===== - dojo.declare("dojo.__AnimArgs", [dojo.__FadeArgs], { - // Properties: Object? - // A hash map of style properties to Objects describing the transition, - // such as the properties of dojo._Line with an additional 'units' property - properties: {} + return dojo; +}); - //TODOC: add event callbacks - }); - =====*/ +}, +'dojo/ready':function(){ +define(["./_base/kernel", "./has", "require", "./domReady", "./_base/lang"], function(dojo, has, require, domReady, lang) { + // module: + // dojo/ready + // summary: + // This module defines the dojo.ready API. + // + // note: + // This module should be unnecessary in dojo 2.0 + var + // truthy if DOMContentLoaded or better (e.g., window.onload fired) has been achieved + isDomReady = 0, - dojo.animateProperty = function(/*dojo.__AnimArgs*/ args){ - // summary: - // Returns an animation that will transition the properties of - // node defined in `args` depending how they are defined in - // `args.properties` - // - // description: - // `dojo.animateProperty` is the foundation of most `dojo.fx` - // animations. It takes an object of "properties" corresponding to - // style properties, and animates them in parallel over a set - // duration. - // - // example: - // A simple animation that changes the width of the specified node. - // | dojo.animateProperty({ - // | node: "nodeId", - // | properties: { width: 400 }, - // | }).play(); - // Dojo figures out the start value for the width and converts the - // integer specified for the width to the more expressive but - // verbose form `{ width: { end: '400', units: 'px' } }` which you - // can also specify directly. Defaults to 'px' if ommitted. - // - // example: - // Animate width, height, and padding over 2 seconds... the - // pedantic way: - // | dojo.animateProperty({ node: node, duration:2000, - // | properties: { - // | width: { start: '200', end: '400', units:"px" }, - // | height: { start:'200', end: '400', units:"px" }, - // | paddingTop: { start:'5', end:'50', units:"px" } - // | } - // | }).play(); - // Note 'paddingTop' is used over 'padding-top'. Multi-name CSS properties - // are written using "mixed case", as the hyphen is illegal as an object key. - // - // example: - // Plug in a different easing function and register a callback for - // when the animation ends. Easing functions accept values between - // zero and one and return a value on that basis. In this case, an - // exponential-in curve. - // | dojo.animateProperty({ - // | node: "nodeId", - // | // dojo figures out the start value - // | properties: { width: { end: 400 } }, - // | easing: function(n){ - // | return (n==0) ? 0 : Math.pow(2, 10 * (n - 1)); - // | }, - // | onEnd: function(node){ - // | // called when the animation finishes. The animation - // | // target is passed to this function - // | } - // | }).play(500); // delay playing half a second - // - // example: - // Like all `dojo.Animation`s, animateProperty returns a handle to the - // Animation instance, which fires the events common to Dojo FX. Use `dojo.connect` - // to access these events outside of the Animation definiton: - // | var anim = dojo.animateProperty({ - // | node:"someId", - // | properties:{ - // | width:400, height:500 - // | } - // | }); - // | dojo.connect(anim,"onEnd", function(){ - // | console.log("animation ended"); - // | }); - // | // play the animation now: - // | anim.play(); - // - // example: - // Each property can be a function whose return value is substituted along. - // Additionally, each measurement (eg: start, end) can be a function. The node - // reference is passed direcly to callbacks. - // | dojo.animateProperty({ - // | node:"mine", - // | properties:{ - // | height:function(node){ - // | // shrink this node by 50% - // | return dojo.position(node).h / 2 - // | }, - // | width:{ - // | start:function(node){ return 100; }, - // | end:function(node){ return 200; } - // | } - // | } - // | }).play(); - // + // a function to call to cause onLoad to be called when all requested modules have been loaded + requestCompleteSignal, - var n = args.node = d.byId(args.node); - if(!args.easing){ args.easing = d._defaultEasing; } + // The queue of functions waiting to execute as soon as dojo.ready conditions satisfied + loadQ = [], - var anim = new d.Animation(args); - d.connect(anim, "beforeBegin", anim, function(){ - var pm = {}; - for(var p in this.properties){ - // Make shallow copy of properties into pm because we overwrite - // some values below. In particular if start/end are functions - // we don't want to overwrite them or the functions won't be - // called if the animation is reused. - if(p == "width" || p == "height"){ - this.node.display = "block"; - } - var prop = this.properties[p]; - if(d.isFunction(prop)){ - prop = prop(n); - } - prop = pm[p] = _mixin({}, (d.isObject(prop) ? prop: { end: prop })); + // prevent recursion in onLoad + onLoadRecursiveGuard = 0, - if(d.isFunction(prop.start)){ - prop.start = prop.start(n); - } - if(d.isFunction(prop.end)){ - prop.end = prop.end(n); - } - var isColor = (p.toLowerCase().indexOf("color") >= 0); - function getStyle(node, p){ - // dojo.style(node, "height") can return "auto" or "" on IE; this is more reliable: - var v = { height: node.offsetHeight, width: node.offsetWidth }[p]; - if(v !== undefined){ return v; } - v = d.style(node, p); - return (p == "opacity") ? +v : (isColor ? v : parseFloat(v)); - } - if(!("end" in prop)){ - prop.end = getStyle(n, p); - }else if(!("start" in prop)){ - prop.start = getStyle(n, p); - } + handleDomReady = function(){ + isDomReady = 1; + dojo._postLoad = dojo.config.afterOnLoad = true; + if(loadQ.length){ + requestCompleteSignal(onLoad); + } + }, - if(isColor){ - prop.start = new d.Color(prop.start); - prop.end = new d.Color(prop.end); - }else{ - prop.start = (p == "opacity") ? +prop.start : parseFloat(prop.start); + // run the next function queued with dojo.ready + onLoad = function(){ + if(isDomReady && !onLoadRecursiveGuard && loadQ.length){ + //guard against recursions into this function + onLoadRecursiveGuard = 1; + var f = loadQ.shift(); + try{ + f(); + } + // FIXME: signal the error via require.on + finally{ + onLoadRecursiveGuard = 0; + } + onLoadRecursiveGuard = 0; + if(loadQ.length){ + requestCompleteSignal(onLoad); } } - this.curve = new PropLine(pm); - }); - d.connect(anim, "onAnimate", d.hitch(d, "style", anim.node)); - return anim; // dojo.Animation - }; + }; - dojo.anim = function( /*DOMNode|String*/ node, - /*Object*/ properties, - /*Integer?*/ duration, - /*Function?*/ easing, - /*Function?*/ onEnd, - /*Integer?*/ delay){ - // summary: - // A simpler interface to `dojo.animateProperty()`, also returns - // an instance of `dojo.Animation` but begins the animation - // immediately, unlike nearly every other Dojo animation API. - // description: - // `dojo.anim` is a simpler (but somewhat less powerful) version - // of `dojo.animateProperty`. It uses defaults for many basic properties - // and allows for positional parameters to be used in place of the - // packed "property bag" which is used for other Dojo animation - // methods. - // - // The `dojo.Animation` object returned from `dojo.anim` will be - // already playing when it is returned from this function, so - // calling play() on it again is (usually) a no-op. - // node: - // a DOM node or the id of a node to animate CSS properties on - // duration: - // The number of milliseconds over which the animation - // should run. Defaults to the global animation default duration - // (350ms). - // easing: - // An easing function over which to calculate acceleration - // and deceleration of the animation through its duration. - // A default easing algorithm is provided, but you may - // plug in any you wish. A large selection of easing algorithms - // are available in `dojo.fx.easing`. - // onEnd: - // A function to be called when the animation finishes - // running. - // delay: - // The number of milliseconds to delay beginning the - // animation by. The default is 0. - // example: - // Fade out a node - // | dojo.anim("id", { opacity: 0 }); - // example: - // Fade out a node over a full second - // | dojo.anim("id", { opacity: 0 }, 1000); - return d.animateProperty({ // dojo.Animation - node: node, - duration: duration || d.Animation.prototype.duration, - properties: properties, - easing: easing, - onEnd: onEnd - }).play(delay || 0); - }; -})(); + // define requireCompleteSignal; impl depends on loader + if(1){ + require.on("idle", onLoad); + requestCompleteSignal = function(){ + if(require.idle()){ + onLoad(); + } // else do nothing, onLoad will be called with the next idle signal + }; + }else{ + // RequireJS or similar + requestCompleteSignal = function(){ + // the next function call will fail if you don't have a loader with require.ready + // in that case, either fix your loader, use dojo's loader, or don't call dojo.ready; + require.ready(onLoad); + }; + } -} + var ready = dojo.ready = dojo.addOnLoad = function(priority, context, callback){ + // summary: Add a function to execute on DOM content loaded and all requested modules have arrived and been evaluated. + // priority: Integer? + // The order in which to exec this callback relative to other callbacks, defaults to 1000 + // context: Object?|Function + // The context in which to run execute callback, or a callback if not using context + // callback: Function? + // The function to execute. + // + // example: + // Simple DOM and Modules ready syntax + // | dojo.ready(function(){ alert("Dom ready!"); }); + // + // example: + // Using a priority + // | dojo.ready(2, function(){ alert("low priority ready!"); }) + // + // example: + // Using context + // | dojo.ready(foo, function(){ + // | // in here, this == foo + // | }) + // + // example: + // Using dojo.hitch style args: + // | var foo = { dojoReady: function(){ console.warn(this, "dojo dom and modules ready."); } }; + // | dojo.ready(foo, "dojoReady"); + + var hitchArgs = lang._toArray(arguments); + if(typeof priority != "number"){ + callback = context; + context = priority; + priority = 1000; + }else{ + hitchArgs.shift(); + } + callback = callback ? + lang.hitch.apply(dojo, hitchArgs) : + function(){ + context(); + }; + callback.priority = priority; + for(var i = 0; i < loadQ.length && priority >= loadQ[i].priority; i++){} + loadQ.splice(i, 0, callback); + requestCompleteSignal(); + }; -if(!dojo._hasResource["dojo._base.browser"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo._base.browser"] = true; -dojo.provide("dojo._base.browser"); + true || has.add("dojo-config-addOnLoad", 1); + if(1){ + var dca = dojo.config.addOnLoad; + if(dca){ + ready[(lang.isArray(dca) ? "apply" : "call")](dojo, dca); + } + } + if(1 && dojo.config.parseOnLoad && !dojo.isAsync){ + ready(99, function(){ + if(!dojo.parser){ + dojo.deprecated("Add explicit require(['dojo/parser']);", "", "2.0"); + require(["dojo/parser"]); + } + }); + } + if(1){ + domReady(handleDomReady); + }else{ + handleDomReady(); + } + return ready; +}); +}, +'dojo/aspect':function(){ +define([], function(){ +// TODOC: after/before/around return object +// TODOC: after/before/around param types. +/*===== + dojo.aspect = { + // summary: provides aspect oriented programming functionality, allowing for + // one to add before, around, or after advice on existing methods. + // + // example: + // | define(["dojo/aspect"], function(aspect){ + // | var signal = aspect.after(targetObject, "methodName", function(someArgument){ + // | this will be called when targetObject.methodName() is called, after the original function is called + // | }); + // + // example: + // The returned signal object can be used to cancel the advice. + // | signal.remove(); // this will stop the advice from being executed anymore + // | aspect.before(targetObject, "methodName", function(someArgument){ + // | // this will be called when targetObject.methodName() is called, before the original function is called + // | }); + + after: function(target, methodName, advice, receiveArguments){ + // summary: The "after" export of the aspect module is a function that can be used to attach + // "after" advice to a method. This function will be executed after the original method + // is executed. By default the function will be called with a single argument, the return + // value of the original method, or the the return value of the last executed advice (if a previous one exists). + // The fourth (optional) argument can be set to true to so the function receives the original + // arguments (from when the original method was called) rather than the return value. + // If there are multiple "after" advisors, they are executed in the order they were registered. + // target: Object + // This is the target object + // methodName: String + // This is the name of the method to attach to. + // advice: Function + // This is function to be called after the original method + // receiveArguments: Boolean? + // If this is set to true, the advice function receives the original arguments (from when the original mehtod + // was called) rather than the return value of the original/previous method. + // returns: + // A signal object that can be used to cancel the advice. If remove() is called on this signal object, it will + // stop the advice function from being executed. + }, + + before: function(target, methodName, advice){ + // summary: The "before" export of the aspect module is a function that can be used to attach + // "before" advice to a method. This function will be executed before the original method + // is executed. This function will be called with the arguments used to call the method. + // This function may optionally return an array as the new arguments to use to call + // the original method (or the previous, next-to-execute before advice, if one exists). + // If the before method doesn't return anything (returns undefined) the original arguments + // will be preserved. + // If there are multiple "before" advisors, they are executed in the reverse order they were registered. + // + // target: Object + // This is the target object + // methodName: String + // This is the name of the method to attach to. + // advice: Function + // This is function to be called before the original method + }, + around: function(target, methodName, advice){ + // summary: The "around" export of the aspect module is a function that can be used to attach + // "around" advice to a method. The advisor function is immediately executed when + // the around() is called, is passed a single argument that is a function that can be + // called to continue execution of the original method (or the next around advisor). + // The advisor function should return a function, and this function will be called whenever + // the method is called. It will be called with the arguments used to call the method. + // Whatever this function returns will be returned as the result of the method call (unless after advise changes it). + // + // example: + // If there are multiple "around" advisors, the most recent one is executed first, + // which can then delegate to the next one and so on. For example: + // | around(obj, "foo", function(originalFoo){ + // | return function(){ + // | var start = new Date().getTime(); + // | var results = originalFoo.apply(this, arguments); // call the original + // | var end = new Date().getTime(); + // | console.log("foo execution took " + (end - start) + " ms"); + // | return results; + // | }; + // | }); + // + // target: Object + // This is the target object + // methodName: String + // This is the name of the method to attach to. + // advice: Function + // This is function to be called around the original method + } + }; +=====*/ - //Need this to be the last code segment in base, so do not place any - //dojo/requireIf calls in this file/ Otherwise, due to how the build system - //puts all requireIf dependencies after the current file, the require calls - //could be called before all of base is defined/ - dojo.forEach(dojo.config.require, function(i){ - dojo["require"](i); - }); + "use strict"; + var nextId = 0; + function advise(dispatcher, type, advice, receiveArguments){ + var previous = dispatcher[type]; + var around = type == "around"; + var signal; + if(around){ + var advised = advice(function(){ + return previous.advice(this, arguments); + }); + signal = { + remove: function(){ + signal.cancelled = true; + }, + advice: function(target, args){ + return signal.cancelled ? + previous.advice(target, args) : // cancelled, skip to next one + advised.apply(target, args); // called the advised function + } + }; + }else{ + // create the remove handler + signal = { + remove: function(){ + var previous = signal.previous; + var next = signal.next; + if(!next && !previous){ + delete dispatcher[type]; + }else{ + if(previous){ + previous.next = next; + }else{ + dispatcher[type] = next; + } + if(next){ + next.previous = previous; + } + } + }, + id: nextId++, + advice: advice, + receiveArguments: receiveArguments + }; + } + if(previous && !around){ + if(type == "after"){ + // add the listener to the end of the list + var next = previous; + while(next){ + previous = next; + next = next.next; + } + previous.next = signal; + signal.previous = previous; + }else if(type == "before"){ + // add to beginning + dispatcher[type] = signal; + signal.next = previous; + previous.previous = signal; + } + }else{ + // around or first one just replaces + dispatcher[type] = signal; + } + return signal; + } + function aspect(type){ + return function(target, methodName, advice, receiveArguments){ + var existing = target[methodName], dispatcher; + if(!existing || existing.target != target){ + // no dispatcher in place + target[methodName] = dispatcher = function(){ + var executionId = nextId; + // before advice + var args = arguments; + var before = dispatcher.before; + while(before){ + args = before.advice.apply(this, args) || args; + before = before.next; + } + // around advice + if(dispatcher.around){ + var results = dispatcher.around.advice(this, args); + } + // after advice + var after = dispatcher.after; + while(after && after.id < executionId){ + results = after.receiveArguments ? after.advice.apply(this, args) || results : + after.advice.call(this, results); + after = after.next; + } + return results; + }; + if(existing){ + dispatcher.around = {advice: function(target, args){ + return existing.apply(target, args); + }}; + } + dispatcher.target = target; + } + var results = advise((dispatcher || existing), type, advice, receiveArguments); + advice = null; + return results; + }; + } + return { + before: aspect("before"), + around: aspect("around"), + after: aspect("after") + }; +}); + +}, +'dojo/_base/connect':function(){ +define(["./kernel", "../on", "../topic", "../aspect", "./event", "../mouse", "./sniff", "./lang", "../keys"], function(kernel, on, hub, aspect, eventModule, mouse, has, lang){ +// module: +// dojo/_base/connect +// summary: +// This module defines the dojo.connect API. +// This modules also provides keyboard event handling helpers. +// This module exports an extension event for emulating Firefox's keypress handling. +// However, this extension event exists primarily for backwards compatibility and +// is not recommended. WebKit and IE uses an alternate keypress handling (only +// firing for printable characters, to distinguish from keydown events), and most +// consider the WebKit/IE behavior more desirable. +has.add("events-keypress-typed", function(){ // keypresses should only occur a printable character is hit + var testKeyEvent = {charCode: 0}; + try{ + testKeyEvent = document.createEvent("KeyboardEvent"); + (testKeyEvent.initKeyboardEvent || testKeyEvent.initKeyEvent).call(testKeyEvent, "keypress", true, true, null, false, false, false, false, 9, 3); + }catch(e){} + return testKeyEvent.charCode == 0 && !has("opera"); +}); + +function connect_(obj, event, context, method, dontFix){ + method = lang.hitch(context, method); + if(!obj || !(obj.addEventListener || obj.attachEvent)){ + // it is a not a DOM node and we are using the dojo.connect style of treating a + // method like an event, must go right to aspect + return aspect.after(obj || kernel.global, event, method, true); + } + if(typeof event == "string" && event.substring(0, 2) == "on"){ + event = event.substring(2); + } + if(!obj){ + obj = kernel.global; + } + if(!dontFix){ + switch(event){ + // dojo.connect has special handling for these event types + case "keypress": + event = keypress; + break; + case "mouseenter": + event = mouse.enter; + break; + case "mouseleave": + event = mouse.leave; + break; + } + } + return on(obj, event, method, dontFix); +} +var _punctMap = { + 106:42, + 111:47, + 186:59, + 187:43, + 188:44, + 189:45, + 190:46, + 191:47, + 192:96, + 219:91, + 220:92, + 221:93, + 222:39, + 229:113 +}; +var evtCopyKey = has("mac") ? "metaKey" : "ctrlKey"; + + +var _synthesizeEvent = function(evt, props){ + var faux = lang.mixin({}, evt, props); + setKeyChar(faux); + // FIXME: would prefer to use lang.hitch: lang.hitch(evt, evt.preventDefault); + // but it throws an error when preventDefault is invoked on Safari + // does Event.preventDefault not support "apply" on Safari? + faux.preventDefault = function(){ evt.preventDefault(); }; + faux.stopPropagation = function(){ evt.stopPropagation(); }; + return faux; +}; +function setKeyChar(evt){ + evt.keyChar = evt.charCode ? String.fromCharCode(evt.charCode) : ''; + evt.charOrCode = evt.keyChar || evt.keyCode; +} +var keypress; +if(has("events-keypress-typed")){ + // this emulates Firefox's keypress behavior where every keydown can correspond to a keypress + var _trySetKeyCode = function(e, code){ + try{ + // squelch errors when keyCode is read-only + // (e.g. if keyCode is ctrl or shift) + return (e.keyCode = code); + }catch(e){ + return 0; + } + }; + keypress = function(object, listener){ + var keydownSignal = on(object, "keydown", function(evt){ + // munge key/charCode + var k=evt.keyCode; + // These are Windows Virtual Key Codes + // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/WinUI/WindowsUserInterface/UserInput/VirtualKeyCodes.asp + var unprintable = (k!=13 || (has("ie") >= 9 && !has("quirks"))) && k!=32 && (k!=27||!has("ie")) && (k<48||k>90) && (k<96||k>111) && (k<186||k>192) && (k<219||k>222) && k!=229; + // synthesize keypress for most unprintables and CTRL-keys + if(unprintable||evt.ctrlKey){ + var c = unprintable ? 0 : k; + if(evt.ctrlKey){ + if(k==3 || k==13){ + return listener.call(evt.currentTarget, evt); // IE will post CTRL-BREAK, CTRL-ENTER as keypress natively + }else if(c>95 && c<106){ + c -= 48; // map CTRL-[numpad 0-9] to ASCII + }else if((!evt.shiftKey)&&(c>=65&&c<=90)){ + c += 32; // map CTRL-[A-Z] to lowercase + }else{ + c = _punctMap[c] || c; // map other problematic CTRL combinations to ASCII + } + } + // simulate a keypress event + var faux = _synthesizeEvent(evt, {type: 'keypress', faux: true, charCode: c}); + listener.call(evt.currentTarget, faux); + if(has("ie")){ + _trySetKeyCode(evt, faux.keyCode); + } + } + }); + var keypressSignal = on(object, "keypress", function(evt){ + var c = evt.charCode; + c = c>=32 ? c : 0; + evt = _synthesizeEvent(evt, {charCode: c, faux: true}); + return listener.call(this, evt); + }); + return { + remove: function(){ + keydownSignal.remove(); + keypressSignal.remove(); + } + }; + }; +}else{ + if(has("opera")){ + keypress = function(object, listener){ + return on(object, "keypress", function(evt){ + var c = evt.which; + if(c==3){ + c=99; // Mozilla maps CTRL-BREAK to CTRL-c + } + // can't trap some keys at all, like INSERT and DELETE + // there is no differentiating info between DELETE and ".", or INSERT and "-" + c = c<32 && !evt.shiftKey ? 0 : c; + if(evt.ctrlKey && !evt.shiftKey && c>=65 && c<=90){ + // lowercase CTRL-[A-Z] keys + c += 32; + } + return listener.call(this, _synthesizeEvent(evt, { charCode: c })); + }); + }; + }else{ + keypress = function(object, listener){ + return on(object, "keypress", function(evt){ + setKeyChar(evt); + return listener.call(this, evt); + }); + }; + } } -if(!dojo._hasResource["dojo._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo._base"] = true; -dojo.provide("dojo._base"); +var connect = { + _keypress:keypress, + + connect:function(obj, event, context, method, dontFix){ + // normalize arguments + var a=arguments, args=[], i=0; + // if a[0] is a String, obj was omitted + args.push(typeof a[0] == "string" ? null : a[i++], a[i++]); + // if the arg-after-next is a String or Function, context was NOT omitted + var a1 = a[i+1]; + args.push(typeof a1 == "string" || typeof a1 == "function" ? a[i++] : null, a[i++]); + // absorb any additional arguments + for(var l=a.length; i= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/dom-attr",["exports","./_base/sniff","./_base/lang","./dom","./dom-style","./dom-prop"],function(_1,_2,_3,_4,_5,_6){var _7={innerHTML:1,className:1,htmlFor:_2("ie"),value:1},_8={classname:"class",htmlfor:"for",tabindex:"tabIndex",readonly:"readOnly"};function _9(_a,_b){var _c=_a.getAttributeNode&&_a.getAttributeNode(_b);return _c&&_c.specified;};_1.has=function hasAttr(_d,_e){var lc=_e.toLowerCase();return _7[_6.names[lc]||_e]||_9(_4.byId(_d),_8[lc]||_e);};_1.get=function getAttr(_f,_10){_f=_4.byId(_f);var lc=_10.toLowerCase(),_11=_6.names[lc]||_10,_12=_7[_11];value=_f[_11];if(_12&&typeof value!="undefined"){return value;}if(_11!="href"&&(typeof value=="boolean"||_3.isFunction(value))){return value;}var _13=_8[lc]||_10;return _9(_f,_13)?_f.getAttribute(_13):null;};_1.set=function setAttr(_14,_15,_16){_14=_4.byId(_14);if(arguments.length==2){for(var x in _15){_1.set(_14,x,_15[x]);}return _14;}var lc=_15.toLowerCase(),_17=_6.names[lc]||_15,_18=_7[_17];if(_17=="style"&&typeof _16!="string"){_5.set(_14,_16);return _14;}if(_18||typeof _16=="boolean"||_3.isFunction(_16)){return _6.set(_14,_15,_16);}_14.setAttribute(_8[lc]||_15,_16);return _14;};_1.remove=function removeAttr(_19,_1a){_4.byId(_19).removeAttribute(_8[_1a.toLowerCase()]||_1a);};_1.getNodeProp=function getNodeProp(_1b,_1c){_1b=_4.byId(_1b);var lc=_1c.toLowerCase(),_1d=_6.names[lc]||_1c;if((_1d in _1b)&&_1d!="href"){return _1b[_1d];}var _1e=_8[lc]||_1c;return _9(_1b,_1e)?_1b.getAttribute(_1e):null;};}); \ No newline at end of file diff --git a/lib/dojo/dom-attr.js.uncompressed.js b/lib/dojo/dom-attr.js.uncompressed.js new file mode 100644 index 00000000..99a91bc8 --- /dev/null +++ b/lib/dojo/dom-attr.js.uncompressed.js @@ -0,0 +1,238 @@ +define("dojo/dom-attr", ["exports", "./_base/sniff", "./_base/lang", "./dom", "./dom-style", "./dom-prop"], + function(exports, has, lang, dom, style, prop){ + // module: + // dojo/dom-attr + // summary: + // This module defines the core dojo DOM attributes API. + + // ============================= + // Element attribute Functions + // ============================= + + // This module will be obsolete soon. Use dojo.prop instead. + + // dojo.attr() should conform to http://www.w3.org/TR/DOM-Level-2-Core/ + + // attribute-related functions (to be obsolete soon) + + /*===== + dojo.hasAttr = function(node, name){ + // summary: + // Returns true if the requested attribute is specified on the + // given element, and false otherwise. + // node: DOMNode|String + // id or reference to the element to check + // name: String + // the name of the attribute + // returns: Boolean + // true if the requested attribute is specified on the + // given element, and false otherwise + }; + =====*/ + + /*===== + dojo.getAttr = function(node, name){ + // summary: + // Gets an attribute on an HTML element. + // description: + // Handles normalized getting of attributes on DOM Nodes. + // node: DOMNode|String + // id or reference to the element to get the attribute on + // name: String + // the name of the attribute to get. + // returns: + // the value of the requested attribute or null if that attribute does not have a specified or + // default value; + // + // example: + // | // get the current value of the "foo" attribute on a node + // | dojo.getAttr(dojo.byId("nodeId"), "foo"); + // | // or we can just pass the id: + // | dojo.getAttr("nodeId", "foo"); + }; + =====*/ + + /*===== + dojo.setAttr = function(node, name, value){ + // summary: + // Sets an attribute on an HTML element. + // description: + // Handles normalized setting of attributes on DOM Nodes. + // + // When passing functions as values, note that they will not be + // directly assigned to slots on the node, but rather the default + // behavior will be removed and the new behavior will be added + // using `dojo.connect()`, meaning that event handler properties + // will be normalized and that some caveats with regards to + // non-standard behaviors for onsubmit apply. Namely that you + // should cancel form submission using `dojo.stopEvent()` on the + // passed event object instead of returning a boolean value from + // the handler itself. + // node: DOMNode|String + // id or reference to the element to set the attribute on + // name: String|Object + // the name of the attribute to set, or a hash of key-value pairs to set. + // value: String? + // the value to set for the attribute, if the name is a string. + // returns: + // the DOM node + // + // example: + // | // use attr() to set the tab index + // | dojo.setAttr("nodeId", "tabIndex", 3); + // + // example: + // Set multiple values at once, including event handlers: + // | dojo.setAttr("formId", { + // | "foo": "bar", + // | "tabIndex": -1, + // | "method": "POST", + // | "onsubmit": function(e){ + // | // stop submitting the form. Note that the IE behavior + // | // of returning true or false will have no effect here + // | // since our handler is connect()ed to the built-in + // | // onsubmit behavior and so we need to use + // | // dojo.stopEvent() to ensure that the submission + // | // doesn't proceed. + // | dojo.stopEvent(e); + // | + // | // submit the form with Ajax + // | dojo.xhrPost({ form: "formId" }); + // | } + // | }); + // + // example: + // Style is s special case: Only set with an object hash of styles + // | dojo.setAttr("someNode",{ + // | id:"bar", + // | style:{ + // | width:"200px", height:"100px", color:"#000" + // | } + // | }); + // + // example: + // Again, only set style as an object hash of styles: + // | var obj = { color:"#fff", backgroundColor:"#000" }; + // | dojo.setAttr("someNode", "style", obj); + // | + // | // though shorter to use `dojo.style()` in this case: + // | dojo.setStyle("someNode", obj); + }; + =====*/ + + /*===== + dojo.removeAttr = function(node, name){ + // summary: + // Removes an attribute from an HTML element. + // node: DOMNode|String + // id or reference to the element to remove the attribute from + // name: String + // the name of the attribute to remove + }; + =====*/ + + /*===== + dojo.getNodeProp = function(node, name){ + // summary: + // Returns an effective value of a property or an attribute. + // node: DOMNode|String + // id or reference to the element to remove the attribute from + // name: String + // the name of the attribute + // returns: + // the value of the attribute + }; + =====*/ + + var forcePropNames = { + innerHTML: 1, + className: 1, + htmlFor: has("ie"), + value: 1 + }, + attrNames = { + // original attribute names + classname: "class", + htmlfor: "for", + // for IE + tabindex: "tabIndex", + readonly: "readOnly" + }; + + function _hasAttr(node, name){ + var attr = node.getAttributeNode && node.getAttributeNode(name); + return attr && attr.specified; // Boolean + } + + // There is a difference in the presence of certain properties and their default values + // between browsers. For example, on IE "disabled" is present on all elements, + // but it is value is "false"; "tabIndex" of
returns 0 by default on IE, yet other browsers + // can return -1. + + exports.has = function hasAttr(/*DOMNode|String*/node, /*String*/name){ + var lc = name.toLowerCase(); + return forcePropNames[prop.names[lc] || name] || _hasAttr(dom.byId(node), attrNames[lc] || name); // Boolean + }; + + exports.get = function getAttr(/*DOMNode|String*/node, /*String*/name){ + node = dom.byId(node); + var lc = name.toLowerCase(), + propName = prop.names[lc] || name, + forceProp = forcePropNames[propName]; + // should we access this attribute via a property or via getAttribute()? + value = node[propName]; + if(forceProp && typeof value != "undefined"){ + // node's property + return value; // Anything + } + if(propName != "href" && (typeof value == "boolean" || lang.isFunction(value))){ + // node's property + return value; // Anything + } + // node's attribute + // we need _hasAttr() here to guard against IE returning a default value + var attrName = attrNames[lc] || name; + return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything + }; + + exports.set = function setAttr(/*DOMNode|String*/node, /*String|Object*/name, /*String?*/value){ + node = dom.byId(node); + if(arguments.length == 2){ // inline'd type check + // the object form of setter: the 2nd argument is a dictionary + for(var x in name){ + exports.set(node, x, name[x]); + } + return node; // DomNode + } + var lc = name.toLowerCase(), + propName = prop.names[lc] || name, + forceProp = forcePropNames[propName]; + if(propName == "style" && typeof value != "string"){ // inline'd type check + // special case: setting a style + style.set(node, value); + return node; // DomNode + } + if(forceProp || typeof value == "boolean" || lang.isFunction(value)){ + return prop.set(node, name, value) + } + // node's attribute + node.setAttribute(attrNames[lc] || name, value); + return node; // DomNode + }; + + exports.remove = function removeAttr(/*DOMNode|String*/ node, /*String*/ name){ + dom.byId(node).removeAttribute(attrNames[name.toLowerCase()] || name); + }; + + exports.getNodeProp = function getNodeProp(/*DomNode|String*/ node, /*String*/ name){ + node = dom.byId(node); + var lc = name.toLowerCase(), propName = prop.names[lc] || name; + if((propName in node) && propName != "href"){ + // node's property + return node[propName]; // Anything + } + // node's attribute + var attrName = attrNames[lc] || name; + return _hasAttr(node, attrName) ? node.getAttribute(attrName) : null; // Anything + }; +}); diff --git a/lib/dojo/dom-class.js b/lib/dojo/dom-class.js new file mode 100644 index 00000000..e4f09f16 --- /dev/null +++ b/lib/dojo/dom-class.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/dom-class",["./_base/lang","./_base/array","./dom"],function(_1,_2,_3){var _4="className";var _5,_6=/\s+/,a1=[""];function _7(s){if(typeof s=="string"||s instanceof String){if(s&&!_6.test(s)){a1[0]=s;return a1;}var a=s.split(_6);if(a.length&&!a[0]){a.shift();}if(a.length&&!a[a.length-1]){a.pop();}return a;}if(!s){return [];}return _2.filter(s,function(x){return x;});};var _8={};_5={contains:function containsClass(_9,_a){return ((" "+_3.byId(_9)[_4]+" ").indexOf(" "+_a+" ")>=0);},add:function addClass(_b,_c){_b=_3.byId(_b);_c=_7(_c);var _d=_b[_4],_e;_d=_d?" "+_d+" ":" ";_e=_d.length;for(var i=0,_f=_c.length,c;i<_f;++i){c=_c[i];if(c&&_d.indexOf(" "+c+" ")<0){_d+=c+" ";}}if(_e<_d.length){_b[_4]=_d.substr(1,_d.length-2);}},remove:function removeClass(_10,_11){_10=_3.byId(_10);var cls;if(_11!==undefined){_11=_7(_11);cls=" "+_10[_4]+" ";for(var i=0,len=_11.length;i li").addClass("firstLevel"); + }; + =====*/ + + /*===== + dojo.removeClass = function(node, classStr){ + // summary: + // Removes the specified classes from node. No `dojo.hasClass` + // check is required. + // + // node: String|DOMNode + // String ID or DomNode reference to remove the class from. + // + // classStr: String|Array + // An optional String class name to remove, or several space-separated + // class names, or an array of class names. If omitted, all class names + // will be deleted. + // + // example: + // Remove a class from some node: + // | dojo.removeClass("someNode", "firstClass"); + // + // example: + // Remove two classes from some node: + // | dojo.removeClass("someNode", "firstClass secondClass"); + // + // example: + // Remove two classes from some node (using array): + // | dojo.removeClass("someNode", ["firstClass", "secondClass"]); + // + // example: + // Remove all classes from some node: + // | dojo.removeClass("someNode"); + // + // example: + // Available in `dojo.NodeList()` for multiple removal + // | dojo.query(".foo").removeClass("foo"); + }; + =====*/ + + /*===== + dojo.replaceClass = function(node, addClassStr, removeClassStr){ + // summary: + // Replaces one or more classes on a node if not present. + // Operates more quickly than calling dojo.removeClass and dojo.addClass + // + // node: String|DOMNode + // String ID or DomNode reference to remove the class from. + // + // addClassStr: String|Array + // A String class name to add, or several space-separated class names, + // or an array of class names. + // + // removeClassStr: String|Array? + // A String class name to remove, or several space-separated class names, + // or an array of class names. + // + // example: + // | dojo.replaceClass("someNode", "add1 add2", "remove1 remove2"); + // + // example: + // Replace all classes with addMe + // | dojo.replaceClass("someNode", "addMe"); + // + // example: + // Available in `dojo.NodeList()` for multiple toggles + // | dojo.query(".findMe").replaceClass("addMe", "removeMe"); + }; + =====*/ + + /*===== + dojo.toggleClass = function(node, classStr, condition){ + // summary: + // Adds a class to node if not present, or removes if present. + // Pass a boolean condition if you want to explicitly add or remove. + // Returns the condition that was specified directly or indirectly. + // + // node: String|DOMNode + // String ID or DomNode reference to toggle a class string + // + // classStr: String|Array + // A String class name to toggle, or several space-separated class names, + // or an array of class names. + // + // condition: + // If passed, true means to add the class, false means to remove. + // Otherwise dojo.hasClass(node, classStr) is used to detect the class presence. + // + // example: + // | dojo.toggleClass("someNode", "hovered"); + // + // example: + // Forcefully add a class + // | dojo.toggleClass("someNode", "hovered", true); + // + // example: + // Available in `dojo.NodeList()` for multiple toggles + // | dojo.query(".toggleMe").toggleClass("toggleMe"); + }; + =====*/ + + var cls, // exports object + spaces = /\s+/, a1 = [""]; + + function str2array(s){ + if(typeof s == "string" || s instanceof String){ + if(s && !spaces.test(s)){ + a1[0] = s; + return a1; + } + var a = s.split(spaces); + if(a.length && !a[0]){ + a.shift(); + } + if(a.length && !a[a.length - 1]){ + a.pop(); + } + return a; + } + // assumed to be an array + if(!s){ + return []; + } + return array.filter(s, function(x){ return x; }); + } + + /* Part II of classList-based implementation is preserved here for posterity + if(has("dom-classList")){ + // new classList version + cls = { + contains: function containsClass(node, classStr){ + var clslst = classStr && dom.byId(node)[classList]; + return clslst && clslst.contains(classStr); // Boolean + }, + + add: function addClass(node, classStr){ + node = dom.byId(node); + classStr = str2array(classStr); + for(var i = 0, len = classStr.length; i < len; ++i){ + node[classList].add(classStr[i]); + } + }, + + remove: function removeClass(node, classStr){ + node = dom.byId(node); + if(classStr === undefined){ + node[className] = ""; + }else{ + classStr = str2array(classStr); + for(var i = 0, len = classStr.length; i < len; ++i){ + node[classList].remove(classStr[i]); + } + } + }, + + replace: function replaceClass(node, addClassStr, removeClassStr){ + node = dom.byId(node); + if(removeClassStr === undefined){ + node[className] = ""; + }else{ + removeClassStr = str2array(removeClassStr); + for(var i = 0, len = removeClassStr.length; i < len; ++i){ + node[classList].remove(removeClassStr[i]); + } + } + addClassStr = str2array(addClassStr); + for(i = 0, len = addClassStr.length; i < len; ++i){ + node[classList].add(addClassStr[i]); + } + }, + + toggle: function toggleClass(node, classStr, condition){ + node = dom.byId(node); + if(condition === undefined){ + classStr = str2array(classStr); + for(var i = 0, len = classStr.length; i < len; ++i){ + node[classList].toggle(classStr[i]); + } + }else{ + cls[condition ? "add" : "remove"](node, classStr); + } + return condition; // Boolean + } + } + } + */ + + // regular DOM version + var fakeNode = {}; // for effective replacement + cls = { + contains: function containsClass(/*DomNode|String*/node, /*String*/classStr){ + return ((" " + dom.byId(node)[className] + " ").indexOf(" " + classStr + " ") >= 0); // Boolean + }, + + add: function addClass(/*DomNode|String*/node, /*String|Array*/classStr){ + node = dom.byId(node); + classStr = str2array(classStr); + var cls = node[className], oldLen; + cls = cls ? " " + cls + " " : " "; + oldLen = cls.length; + for(var i = 0, len = classStr.length, c; i < len; ++i){ + c = classStr[i]; + if(c && cls.indexOf(" " + c + " ") < 0){ + cls += c + " "; + } + } + if(oldLen < cls.length){ + node[className] = cls.substr(1, cls.length - 2); + } + }, + + remove: function removeClass(/*DomNode|String*/node, /*String|Array?*/classStr){ + node = dom.byId(node); + var cls; + if(classStr !== undefined){ + classStr = str2array(classStr); + cls = " " + node[className] + " "; + for(var i = 0, len = classStr.length; i < len; ++i){ + cls = cls.replace(" " + classStr[i] + " ", " "); + } + cls = lang.trim(cls); + }else{ + cls = ""; + } + if(node[className] != cls){ node[className] = cls; } + }, + + replace: function replaceClass(/*DomNode|String*/node, /*String|Array*/addClassStr, /*String|Array?*/removeClassStr){ + node = dom.byId(node); + fakeNode[className] = node[className]; + cls.remove(fakeNode, removeClassStr); + cls.add(fakeNode, addClassStr); + if(node[className] !== fakeNode[className]){ + node[className] = fakeNode[className]; + } + }, + + toggle: function toggleClass(/*DomNode|String*/node, /*String|Array*/classStr, /*Boolean?*/condition){ + node = dom.byId(node); + if(condition === undefined){ + classStr = str2array(classStr); + for(var i = 0, len = classStr.length, c; i < len; ++i){ + c = classStr[i]; + cls[cls.contains(node, c) ? "remove" : "add"](node, c); + } + }else{ + cls[condition ? "add" : "remove"](node, classStr); + } + return condition; // Boolean + } + }; + + return cls; +}); diff --git a/lib/dojo/dom-construct.js b/lib/dojo/dom-construct.js new file mode 100644 index 00000000..856d0005 --- /dev/null +++ b/lib/dojo/dom-construct.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/dom-construct",["exports","./_base/kernel","./_base/sniff","./_base/window","./dom","./dom-attr","./on"],function(_1,_2,_3,_4,_5,_6,on){var _7={option:["select"],tbody:["table"],thead:["table"],tfoot:["table"],tr:["table","tbody"],td:["table","tbody","tr"],th:["table","thead","tr"],legend:["fieldset"],caption:["table"],colgroup:["table"],col:["table","colgroup"],li:["ul"]},_8=/<\s*([\w\:]+)/,_9={},_a=0,_b="__"+_2._scopeName+"ToDomId";for(var _c in _7){if(_7.hasOwnProperty(_c)){var tw=_7[_c];tw.pre=_c=="option"?"' : "<" + tw.join("><") + ">"; + tw.post = ""; + // the last line is destructive: it reverses the array, + // but we don't care at this point + } + } + + function _insertBefore(/*DomNode*/node, /*DomNode*/ref){ + var parent = ref.parentNode; + if(parent){ + parent.insertBefore(node, ref); + } + } + + function _insertAfter(/*DomNode*/node, /*DomNode*/ref){ + // summary: + // Try to insert node after ref + var parent = ref.parentNode; + if(parent){ + if(parent.lastChild == ref){ + parent.appendChild(node); + }else{ + parent.insertBefore(node, ref.nextSibling); + } + } + } + + var _destroyContainer = null, + _destroyDoc; + on(window, "unload", function(){ + _destroyContainer = null; //prevent IE leak + }); + + exports.toDom = function toDom(frag, doc){ + doc = doc || win.doc; + var masterId = doc[masterName]; + if(!masterId){ + doc[masterName] = masterId = ++masterNum + ""; + masterNode[masterId] = doc.createElement("div"); + } + + // make sure the frag is a string. + frag += ""; + + // find the starting tag, and get node wrapper + var match = frag.match(reTag), + tag = match ? match[1].toLowerCase() : "", + master = masterNode[masterId], + wrap, i, fc, df; + if(match && tagWrap[tag]){ + wrap = tagWrap[tag]; + master.innerHTML = wrap.pre + frag + wrap.post; + for(i = wrap.length; i; --i){ + master = master.firstChild; + } + }else{ + master.innerHTML = frag; + } + + // one node shortcut => return the node itself + if(master.childNodes.length == 1){ + return master.removeChild(master.firstChild); // DOMNode + } + + // return multiple nodes as a document fragment + df = doc.createDocumentFragment(); + while(fc = master.firstChild){ // intentional assignment + df.appendChild(fc); + } + return df; // DOMNode + }; + + exports.place = function place(/*DOMNode|String*/node, /*DOMNode|String*/refNode, /*String|Number?*/position){ + refNode = dom.byId(refNode); + if(typeof node == "string"){ // inline'd type check + node = /^\s*= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/dom-form",["./_base/lang","./dom","./io-query","./json"],function(_1,_2,_3,_4){function _5(_6,_7,_8){if(_8===null){return;}var _9=_6[_7];if(typeof _9=="string"){_6[_7]=[_9,_8];}else{if(_1.isArray(_9)){_9.push(_8);}else{_6[_7]=_8;}}};var _a="file|submit|image|reset|button";var _b={fieldToObject:function fieldToObject(_c){var _d=null;_c=_2.byId(_c);if(_c){var _e=_c.name,_f=(_c.type||"").toLowerCase();if(_e&&_f&&!_c.disabled){if(_f=="radio"||_f=="checkbox"){if(_c.checked){_d=_c.value;}}else{if(_c.multiple){_d=[];var _10=[_c.firstChild];while(_10.length){for(var _11=_10.pop();_11;_11=_11.nextSibling){if(_11.nodeType==1&&_11.tagName.toLowerCase()=="option"){if(_11.selected){_d.push(_11.value);}}else{if(_11.nextSibling){_10.push(_11.nextSibling);}if(_11.firstChild){_10.push(_11.firstChild);}break;}}}}else{_d=_c.value;}}}}return _d;},toObject:function formToObject(_12){var ret={},_13=_2.byId(_12).elements;for(var i=0,l=_13.length;i + // | + // | + // | + // | + // | + // + // yields this object structure as the result of a call to + // formToObject(): + // + // | { + // | blah: "blah", + // | multi: [ + // | "thud", + // | "thonk" + // | ] + // | }; + }; + =====*/ + + /*===== + dojo.formToQuery = function(formNode){ + // summary: + // Returns a URL-encoded string representing the form passed as either a + // node or string ID identifying the form to serialize + // formNode: DOMNode|String + // returns: String + }; + =====*/ + + /*===== + dojo.formToJson = function(formNode, prettyPrint){ + // summary: + // Create a serialized JSON string from a form node or string + // ID identifying the form to serialize + // formNode: DOMNode|String + // prettyPrint: Boolean? + // returns: String + }; + =====*/ + + function setValue(/*Object*/obj, /*String*/name, /*String*/value){ + // summary: + // For the named property in object, set the value. If a value + // already exists and it is a string, convert the value to be an + // array of values. + + // Skip it if there is no value + if(value === null){ + return; + } + + var val = obj[name]; + if(typeof val == "string"){ // inline'd type check + obj[name] = [val, value]; + }else if(lang.isArray(val)){ + val.push(value); + }else{ + obj[name] = value; + } + } + + var exclude = "file|submit|image|reset|button"; + + var form = { + fieldToObject: function fieldToObject(/*DOMNode|String*/ inputNode){ + var ret = null; + inputNode = dom.byId(inputNode); + if(inputNode){ + var _in = inputNode.name, type = (inputNode.type || "").toLowerCase(); + if(_in && type && !inputNode.disabled){ + if(type == "radio" || type == "checkbox"){ + if(inputNode.checked){ + ret = inputNode.value; + } + }else if(inputNode.multiple){ + ret = []; + var nodes = [inputNode.firstChild]; + while(nodes.length){ + for(var node = nodes.pop(); node; node = node.nextSibling){ + if(node.nodeType == 1 && node.tagName.toLowerCase() == "option"){ + if(node.selected){ + ret.push(node.value); + } + }else{ + if(node.nextSibling){ + nodes.push(node.nextSibling); + } + if(node.firstChild){ + nodes.push(node.firstChild); + } + break; + } + } + } + }else{ + ret = inputNode.value; + } + } + } + return ret; // Object + }, + + toObject: function formToObject(/*DOMNode|String*/ formNode){ + var ret = {}, elems = dom.byId(formNode).elements; + for(var i = 0, l = elems.length; i < l; ++i){ + var item = elems[i], _in = item.name, type = (item.type || "").toLowerCase(); + if(_in && type && exclude.indexOf(type) < 0 && !item.disabled){ + setValue(ret, _in, form.fieldToObject(item)); + if(type == "image"){ + ret[_in + ".x"] = ret[_in + ".y"] = ret[_in].x = ret[_in].y = 0; + } + } + } + return ret; // Object + }, + + toQuery: function formToQuery(/*DOMNode|String*/ formNode){ + return ioq.objectToQuery(form.toObject(formNode)); // String + }, + + toJson: function formToJson(/*DOMNode|String*/ formNode, /*Boolean?*/prettyPrint){ + return json.stringify(form.toObject(formNode), null, prettyPrint ? 4 : 0); // String + } + }; + + return form; +}); diff --git a/lib/dojo/dom-geometry.js b/lib/dojo/dom-geometry.js new file mode 100644 index 00000000..e9ade9c6 --- /dev/null +++ b/lib/dojo/dom-geometry.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/dom-geometry",["./_base/sniff","./_base/window","./dom","./dom-style"],function(_1,_2,_3,_4){var _5={};_5.boxModel="content-box";if(_1("ie")){_5.boxModel=document.compatMode=="BackCompat"?"border-box":"content-box";}_5.getPadExtents=function getPadExtents(_6,_7){_6=_3.byId(_6);var s=_7||_4.getComputedStyle(_6),px=_4.toPixelValue,l=px(_6,s.paddingLeft),t=px(_6,s.paddingTop),r=px(_6,s.paddingRight),b=px(_6,s.paddingBottom);return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};var _8="none";_5.getBorderExtents=function getBorderExtents(_9,_a){_9=_3.byId(_9);var px=_4.toPixelValue,s=_a||_4.getComputedStyle(_9),l=s.borderLeftStyle!=_8?px(_9,s.borderLeftWidth):0,t=s.borderTopStyle!=_8?px(_9,s.borderTopWidth):0,r=s.borderRightStyle!=_8?px(_9,s.borderRightWidth):0,b=s.borderBottomStyle!=_8?px(_9,s.borderBottomWidth):0;return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};_5.getPadBorderExtents=function getPadBorderExtents(_b,_c){_b=_3.byId(_b);var s=_c||_4.getComputedStyle(_b),p=_5.getPadExtents(_b,s),b=_5.getBorderExtents(_b,s);return {l:p.l+b.l,t:p.t+b.t,r:p.r+b.r,b:p.b+b.b,w:p.w+b.w,h:p.h+b.h};};_5.getMarginExtents=function getMarginExtents(_d,_e){_d=_3.byId(_d);var s=_e||_4.getComputedStyle(_d),px=_4.toPixelValue,l=px(_d,s.marginLeft),t=px(_d,s.marginTop),r=px(_d,s.marginRight),b=px(_d,s.marginBottom);if(_1("webkit")&&(s.position!="absolute")){r=l;}return {l:l,t:t,r:r,b:b,w:l+r,h:t+b};};_5.getMarginBox=function getMarginBox(_f,_10){_f=_3.byId(_f);var s=_10||_4.getComputedStyle(_f),me=_5.getMarginExtents(_f,s),l=_f.offsetLeft-me.l,t=_f.offsetTop-me.t,p=_f.parentNode,px=_4.toPixelValue,pcs;if(_1("mozilla")){var sl=parseFloat(s.left),st=parseFloat(s.top);if(!isNaN(sl)&&!isNaN(st)){l=sl,t=st;}else{if(p&&p.style){pcs=_4.getComputedStyle(p);if(pcs.overflow!="visible"){l+=pcs.borderLeftStyle!=_8?px(_f,pcs.borderLeftWidth):0;t+=pcs.borderTopStyle!=_8?px(_f,pcs.borderTopWidth):0;}}}}else{if(_1("opera")||(_1("ie")==8&&!_1("quirks"))){if(p){pcs=_4.getComputedStyle(p);l-=pcs.borderLeftStyle!=_8?px(_f,pcs.borderLeftWidth):0;t-=pcs.borderTopStyle!=_8?px(_f,pcs.borderTopWidth):0;}}}return {l:l,t:t,w:_f.offsetWidth+me.w,h:_f.offsetHeight+me.h};};_5.getContentBox=function getContentBox(_11,_12){_11=_3.byId(_11);var s=_12||_4.getComputedStyle(_11),w=_11.clientWidth,h,pe=_5.getPadExtents(_11,s),be=_5.getBorderExtents(_11,s);if(!w){w=_11.offsetWidth;h=_11.offsetHeight;}else{h=_11.clientHeight;be.w=be.h=0;}if(_1("opera")){pe.l+=be.l;pe.t+=be.t;}return {l:pe.l,t:pe.t,w:w-pe.w-be.w,h:h-pe.h-be.h};};function _13(_14,l,t,w,h,u){u=u||"px";var s=_14.style;if(!isNaN(l)){s.left=l+u;}if(!isNaN(t)){s.top=t+u;}if(w>=0){s.width=w+u;}if(h>=0){s.height=h+u;}};function _15(_16){return _16.tagName.toLowerCase()=="button"||_16.tagName.toLowerCase()=="input"&&(_16.getAttribute("type")||"").toLowerCase()=="button";};function _17(_18){return _5.boxModel=="border-box"||_18.tagName.toLowerCase()=="table"||_15(_18);};_5.setContentSize=function setContentSize(_19,box,_1a){_19=_3.byId(_19);var w=box.w,h=box.h;if(_17(_19)){var pb=_5.getPadBorderExtents(_19,_1a);if(w>=0){w+=pb.w;}if(h>=0){h+=pb.h;}}_13(_19,NaN,NaN,w,h);};var _1b={l:0,t:0,w:0,h:0};_5.setMarginBox=function setMarginBox(_1c,box,_1d){_1c=_3.byId(_1c);var s=_1d||_4.getComputedStyle(_1c),w=box.w,h=box.h,pb=_17(_1c)?_1b:_5.getPadBorderExtents(_1c,s),mb=_5.getMarginExtents(_1c,s);if(_1("webkit")){if(_15(_1c)){var ns=_1c.style;if(w>=0&&!ns.width){ns.width="4px";}if(h>=0&&!ns.height){ns.height="4px";}}}if(w>=0){w=Math.max(w-pb.w-mb.w,0);}if(h>=0){h=Math.max(h-pb.h-mb.h,0);}_13(_1c,box.l,box.t,w,h);};_5.isBodyLtr=function isBodyLtr(){return (_2.body().dir||_2.doc.documentElement.dir||"ltr").toLowerCase()=="ltr";};_5.docScroll=function docScroll(){var _1e=_2.doc.parentWindow||_2.doc.defaultView;return "pageXOffset" in _1e?{x:_1e.pageXOffset,y:_1e.pageYOffset}:(_1e=_1("quirks")?_2.body():_2.doc.documentElement,{x:_5.fixIeBiDiScrollLeft(_1e.scrollLeft||0),y:_1e.scrollTop||0});};_5.getIeDocumentElementOffset=function getIeDocumentElementOffset(){var de=_2.doc.documentElement;if(_1("ie")<8){var r=de.getBoundingClientRect(),l=r.left,t=r.top;if(_1("ie")<7){l+=de.clientLeft;t+=de.clientTop;}return {x:l<0?0:l,y:t<0?0:t};}else{return {x:0,y:0};}};_5.fixIeBiDiScrollLeft=function fixIeBiDiScrollLeft(_1f){var ie=_1("ie");if(ie&&!_5.isBodyLtr()){var qk=_1("quirks"),de=qk?_2.body():_2.doc.documentElement;if(ie==6&&!qk&&_2.global.frameElement&&de.scrollHeight>de.clientHeight){_1f+=de.clientLeft;}return (ie<8||qk)?(_1f+de.clientWidth-de.scrollWidth):-_1f;}return _1f;};_5.position=function(_20,_21){_20=_3.byId(_20);var db=_2.body(),dh=db.parentNode,ret=_20.getBoundingClientRect();ret={x:ret.left,y:ret.top,w:ret.right-ret.left,h:ret.bottom-ret.top};if(_1("ie")){var _22=_5.getIeDocumentElementOffset();ret.x-=_22.x+(_1("quirks")?db.clientLeft+db.offsetLeft:0);ret.y-=_22.y+(_1("quirks")?db.clientTop+db.offsetTop:0);}else{if(_1("ff")==3){var cs=_4.getComputedStyle(dh),px=_4.toPixelValue;ret.x-=px(dh,cs.marginLeft)+px(dh,cs.borderLeftWidth);ret.y-=px(dh,cs.marginTop)+px(dh,cs.borderTopWidth);}}if(_21){var _23=_5.docScroll();ret.x+=_23.x;ret.y+=_23.y;}return ret;};_5.getMarginSize=function getMarginSize(_24,_25){_24=_3.byId(_24);var me=_5.getMarginExtents(_24,_25||_4.getComputedStyle(_24));var _26=_24.getBoundingClientRect();return {w:(_26.right-_26.left)+me.w,h:(_26.bottom-_26.top)+me.h};};_5.normalizeEvent=function(_27){if(!("layerX" in _27)){_27.layerX=_27.offsetX;_27.layerY=_27.offsetY;}if(!_1("dom-addeventlistener")){var se=_27.target;var doc=(se&&se.ownerDocument)||document;var _28=_1("quirks")?doc.body:doc.documentElement;var _29=_5.getIeDocumentElementOffset();_27.pageX=_27.clientX+_5.fixIeBiDiScrollLeft(_28.scrollLeft||0)-_29.x;_27.pageY=_27.clientY+(_28.scrollTop||0)-_29.y;}};return _5;}); \ No newline at end of file diff --git a/lib/dojo/dom-geometry.js.uncompressed.js b/lib/dojo/dom-geometry.js.uncompressed.js new file mode 100644 index 00000000..0e3234a9 --- /dev/null +++ b/lib/dojo/dom-geometry.js.uncompressed.js @@ -0,0 +1,751 @@ +define("dojo/dom-geometry", ["./_base/sniff", "./_base/window","./dom", "./dom-style"], + function(has, win, dom, style){ + // module: + // dojo/dom-geometry + // summary: + // This module defines the core dojo DOM geometry API. + + var geom = {}; // the result object + + // Box functions will assume this model. + // On IE/Opera, BORDER_BOX will be set if the primary document is in quirks mode. + // Can be set to change behavior of box setters. + + // can be either: + // "border-box" + // "content-box" (default) + geom.boxModel = "content-box"; + + // We punt per-node box mode testing completely. + // If anybody cares, we can provide an additional (optional) unit + // that overrides existing code to include per-node box sensitivity. + + // Opera documentation claims that Opera 9 uses border-box in BackCompat mode. + // but experiments (Opera 9.10.8679 on Windows Vista) indicate that it actually continues to use content-box. + // IIRC, earlier versions of Opera did in fact use border-box. + // Opera guys, this is really confusing. Opera being broken in quirks mode is not our fault. + + if(has("ie") /*|| has("opera")*/){ + // client code may have to adjust if compatMode varies across iframes + geom.boxModel = document.compatMode == "BackCompat" ? "border-box" : "content-box"; + } + + // ============================= + // Box Functions + // ============================= + + /*===== + dojo.getPadExtents = function(node, computedStyle){ + // summary: + // Returns object with special values specifically useful for node + // fitting. + // description: + // Returns an object with `w`, `h`, `l`, `t` properties: + // | l/t/r/b = left/top/right/bottom padding (respectively) + // | w = the total of the left and right padding + // | h = the total of the top and bottom padding + // If 'node' has position, l/t forms the origin for child nodes. + // The w/h are used for calculating boxes. + // Normally application code will not need to invoke this + // directly, and will use the ...box... functions instead. + // node: DOMNode + // computedStyle: Object? + // This parameter accepts computed styles object. + // If this parameter is omitted, the functions will call + // dojo.getComputedStyle to get one. It is a better way, calling + // dojo.computedStyle once, and then pass the reference to this + // computedStyle parameter. Wherever possible, reuse the returned + // object of dojo.getComputedStyle. + + + }; + =====*/ + + /*===== + dojo._getPadExtents = function(node, computedStyle){ + // summary: + // Existing alias for `dojo.getPadExtents`. Deprecated, will be removed in 2.0. + }; + =====*/ + + /*===== + dojo.getBorderExtents = function(node, computedStyle){ + // summary: + // returns an object with properties useful for noting the border + // dimensions. + // description: + // * l/t/r/b = the sum of left/top/right/bottom border (respectively) + // * w = the sum of the left and right border + // * h = the sum of the top and bottom border + // + // The w/h are used for calculating boxes. + // Normally application code will not need to invoke this + // directly, and will use the ...box... functions instead. + // node: DOMNode + // computedStyle: Object? + // This parameter accepts computed styles object. + // If this parameter is omitted, the functions will call + // dojo.getComputedStyle to get one. It is a better way, calling + // dojo.computedStyle once, and then pass the reference to this + // computedStyle parameter. Wherever possible, reuse the returned + // object of dojo.getComputedStyle. + + + }; + =====*/ + + /*===== + dojo._getBorderExtents = function(node, computedStyle){ + // summary: + // Existing alias for `dojo.getBorderExtents`. Deprecated, will be removed in 2.0. + }; + =====*/ + + /*===== + dojo.getPadBorderExtents = function(node, computedStyle){ + // summary: + // Returns object with properties useful for box fitting with + // regards to padding. + // description: + // * l/t/r/b = the sum of left/top/right/bottom padding and left/top/right/bottom border (respectively) + // * w = the sum of the left and right padding and border + // * h = the sum of the top and bottom padding and border + // + // The w/h are used for calculating boxes. + // Normally application code will not need to invoke this + // directly, and will use the ...box... functions instead. + // node: DOMNode + // computedStyle: Object? + // This parameter accepts computed styles object. + // If this parameter is omitted, the functions will call + // dojo.getComputedStyle to get one. It is a better way, calling + // dojo.computedStyle once, and then pass the reference to this + // computedStyle parameter. Wherever possible, reuse the returned + // object of dojo.getComputedStyle. + + + }; + =====*/ + + /*===== + dojo._getPadBorderExtents = function(node, computedStyle){ + // summary: + // Existing alias for `dojo.getPadBorderExtents`. Deprecated, will be removed in 2.0. + }; + =====*/ + + /*===== + dojo.getMarginExtents = function(node, computedStyle){ + // summary: + // returns object with properties useful for box fitting with + // regards to box margins (i.e., the outer-box). + // + // * l/t = marginLeft, marginTop, respectively + // * w = total width, margin inclusive + // * h = total height, margin inclusive + // + // The w/h are used for calculating boxes. + // Normally application code will not need to invoke this + // directly, and will use the ...box... functions instead. + // node: DOMNode + // computedStyle: Object? + // This parameter accepts computed styles object. + // If this parameter is omitted, the functions will call + // dojo.getComputedStyle to get one. It is a better way, calling + // dojo.computedStyle once, and then pass the reference to this + // computedStyle parameter. Wherever possible, reuse the returned + // object of dojo.getComputedStyle. + }; + =====*/ + + /*===== + dojo._getMarginExtents = function(node, computedStyle){ + // summary: + // Existing alias for `dojo.getMarginExtents`. Deprecated, will be removed in 2.0. + }; + =====*/ + + /*===== + dojo.getMarginSize = function(node, computedStyle){ + // summary: + // returns an object that encodes the width and height of + // the node's margin box + // node: DOMNode|String + // computedStyle: Object? + // This parameter accepts computed styles object. + // If this parameter is omitted, the functions will call + // dojo.getComputedStyle to get one. It is a better way, calling + // dojo.computedStyle once, and then pass the reference to this + // computedStyle parameter. Wherever possible, reuse the returned + // object of dojo.getComputedStyle. + }; + =====*/ + + /*===== + dojo._getMarginSize = function(node, computedStyle){ + // summary: + // Existing alias for `dojo.getMarginSize`. Deprecated, will be removed in 2.0. + }; + =====*/ + + /*===== + dojo.getMarginBox = function(node, computedStyle){ + // summary: + // returns an object that encodes the width, height, left and top + // positions of the node's margin box. + // node: DOMNode + // computedStyle: Object? + // This parameter accepts computed styles object. + // If this parameter is omitted, the functions will call + // dojo.getComputedStyle to get one. It is a better way, calling + // dojo.computedStyle once, and then pass the reference to this + // computedStyle parameter. Wherever possible, reuse the returned + // object of dojo.getComputedStyle. + }; + =====*/ + + /*===== + dojo._getMarginBox = function(node, computedStyle){ + // summary: + // Existing alias for `dojo.getMarginBox`. Deprecated, will be removed in 2.0. + }; + =====*/ + + /*===== + dojo.setMarginBox = function(node, box, computedStyle){ + // summary: + // sets the size of the node's margin box and placement + // (left/top), irrespective of box model. Think of it as a + // passthrough to setBox that handles box-model vagaries for + // you. + // node: DOMNode + // box: Object + // hash with optional "l", "t", "w", and "h" properties for "left", "right", "width", and "height" + // respectively. All specified properties should have numeric values in whole pixels. + // computedStyle: Object? + // This parameter accepts computed styles object. + // If this parameter is omitted, the functions will call + // dojo.getComputedStyle to get one. It is a better way, calling + // dojo.computedStyle once, and then pass the reference to this + // computedStyle parameter. Wherever possible, reuse the returned + // object of dojo.getComputedStyle. + }; + =====*/ + + /*===== + dojo.getContentBox = function(node, computedStyle){ + // summary: + // Returns an object that encodes the width, height, left and top + // positions of the node's content box, irrespective of the + // current box model. + // node: DOMNode + // computedStyle: Object? + // This parameter accepts computed styles object. + // If this parameter is omitted, the functions will call + // dojo.getComputedStyle to get one. It is a better way, calling + // dojo.computedStyle once, and then pass the reference to this + // computedStyle parameter. Wherever possible, reuse the returned + // object of dojo.getComputedStyle. + }; + =====*/ + + /*===== + dojo._getContentBox = function(node, computedStyle){ + // summary: + // Existing alias for `dojo.getContentBox`. Deprecated, will be removed in 2.0. + }; + =====*/ + + /*===== + dojo.setContentSize = function(node, box, computedStyle){ + // summary: + // Sets the size of the node's contents, irrespective of margins, + // padding, or borders. + // node: DOMNode + // box: Object + // hash with optional "w", and "h" properties for "width", and "height" + // respectively. All specified properties should have numeric values in whole pixels. + // computedStyle: Object? + // This parameter accepts computed styles object. + // If this parameter is omitted, the functions will call + // dojo.getComputedStyle to get one. It is a better way, calling + // dojo.computedStyle once, and then pass the reference to this + // computedStyle parameter. Wherever possible, reuse the returned + // object of dojo.getComputedStyle. + }; + =====*/ + + /*===== + dojo.isBodyLtr = function(){ + // summary: + // Returns true if the current language is left-to-right, and false otherwise. + // returns: Boolean + }; + =====*/ + + /*===== + dojo._isBodyLtr = function(){ + // summary: + // Existing alias for `dojo.isBodyLtr`. Deprecated, will be removed in 2.0. + }; + =====*/ + + /*===== + dojo.docScroll = function(){ + // summary: + // Returns an object with {node, x, y} with corresponding offsets. + // returns: Object + }; + =====*/ + + /*===== + dojo._docScroll = function(){ + // summary: + // Existing alias for `dojo.docScroll`. Deprecated, will be removed in 2.0. + }; + =====*/ + + /*===== + dojo.getIeDocumentElementOffset = function(){ + // summary: + // returns the offset in x and y from the document body to the + // visual edge of the page for IE + // description: + // The following values in IE contain an offset: + // | event.clientX + // | event.clientY + // | node.getBoundingClientRect().left + // | node.getBoundingClientRect().top + // But other position related values do not contain this offset, + // such as node.offsetLeft, node.offsetTop, node.style.left and + // node.style.top. The offset is always (2, 2) in LTR direction. + // When the body is in RTL direction, the offset counts the width + // of left scroll bar's width. This function computes the actual + // offset. + }; + =====*/ + + /*===== + dojo._getIeDocumentElementOffset = function(){ + // summary: + // Existing alias for `dojo.getIeDocumentElementOffset`. Deprecated, will be removed in 2.0. + }; + =====*/ + + /*===== + dojo.fixIeBiDiScrollLeft = function(scrollLeft){ + // summary: + // In RTL direction, scrollLeft should be a negative value, but IE + // returns a positive one. All codes using documentElement.scrollLeft + // must call this function to fix this error, otherwise the position + // will offset to right when there is a horizontal scrollbar. + // scrollLeft: NUmber + // returns: Number + }; + =====*/ + + /*===== + dojo._fixIeBiDiScrollLeft = function(scrollLeft){ + // summary: + // Existing alias for `dojo.fixIeBiDiScrollLeft`. Deprecated, will be removed in 2.0. + }; + =====*/ + + /*===== + dojo.position = function(node, includeScroll){ + // summary: + // Gets the position and size of the passed element relative to + // the viewport (if includeScroll==false), or relative to the + // document root (if includeScroll==true). + // + // description: + // Returns an object of the form: + // { x: 100, y: 300, w: 20, h: 15 } + // If includeScroll==true, the x and y values will include any + // document offsets that may affect the position relative to the + // viewport. + // Uses the border-box model (inclusive of border and padding but + // not margin). Does not act as a setter. + // node: DOMNode|String + // includeScroll: Boolean? + // returns: Object + }; + =====*/ + + geom.getPadExtents = function getPadExtents(/*DomNode*/node, /*Object*/computedStyle){ + node = dom.byId(node); + var s = computedStyle || style.getComputedStyle(node), px = style.toPixelValue, + l = px(node, s.paddingLeft), t = px(node, s.paddingTop), r = px(node, s.paddingRight), b = px(node, s.paddingBottom); + return {l: l, t: t, r: r, b: b, w: l + r, h: t + b}; + }; + + var none = "none"; + + geom.getBorderExtents = function getBorderExtents(/*DomNode*/node, /*Object*/computedStyle){ + node = dom.byId(node); + var px = style.toPixelValue, s = computedStyle || style.getComputedStyle(node), + l = s.borderLeftStyle != none ? px(node, s.borderLeftWidth) : 0, + t = s.borderTopStyle != none ? px(node, s.borderTopWidth) : 0, + r = s.borderRightStyle != none ? px(node, s.borderRightWidth) : 0, + b = s.borderBottomStyle != none ? px(node, s.borderBottomWidth) : 0; + return {l: l, t: t, r: r, b: b, w: l + r, h: t + b}; + }; + + geom.getPadBorderExtents = function getPadBorderExtents(/*DomNode*/node, /*Object*/computedStyle){ + node = dom.byId(node); + var s = computedStyle || style.getComputedStyle(node), + p = geom.getPadExtents(node, s), + b = geom.getBorderExtents(node, s); + return { + l: p.l + b.l, + t: p.t + b.t, + r: p.r + b.r, + b: p.b + b.b, + w: p.w + b.w, + h: p.h + b.h + }; + }; + + geom.getMarginExtents = function getMarginExtents(node, computedStyle){ + node = dom.byId(node); + var s = computedStyle || style.getComputedStyle(node), px = style.toPixelValue, + l = px(node, s.marginLeft), t = px(node, s.marginTop), r = px(node, s.marginRight), b = px(node, s.marginBottom); + if(has("webkit") && (s.position != "absolute")){ + // FIXME: Safari's version of the computed right margin + // is the space between our right edge and the right edge + // of our offsetParent. + // What we are looking for is the actual margin value as + // determined by CSS. + // Hack solution is to assume left/right margins are the same. + r = l; + } + return {l: l, t: t, r: r, b: b, w: l + r, h: t + b}; + }; + + // Box getters work in any box context because offsetWidth/clientWidth + // are invariant wrt box context + // + // They do *not* work for display: inline objects that have padding styles + // because the user agent ignores padding (it's bogus styling in any case) + // + // Be careful with IMGs because they are inline or block depending on + // browser and browser mode. + + // Although it would be easier to read, there are not separate versions of + // _getMarginBox for each browser because: + // 1. the branching is not expensive + // 2. factoring the shared code wastes cycles (function call overhead) + // 3. duplicating the shared code wastes bytes + + geom.getMarginBox = function getMarginBox(/*DomNode*/node, /*Object*/computedStyle){ + // summary: + // returns an object that encodes the width, height, left and top + // positions of the node's margin box. + node = dom.byId(node); + var s = computedStyle || style.getComputedStyle(node), me = geom.getMarginExtents(node, s), + l = node.offsetLeft - me.l, t = node.offsetTop - me.t, p = node.parentNode, px = style.toPixelValue, pcs; + if(has("mozilla")){ + // Mozilla: + // If offsetParent has a computed overflow != visible, the offsetLeft is decreased + // by the parent's border. + // We don't want to compute the parent's style, so instead we examine node's + // computed left/top which is more stable. + var sl = parseFloat(s.left), st = parseFloat(s.top); + if(!isNaN(sl) && !isNaN(st)){ + l = sl, t = st; + }else{ + // If child's computed left/top are not parseable as a number (e.g. "auto"), we + // have no choice but to examine the parent's computed style. + if(p && p.style){ + pcs = style.getComputedStyle(p); + if(pcs.overflow != "visible"){ + l += pcs.borderLeftStyle != none ? px(node, pcs.borderLeftWidth) : 0; + t += pcs.borderTopStyle != none ? px(node, pcs.borderTopWidth) : 0; + } + } + } + }else if(has("opera") || (has("ie") == 8 && !has("quirks"))){ + // On Opera and IE 8, offsetLeft/Top includes the parent's border + if(p){ + pcs = style.getComputedStyle(p); + l -= pcs.borderLeftStyle != none ? px(node, pcs.borderLeftWidth) : 0; + t -= pcs.borderTopStyle != none ? px(node, pcs.borderTopWidth) : 0; + } + } + return {l: l, t: t, w: node.offsetWidth + me.w, h: node.offsetHeight + me.h}; + }; + + geom.getContentBox = function getContentBox(node, computedStyle){ + // clientWidth/Height are important since the automatically account for scrollbars + // fallback to offsetWidth/Height for special cases (see #3378) + node = dom.byId(node); + var s = computedStyle || style.getComputedStyle(node), w = node.clientWidth, h, + pe = geom.getPadExtents(node, s), be = geom.getBorderExtents(node, s); + if(!w){ + w = node.offsetWidth; + h = node.offsetHeight; + }else{ + h = node.clientHeight; + be.w = be.h = 0; + } + // On Opera, offsetLeft includes the parent's border + if(has("opera")){ + pe.l += be.l; + pe.t += be.t; + } + return {l: pe.l, t: pe.t, w: w - pe.w - be.w, h: h - pe.h - be.h}; + }; + + // Box setters depend on box context because interpretation of width/height styles + // vary wrt box context. + // + // The value of dojo.boxModel is used to determine box context. + // dojo.boxModel can be set directly to change behavior. + // + // Beware of display: inline objects that have padding styles + // because the user agent ignores padding (it's a bogus setup anyway) + // + // Be careful with IMGs because they are inline or block depending on + // browser and browser mode. + // + // Elements other than DIV may have special quirks, like built-in + // margins or padding, or values not detectable via computedStyle. + // In particular, margins on TABLE do not seems to appear + // at all in computedStyle on Mozilla. + + function setBox(/*DomNode*/node, /*Number?*/l, /*Number?*/t, /*Number?*/w, /*Number?*/h, /*String?*/u){ + // summary: + // sets width/height/left/top in the current (native) box-model + // dimensions. Uses the unit passed in u. + // node: + // DOM Node reference. Id string not supported for performance + // reasons. + // l: + // left offset from parent. + // t: + // top offset from parent. + // w: + // width in current box model. + // h: + // width in current box model. + // u: + // unit measure to use for other measures. Defaults to "px". + u = u || "px"; + var s = node.style; + if(!isNaN(l)){ + s.left = l + u; + } + if(!isNaN(t)){ + s.top = t + u; + } + if(w >= 0){ + s.width = w + u; + } + if(h >= 0){ + s.height = h + u; + } + } + + function isButtonTag(/*DomNode*/node){ + // summary: + // True if the node is BUTTON or INPUT.type="button". + return node.tagName.toLowerCase() == "button" || + node.tagName.toLowerCase() == "input" && (node.getAttribute("type") || "").toLowerCase() == "button"; // boolean + } + + function usesBorderBox(/*DomNode*/node){ + // summary: + // True if the node uses border-box layout. + + // We could test the computed style of node to see if a particular box + // has been specified, but there are details and we choose not to bother. + + // TABLE and BUTTON (and INPUT type=button) are always border-box by default. + // If you have assigned a different box to either one via CSS then + // box functions will break. + + return geom.boxModel == "border-box" || node.tagName.toLowerCase() == "table" || isButtonTag(node); // boolean + } + + geom.setContentSize = function setContentSize(/*DomNode*/node, /*Object*/box, /*Object*/computedStyle){ + // summary: + // Sets the size of the node's contents, irrespective of margins, + // padding, or borders. + + node = dom.byId(node); + var w = box.w, h = box.h; + if(usesBorderBox(node)){ + var pb = geom.getPadBorderExtents(node, computedStyle); + if(w >= 0){ + w += pb.w; + } + if(h >= 0){ + h += pb.h; + } + } + setBox(node, NaN, NaN, w, h); + }; + + var nilExtents = {l: 0, t: 0, w: 0, h: 0}; + + geom.setMarginBox = function setMarginBox(/*DomNode*/node, /*Object*/box, /*Object*/computedStyle){ + node = dom.byId(node); + var s = computedStyle || style.getComputedStyle(node), w = box.w, h = box.h, + // Some elements have special padding, margin, and box-model settings. + // To use box functions you may need to set padding, margin explicitly. + // Controlling box-model is harder, in a pinch you might set dojo.boxModel. + pb = usesBorderBox(node) ? nilExtents : geom.getPadBorderExtents(node, s), + mb = geom.getMarginExtents(node, s); + if(has("webkit")){ + // on Safari (3.1.2), button nodes with no explicit size have a default margin + // setting an explicit size eliminates the margin. + // We have to swizzle the width to get correct margin reading. + if(isButtonTag(node)){ + var ns = node.style; + if(w >= 0 && !ns.width){ + ns.width = "4px"; + } + if(h >= 0 && !ns.height){ + ns.height = "4px"; + } + } + } + if(w >= 0){ + w = Math.max(w - pb.w - mb.w, 0); + } + if(h >= 0){ + h = Math.max(h - pb.h - mb.h, 0); + } + setBox(node, box.l, box.t, w, h); + }; + + // ============================= + // Positioning + // ============================= + + geom.isBodyLtr = function isBodyLtr(){ + return (win.body().dir || win.doc.documentElement.dir || "ltr").toLowerCase() == "ltr"; // Boolean + }; + + geom.docScroll = function docScroll(){ + var node = win.doc.parentWindow || win.doc.defaultView; // use UI window, not dojo.global window + return "pageXOffset" in node ? {x: node.pageXOffset, y: node.pageYOffset } : + (node = has("quirks") ? win.body() : win.doc.documentElement, + {x: geom.fixIeBiDiScrollLeft(node.scrollLeft || 0), y: node.scrollTop || 0 }); + }; + + geom.getIeDocumentElementOffset = function getIeDocumentElementOffset(){ + //NOTE: assumes we're being called in an IE browser + + var de = win.doc.documentElement; // only deal with HTML element here, position() handles body/quirks + + if(has("ie") < 8){ + var r = de.getBoundingClientRect(), // works well for IE6+ + l = r.left, t = r.top; + if(has("ie") < 7){ + l += de.clientLeft; // scrollbar size in strict/RTL, or, + t += de.clientTop; // HTML border size in strict + } + return { + x: l < 0 ? 0 : l, // FRAME element border size can lead to inaccurate negative values + y: t < 0 ? 0 : t + }; + }else{ + return { + x: 0, + y: 0 + }; + } + }; + + geom.fixIeBiDiScrollLeft = function fixIeBiDiScrollLeft(/*Integer*/ scrollLeft){ + // In RTL direction, scrollLeft should be a negative value, but IE + // returns a positive one. All codes using documentElement.scrollLeft + // must call this function to fix this error, otherwise the position + // will offset to right when there is a horizontal scrollbar. + + var ie = has("ie"); + if(ie && !geom.isBodyLtr()){ + var qk = has("quirks"), + de = qk ? win.body() : win.doc.documentElement; + if(ie == 6 && !qk && win.global.frameElement && de.scrollHeight > de.clientHeight){ + scrollLeft += de.clientLeft; // workaround ie6+strict+rtl+iframe+vertical-scrollbar bug where clientWidth is too small by clientLeft pixels + } + return (ie < 8 || qk) ? (scrollLeft + de.clientWidth - de.scrollWidth) : -scrollLeft; // Integer + } + return scrollLeft; // Integer + }; + + geom.position = function(/*DomNode*/node, /*Boolean?*/includeScroll){ + node = dom.byId(node); + var db = win.body(), + dh = db.parentNode, + ret = node.getBoundingClientRect(); + ret = {x: ret.left, y: ret.top, w: ret.right - ret.left, h: ret.bottom - ret.top}; + if(has("ie")){ + // On IE there's a 2px offset that we need to adjust for, see dojo.getIeDocumentElementOffset() + var offset = geom.getIeDocumentElementOffset(); + + // fixes the position in IE, quirks mode + ret.x -= offset.x + (has("quirks") ? db.clientLeft + db.offsetLeft : 0); + ret.y -= offset.y + (has("quirks") ? db.clientTop + db.offsetTop : 0); + }else if(has("ff") == 3){ + // In FF3 you have to subtract the document element margins. + // Fixed in FF3.5 though. + var cs = style.getComputedStyle(dh), px = style.toPixelValue; + ret.x -= px(dh, cs.marginLeft) + px(dh, cs.borderLeftWidth); + ret.y -= px(dh, cs.marginTop) + px(dh, cs.borderTopWidth); + } + // account for document scrolling + // if offsetParent is used, ret value already includes scroll position + // so we may have to actually remove that value if !includeScroll + if(includeScroll){ + var scroll = geom.docScroll(); + ret.x += scroll.x; + ret.y += scroll.y; + } + + return ret; // Object + }; + + // random "private" functions wildly used throughout the toolkit + + geom.getMarginSize = function getMarginSize(/*DomNode*/node, /*Object*/computedStyle){ + node = dom.byId(node); + var me = geom.getMarginExtents(node, computedStyle || style.getComputedStyle(node)); + var size = node.getBoundingClientRect(); + return { + w: (size.right - size.left) + me.w, + h: (size.bottom - size.top) + me.h + } + }; + + geom.normalizeEvent = function(event){ + // summary: + // Normalizes the geometry of a DOM event, normalizing the pageX, pageY, + // offsetX, offsetY, layerX, and layerX properties + // event: Object + if(!("layerX" in event)){ + event.layerX = event.offsetX; + event.layerY = event.offsetY; + } + if(!has("dom-addeventlistener")){ + // old IE version + // FIXME: scroll position query is duped from dojo.html to + // avoid dependency on that entire module. Now that HTML is in + // Base, we should convert back to something similar there. + var se = event.target; + var doc = (se && se.ownerDocument) || document; + // DO NOT replace the following to use dojo.body(), in IE, document.documentElement should be used + // here rather than document.body + var docBody = has("quirks") ? doc.body : doc.documentElement; + var offset = geom.getIeDocumentElementOffset(); + event.pageX = event.clientX + geom.fixIeBiDiScrollLeft(docBody.scrollLeft || 0) - offset.x; + event.pageY = event.clientY + (docBody.scrollTop || 0) - offset.y; + } + }; + + // TODO: evaluate separate getters/setters for position and sizes? + + return geom; +}); diff --git a/lib/dojo/dom-prop.js b/lib/dojo/dom-prop.js new file mode 100644 index 00000000..5867d8fa --- /dev/null +++ b/lib/dojo/dom-prop.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/dom-prop",["exports","./_base/kernel","./_base/sniff","./_base/lang","./dom","./dom-style","./dom-construct","./_base/connect"],function(_1,_2,_3,_4,_5,_6,_7,_8){var _9={},_a=0,_b=_2._scopeName+"attrid";var _c={col:1,colgroup:1,table:1,tbody:1,tfoot:1,thead:1,tr:1,title:1};_1.names={"class":"className","for":"htmlFor",tabindex:"tabIndex",readonly:"readOnly",colspan:"colSpan",frameborder:"frameBorder",rowspan:"rowSpan",valuetype:"valueType"};_1.get=function getProp(_d,_e){_d=_5.byId(_d);var lc=_e.toLowerCase(),_f=_1.names[lc]||_e;return _d[_f];};_1.set=function setProp(_10,_11,_12){_10=_5.byId(_10);var l=arguments.length;if(l==2&&typeof _11!="string"){for(var x in _11){_1.set(_10,x,_11[x]);}return _10;}var lc=_11.toLowerCase(),_13=_1.names[lc]||_11;if(_13=="style"&&typeof _12!="string"){_6.style(_10,_12);return _10;}if(_13=="innerHTML"){if(_3("ie")&&_10.tagName.toLowerCase() in _c){_7.empty(_10);_10.appendChild(_7.toDom(_12,_10.ownerDocument));}else{_10[_13]=_12;}return _10;}if(_4.isFunction(_12)){var _14=_10[_b];if(!_14){_14=_a++;_10[_b]=_14;}if(!_9[_14]){_9[_14]={};}var h=_9[_14][_13];if(h){_8.disconnect(h);}else{try{delete _10[_13];}catch(e){}}if(_12){_9[_14][_13]=_8.connect(_10,_13,_12);}else{_10[_13]=null;}return _10;}_10[_13]=_12;return _10;};}); \ No newline at end of file diff --git a/lib/dojo/dom-prop.js.uncompressed.js b/lib/dojo/dom-prop.js.uncompressed.js new file mode 100644 index 00000000..04e690e6 --- /dev/null +++ b/lib/dojo/dom-prop.js.uncompressed.js @@ -0,0 +1,190 @@ +define("dojo/dom-prop", ["exports", "./_base/kernel", "./_base/sniff", "./_base/lang", "./dom", "./dom-style", "./dom-construct", "./_base/connect"], + function(exports, dojo, has, lang, dom, style, ctr, conn){ + // module: + // dojo/dom-prop + // summary: + // This module defines the core dojo DOM properties API. + // Indirectly depends on dojo.empty() and dojo.toDom(). + + // ============================= + // Element properties Functions + // ============================= + + /*===== + prop.get = function(node, name){ + // summary: + // Gets a property on an HTML element. + // description: + // Handles normalized getting of properties on DOM nodes. + // + // node: DOMNode|String + // id or reference to the element to get the property on + // name: String + // the name of the property to get. + // returns: + // the value of the requested property or its default value + // + // example: + // | // get the current value of the "foo" property on a node + // | dojo.getProp(dojo.byId("nodeId"), "foo"); + // | // or we can just pass the id: + // | dojo.getProp("nodeId", "foo"); + }; + =====*/ + + /*===== + prop.set = function(node, name, value){ + // summary: + // Sets a property on an HTML element. + // description: + // Handles normalized setting of properties on DOM nodes. + // + // When passing functions as values, note that they will not be + // directly assigned to slots on the node, but rather the default + // behavior will be removed and the new behavior will be added + // using `dojo.connect()`, meaning that event handler properties + // will be normalized and that some caveats with regards to + // non-standard behaviors for onsubmit apply. Namely that you + // should cancel form submission using `dojo.stopEvent()` on the + // passed event object instead of returning a boolean value from + // the handler itself. + // node: DOMNode|String + // id or reference to the element to set the property on + // name: String|Object + // the name of the property to set, or a hash object to set + // multiple properties at once. + // value: String? + // The value to set for the property + // returns: + // the DOM node + // + // example: + // | // use prop() to set the tab index + // | dojo.setProp("nodeId", "tabIndex", 3); + // | + // + // example: + // Set multiple values at once, including event handlers: + // | dojo.setProp("formId", { + // | "foo": "bar", + // | "tabIndex": -1, + // | "method": "POST", + // | "onsubmit": function(e){ + // | // stop submitting the form. Note that the IE behavior + // | // of returning true or false will have no effect here + // | // since our handler is connect()ed to the built-in + // | // onsubmit behavior and so we need to use + // | // dojo.stopEvent() to ensure that the submission + // | // doesn't proceed. + // | dojo.stopEvent(e); + // | + // | // submit the form with Ajax + // | dojo.xhrPost({ form: "formId" }); + // | } + // | }); + // + // example: + // Style is s special case: Only set with an object hash of styles + // | dojo.setProp("someNode",{ + // | id:"bar", + // | style:{ + // | width:"200px", height:"100px", color:"#000" + // | } + // | }); + // + // example: + // Again, only set style as an object hash of styles: + // | var obj = { color:"#fff", backgroundColor:"#000" }; + // | dojo.setProp("someNode", "style", obj); + // | + // | // though shorter to use `dojo.style()` in this case: + // | dojo.style("someNode", obj); + }; + =====*/ + + // helper to connect events + var _evtHdlrMap = {}, _ctr = 0, _attrId = dojo._scopeName + "attrid"; + + // the next dictionary lists elements with read-only innerHTML on IE + var _roInnerHtml = {col: 1, colgroup: 1, + // frameset: 1, head: 1, html: 1, style: 1, + table: 1, tbody: 1, tfoot: 1, thead: 1, tr: 1, title: 1}; + + exports.names = { + // properties renamed to avoid clashes with reserved words + "class": "className", + "for": "htmlFor", + // properties written as camelCase + tabindex: "tabIndex", + readonly: "readOnly", + colspan: "colSpan", + frameborder: "frameBorder", + rowspan: "rowSpan", + valuetype: "valueType" + }; + + exports.get = function getProp(/*DOMNode|String*/node, /*String*/name){ + node = dom.byId(node); + var lc = name.toLowerCase(), propName = exports.names[lc] || name; + return node[propName]; // Anything + }; + + exports.set = function setProp(/*DOMNode|String*/node, /*String|Object*/name, /*String?*/value){ + node = dom.byId(node); + var l = arguments.length; + if(l == 2 && typeof name != "string"){ // inline'd type check + // the object form of setter: the 2nd argument is a dictionary + for(var x in name){ + exports.set(node, x, name[x]); + } + return node; // DomNode + } + var lc = name.toLowerCase(), propName = exports.names[lc] || name; + if(propName == "style" && typeof value != "string"){ // inline'd type check + // special case: setting a style + style.style(node, value); + return node; // DomNode + } + if(propName == "innerHTML"){ + // special case: assigning HTML + if(has("ie") && node.tagName.toLowerCase() in _roInnerHtml){ + ctr.empty(node); + node.appendChild(ctr.toDom(value, node.ownerDocument)); + }else{ + node[propName] = value; + } + return node; // DomNode + } + if(lang.isFunction(value)){ + // special case: assigning an event handler + // clobber if we can + var attrId = node[_attrId]; + if(!attrId){ + attrId = _ctr++; + node[_attrId] = attrId; + } + if(!_evtHdlrMap[attrId]){ + _evtHdlrMap[attrId] = {}; + } + var h = _evtHdlrMap[attrId][propName]; + if(h){ + //h.remove(); + conn.disconnect(h); + }else{ + try{ + delete node[propName]; + }catch(e){} + } + // ensure that event objects are normalized, etc. + if(value){ + //_evtHdlrMap[attrId][propName] = on(node, propName, value); + _evtHdlrMap[attrId][propName] = conn.connect(node, propName, value); + }else{ + node[propName] = null; + } + return node; // DomNode + } + node[propName] = value; + return node; // DomNode + }; +}); diff --git a/lib/dojo/dom-style.js b/lib/dojo/dom-style.js new file mode 100644 index 00000000..f996e2e5 --- /dev/null +++ b/lib/dojo/dom-style.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/dom-style",["./_base/sniff","./dom"],function(_1,_2){var _3,_4={};if(_1("webkit")){_3=function(_5){var s;if(_5.nodeType==1){var dv=_5.ownerDocument.defaultView;s=dv.getComputedStyle(_5,null);if(!s&&_5.style){_5.style.display="";s=dv.getComputedStyle(_5,null);}}return s||{};};}else{if(_1("ie")&&(_1("ie")<9||_1("quirks"))){_3=function(_6){return _6.nodeType==1?_6.currentStyle:{};};}else{_3=function(_7){return _7.nodeType==1?_7.ownerDocument.defaultView.getComputedStyle(_7,null):{};};}}_4.getComputedStyle=_3;var _8;if(!_1("ie")){_8=function(_9,_a){return parseFloat(_a)||0;};}else{_8=function(_b,_c){if(!_c){return 0;}if(_c=="medium"){return 4;}if(_c.slice&&_c.slice(-2)=="px"){return parseFloat(_c);}var s=_b.style,rs=_b.runtimeStyle,cs=_b.currentStyle,_d=s.left,_e=rs.left;rs.left=cs.left;try{s.left=_c;_c=s.pixelLeft;}catch(e){_c=0;}s.left=_d;rs.left=_e;return _c;};}_4.toPixelValue=_8;var _f="DXImageTransform.Microsoft.Alpha";var af=function(n,f){try{return n.filters.item(_f);}catch(e){return f?{}:null;}};var _10=_1("ie")<9||(_1("ie")&&_1("quirks"))?function(_11){try{return af(_11).Opacity/100;}catch(e){return 1;}}:function(_12){return _3(_12).opacity;};var _13=_1("ie")<9||(_1("ie")&&_1("quirks"))?function(_14,_15){var ov=_15*100,_16=_15==1;_14.style.zoom=_16?"":1;if(!af(_14)){if(_16){return _15;}_14.style.filter+=" progid:"+_f+"(Opacity="+ov+")";}else{af(_14,1).Opacity=ov;}af(_14,1).Enabled=!_16;if(_14.tagName.toLowerCase()=="tr"){for(var td=_14.firstChild;td;td=td.nextSibling){if(td.tagName.toLowerCase()=="td"){_13(td,_15);}}}return _15;}:function(_17,_18){return _17.style.opacity=_18;};var _19={left:true,top:true};var _1a=/margin|padding|width|height|max|min|offset/;function _1b(_1c,_1d,_1e){_1d=_1d.toLowerCase();if(_1("ie")){if(_1e=="auto"){if(_1d=="height"){return _1c.offsetHeight;}if(_1d=="width"){return _1c.offsetWidth;}}if(_1d=="fontweight"){switch(_1e){case 700:return "bold";case 400:default:return "normal";}}}if(!(_1d in _19)){_19[_1d]=_1a.test(_1d);}return _19[_1d]?_8(_1c,_1e):_1e;};var _1f=_1("ie")?"styleFloat":"cssFloat",_20={"cssFloat":_1f,"styleFloat":_1f,"float":_1f};_4.get=function getStyle(_21,_22){var n=_2.byId(_21),l=arguments.length,op=(_22=="opacity");if(l==2&&op){return _10(n);}_22=_20[_22]||_22;var s=_4.getComputedStyle(n);return (l==1)?s:_1b(n,_22,s[_22]||n.style[_22]);};_4.set=function setStyle(_23,_24,_25){var n=_2.byId(_23),l=arguments.length,op=(_24=="opacity");_24=_20[_24]||_24;if(l==3){return op?_13(n,_25):n.style[_24]=_25;}for(var x in _24){_4.set(_23,x,_24[x]);}return _4.getComputedStyle(n);};return _4;}); \ No newline at end of file diff --git a/lib/dojo/dom-style.js.uncompressed.js b/lib/dojo/dom-style.js.uncompressed.js new file mode 100644 index 00000000..e6b3822c --- /dev/null +++ b/lib/dojo/dom-style.js.uncompressed.js @@ -0,0 +1,321 @@ +define("dojo/dom-style", ["./_base/sniff", "./dom"], function(has, dom){ + // module: + // dojo/dom-style + // summary: + // This module defines the core dojo DOM style API. + + // ============================= + // Style Functions + // ============================= + + // getComputedStyle drives most of the style code. + // Wherever possible, reuse the returned object. + // + // API functions below that need to access computed styles accept an + // optional computedStyle parameter. + // If this parameter is omitted, the functions will call getComputedStyle themselves. + // This way, calling code can access computedStyle once, and then pass the reference to + // multiple API functions. + + /*===== + dojo.getComputedStyle = function(node){ + // summary: + // Returns a "computed style" object. + // + // description: + // Gets a "computed style" object which can be used to gather + // information about the current state of the rendered node. + // + // Note that this may behave differently on different browsers. + // Values may have different formats and value encodings across + // browsers. + // + // Note also that this method is expensive. Wherever possible, + // reuse the returned object. + // + // Use the dojo.style() method for more consistent (pixelized) + // return values. + // + // node: DOMNode + // A reference to a DOM node. Does NOT support taking an + // ID string for speed reasons. + // example: + // | dojo.getComputedStyle(dojo.byId('foo')).borderWidth; + // + // example: + // Reusing the returned object, avoiding multiple lookups: + // | var cs = dojo.getComputedStyle(dojo.byId("someNode")); + // | var w = cs.width, h = cs.height; + return; // CSS2Properties + } + =====*/ + + /*===== + dojo.toPixelValue = function(node, value){ + // summary: + // converts style value to pixels on IE or return a numeric value. + // node: DOMNode + // value: String + // returns: Number + }; + =====*/ + + /*===== + dojo._toPixelValue = function(node, value){ + // summary: + // Existing alias for `dojo._toPixelValue`. Deprecated, will be removed in 2.0. + }; + =====*/ + + /*===== + dojo.getStyle = function(node, name){ + // summary: + // Accesses styles on a node. + // description: + // Getting the style value uses the computed style for the node, so the value + // will be a calculated value, not just the immediate node.style value. + // Also when getting values, use specific style names, + // like "borderBottomWidth" instead of "border" since compound values like + // "border" are not necessarily reflected as expected. + // If you want to get node dimensions, use `dojo.marginBox()`, + // `dojo.contentBox()` or `dojo.position()`. + // node: DOMNode|String + // id or reference to node to get style for + // name: String? + // the style property to get + // example: + // Passing only an ID or node returns the computed style object of + // the node: + // | dojo.getStyle("thinger"); + // example: + // Passing a node and a style property returns the current + // normalized, computed value for that property: + // | dojo.getStyle("thinger", "opacity"); // 1 by default + }; + =====*/ + + /*===== + dojo.setStyle = function(node, name, value){ + // summary: + // Sets styles on a node. + // node: DOMNode|String + // id or reference to node to set style for + // name: String|Object + // the style property to set in DOM-accessor format + // ("borderWidth", not "border-width") or an object with key/value + // pairs suitable for setting each property. + // value: String? + // If passed, sets value on the node for style, handling + // cross-browser concerns. When setting a pixel value, + // be sure to include "px" in the value. For instance, top: "200px". + // Otherwise, in some cases, some browsers will not apply the style. + // + // example: + // Passing a node, a style property, and a value changes the + // current display of the node and returns the new computed value + // | dojo.setStyle("thinger", "opacity", 0.5); // == 0.5 + // + // example: + // Passing a node, an object-style style property sets each of the values in turn and returns the computed style object of the node: + // | dojo.setStyle("thinger", { + // | "opacity": 0.5, + // | "border": "3px solid black", + // | "height": "300px" + // | }); + // + // example: + // When the CSS style property is hyphenated, the JavaScript property is camelCased. + // font-size becomes fontSize, and so on. + // | dojo.setStyle("thinger",{ + // | fontSize:"14pt", + // | letterSpacing:"1.2em" + // | }); + // + // example: + // dojo.NodeList implements .style() using the same syntax, omitting the "node" parameter, calling + // dojo.style() on every element of the list. See: `dojo.query()` and `dojo.NodeList()` + // | dojo.query(".someClassName").style("visibility","hidden"); + // | // or + // | dojo.query("#baz > div").style({ + // | opacity:0.75, + // | fontSize:"13pt" + // | }); + }; + =====*/ + + // Although we normally eschew argument validation at this + // level, here we test argument 'node' for (duck)type, + // by testing nodeType, ecause 'document' is the 'parentNode' of 'body' + // it is frequently sent to this function even + // though it is not Element. + var getComputedStyle, style = {}; + if(has("webkit")){ + getComputedStyle = function(/*DomNode*/node){ + var s; + if(node.nodeType == 1){ + var dv = node.ownerDocument.defaultView; + s = dv.getComputedStyle(node, null); + if(!s && node.style){ + node.style.display = ""; + s = dv.getComputedStyle(node, null); + } + } + return s || {}; + }; + }else if(has("ie") && (has("ie") < 9 || has("quirks"))){ + getComputedStyle = function(node){ + // IE (as of 7) doesn't expose Element like sane browsers + return node.nodeType == 1 /* ELEMENT_NODE*/ ? node.currentStyle : {}; + }; + }else{ + getComputedStyle = function(node){ + return node.nodeType == 1 ? + node.ownerDocument.defaultView.getComputedStyle(node, null) : {}; + }; + } + style.getComputedStyle = getComputedStyle; + + var toPixel; + if(!has("ie")){ + toPixel = function(element, value){ + // style values can be floats, client code may want + // to round for integer pixels. + return parseFloat(value) || 0; + }; + }else{ + toPixel = function(element, avalue){ + if(!avalue){ return 0; } + // on IE7, medium is usually 4 pixels + if(avalue == "medium"){ return 4; } + // style values can be floats, client code may + // want to round this value for integer pixels. + if(avalue.slice && avalue.slice(-2) == 'px'){ return parseFloat(avalue); } + var s = element.style, rs = element.runtimeStyle, cs = element.currentStyle, + sLeft = s.left, rsLeft = rs.left; + rs.left = cs.left; + try{ + // 'avalue' may be incompatible with style.left, which can cause IE to throw + // this has been observed for border widths using "thin", "medium", "thick" constants + // those particular constants could be trapped by a lookup + // but perhaps there are more + s.left = avalue; + avalue = s.pixelLeft; + }catch(e){ + avalue = 0; + } + s.left = sLeft; + rs.left = rsLeft; + return avalue; + } + } + style.toPixelValue = toPixel; + + // FIXME: there opacity quirks on FF that we haven't ported over. Hrm. + + var astr = "DXImageTransform.Microsoft.Alpha"; + var af = function(n, f){ + try{ + return n.filters.item(astr); + }catch(e){ + return f ? {} : null; + } + }; + + var _getOpacity = + has("ie") < 9 || (has("ie") && has("quirks")) ? function(node){ + try{ + return af(node).Opacity / 100; // Number + }catch(e){ + return 1; // Number + } + } : + function(node){ + return getComputedStyle(node).opacity; + }; + + var _setOpacity = + has("ie") < 9 || (has("ie") && has("quirks")) ? function(/*DomNode*/node, /*Number*/opacity){ + var ov = opacity * 100, opaque = opacity == 1; + node.style.zoom = opaque ? "" : 1; + + if(!af(node)){ + if(opaque){ + return opacity; + } + node.style.filter += " progid:" + astr + "(Opacity=" + ov + ")"; + }else{ + af(node, 1).Opacity = ov; + } + + // on IE7 Alpha(Filter opacity=100) makes text look fuzzy so disable it altogether (bug #2661), + //but still update the opacity value so we can get a correct reading if it is read later. + af(node, 1).Enabled = !opaque; + + if(node.tagName.toLowerCase() == "tr"){ + for(var td = node.firstChild; td; td = td.nextSibling){ + if(td.tagName.toLowerCase() == "td"){ + _setOpacity(td, opacity); + } + } + } + return opacity; + } : + function(node, opacity){ + return node.style.opacity = opacity; + }; + + var _pixelNamesCache = { + left: true, top: true + }; + var _pixelRegExp = /margin|padding|width|height|max|min|offset/; // |border + function _toStyleValue(node, type, value){ + //TODO: should we really be doing string case conversion here? Should we cache it? Need to profile! + type = type.toLowerCase(); + if(has("ie")){ + if(value == "auto"){ + if(type == "height"){ return node.offsetHeight; } + if(type == "width"){ return node.offsetWidth; } + } + if(type == "fontweight"){ + switch(value){ + case 700: return "bold"; + case 400: + default: return "normal"; + } + } + } + if(!(type in _pixelNamesCache)){ + _pixelNamesCache[type] = _pixelRegExp.test(type); + } + return _pixelNamesCache[type] ? toPixel(node, value) : value; + } + + var _floatStyle = has("ie") ? "styleFloat" : "cssFloat", + _floatAliases = {"cssFloat": _floatStyle, "styleFloat": _floatStyle, "float": _floatStyle}; + + // public API + + style.get = function getStyle(/*DOMNode|String*/ node, /*String?*/ name){ + var n = dom.byId(node), l = arguments.length, op = (name == "opacity"); + if(l == 2 && op){ + return _getOpacity(n); + } + name = _floatAliases[name] || name; + var s = style.getComputedStyle(n); + return (l == 1) ? s : _toStyleValue(n, name, s[name] || n.style[name]); /* CSS2Properties||String||Number */ + }; + + style.set = function setStyle(/*DOMNode|String*/ node, /*String|Object*/ name, /*String?*/ value){ + var n = dom.byId(node), l = arguments.length, op = (name == "opacity"); + name = _floatAliases[name] || name; + if(l == 3){ + return op ? _setOpacity(n, value) : n.style[name] = value; // Number + } + for(var x in name){ + style.set(node, x, name[x]); + } + return style.getComputedStyle(n); + }; + + return style; +}); diff --git a/lib/dojo/dom.js b/lib/dojo/dom.js new file mode 100644 index 00000000..7a2bd6bd --- /dev/null +++ b/lib/dojo/dom.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/dom",["./_base/sniff","./_base/lang","./_base/window"],function(_1,_2,_3){try{document.execCommand("BackgroundImageCache",false,true);}catch(e){}var _4={};if(_1("ie")){_4.byId=function(id,_5){if(typeof id!="string"){return id;}var _6=_5||_3.doc,te=id&&_6.getElementById(id);if(te&&(te.attributes.id.value==id||te.id==id)){return te;}else{var _7=_6.all[id];if(!_7||_7.nodeName){_7=[_7];}var i=0;while((te=_7[i++])){if((te.attributes&&te.attributes.id&&te.attributes.id.value==id)||te.id==id){return te;}}}};}else{_4.byId=function(id,_8){return ((typeof id=="string")?(_8||_3.doc).getElementById(id):id)||null;};}_4.isDescendant=function(_9,_a){try{_9=_4.byId(_9);_a=_4.byId(_a);while(_9){if(_9==_a){return true;}_9=_9.parentNode;}}catch(e){}return false;};_4.setSelectable=function(_b,_c){_b=_4.byId(_b);if(_1("mozilla")){_b.style.MozUserSelect=_c?"":"none";}else{if(_1("khtml")||_1("webkit")){_b.style.KhtmlUserSelect=_c?"auto":"none";}else{if(_1("ie")){var v=(_b.unselectable=_c?"":"on"),cs=_b.getElementsByTagName("*"),i=0,l=cs.length;for(;i= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/domReady",["./has"],function(_1){var _2=this,_3=document,_4={"loaded":1,"complete":1},_5=typeof _3.readyState!="string",_6=!!_4[_3.readyState];if(_5){_3.readyState="loading";}if(!_6){var _7=[],_8=[],_9=function(_a){_a=_a||_2.event;if(_6||(_a.type=="readystatechange"&&!_4[_3.readyState])){return;}_6=1;if(_5){_3.readyState="complete";}while(_7.length){(_7.shift())();}},on=function(_b,_c){_b.addEventListener(_c,_9,false);_7.push(function(){_b.removeEventListener(_c,_9,false);});};if(!_1("dom-addeventlistener")){on=function(_d,_e){_e="on"+_e;_d.attachEvent(_e,_9);_7.push(function(){_d.detachEvent(_e,_9);});};var _f=_3.createElement("div");try{if(_f.doScroll&&_2.frameElement===null){_8.push(function(){try{_f.doScroll("left");return 1;}catch(e){}});}}catch(e){}}on(_3,"DOMContentLoaded");on(_2,"load");if("onreadystatechange" in _3){on(_3,"readystatechange");}else{if(!_5){_8.push(function(){return _4[_3.readyState];});}}if(_8.length){var _10=function(){if(_6){return;}var i=_8.length;while(i--){if(_8[i]()){_9("poller");return;}}setTimeout(_10,30);};_10();}}function _11(_12){if(_6){_12(1);}else{_7.push(_12);}};_11.load=function(id,req,_13){_11(_13);};return _11;}); \ No newline at end of file diff --git a/lib/dojo/domReady.js.uncompressed.js b/lib/dojo/domReady.js.uncompressed.js new file mode 100644 index 00000000..bc0ea8b3 --- /dev/null +++ b/lib/dojo/domReady.js.uncompressed.js @@ -0,0 +1,95 @@ +define("dojo/domReady", ['./has'], function(has){ + var global = this, + doc = document, + readyStates = { 'loaded': 1, 'complete': 1 }, + fixReadyState = typeof doc.readyState != "string", + ready = !!readyStates[doc.readyState]; + + // For FF <= 3.5 + if(fixReadyState){ doc.readyState = "loading"; } + + if(!ready){ + var readyQ = [], tests = [], + detectReady = function(evt){ + evt = evt || global.event; + if(ready || (evt.type == "readystatechange" && !readyStates[doc.readyState])){ return; } + ready = 1; + + // For FF <= 3.5 + if(fixReadyState){ doc.readyState = "complete"; } + + while(readyQ.length){ + (readyQ.shift())(); + } + }, + on = function(node, event){ + node.addEventListener(event, detectReady, false); + readyQ.push(function(){ node.removeEventListener(event, detectReady, false); }); + }; + + if(!has("dom-addeventlistener")){ + on = function(node, event){ + event = "on" + event; + node.attachEvent(event, detectReady); + readyQ.push(function(){ node.detachEvent(event, detectReady); }); + }; + + var div = doc.createElement("div"); + try{ + if(div.doScroll && global.frameElement === null){ + // the doScroll test is only useful if we're in the top-most frame + tests.push(function(){ + // Derived with permission from Diego Perini's IEContentLoaded + // http://javascript.nwbox.com/IEContentLoaded/ + try{ + div.doScroll("left"); + return 1; + }catch(e){} + }); + } + }catch(e){} + } + + on(doc, "DOMContentLoaded"); + on(global, "load"); + + if("onreadystatechange" in doc){ + on(doc, "readystatechange"); + }else if(!fixReadyState){ + // if the ready state property exists and there's + // no readystatechange event, poll for the state + // to change + tests.push(function(){ + return readyStates[doc.readyState]; + }); + } + + if(tests.length){ + var poller = function(){ + if(ready){ return; } + var i = tests.length; + while(i--){ + if(tests[i]()){ + detectReady("poller"); + return; + } + } + setTimeout(poller, 30); + }; + poller(); + } + } + + function domReady(callback){ + if(ready){ + callback(1); + }else{ + readyQ.push(callback); + } + } + domReady.load = function(id, req, load){ + domReady(load); + }; + + return domReady; +}); diff --git a/lib/dojo/fx.js b/lib/dojo/fx.js index 60782acc..53c611e2 100644 --- a/lib/dojo/fx.js +++ b/lib/dojo/fx.js @@ -4,403 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.fx"] = true; -dojo.provide("dojo.fx"); -dojo.require("dojo.fx.Toggler"); - - -/*===== -dojo.fx = { - // summary: Effects library on top of Base animations -}; -=====*/ -(function(){ - - var d = dojo, - _baseObj = { - _fire: function(evt, args){ - if(this[evt]){ - this[evt].apply(this, args||[]); - } - return this; - } - }; - - var _chain = function(animations){ - this._index = -1; - this._animations = animations||[]; - this._current = this._onAnimateCtx = this._onEndCtx = null; - - this.duration = 0; - d.forEach(this._animations, function(a){ - this.duration += a.duration; - if(a.delay){ this.duration += a.delay; } - }, this); - }; - d.extend(_chain, { - _onAnimate: function(){ - this._fire("onAnimate", arguments); - }, - _onEnd: function(){ - d.disconnect(this._onAnimateCtx); - d.disconnect(this._onEndCtx); - this._onAnimateCtx = this._onEndCtx = null; - if(this._index + 1 == this._animations.length){ - this._fire("onEnd"); - }else{ - // switch animations - this._current = this._animations[++this._index]; - this._onAnimateCtx = d.connect(this._current, "onAnimate", this, "_onAnimate"); - this._onEndCtx = d.connect(this._current, "onEnd", this, "_onEnd"); - this._current.play(0, true); - } - }, - play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){ - if(!this._current){ this._current = this._animations[this._index = 0]; } - if(!gotoStart && this._current.status() == "playing"){ return this; } - var beforeBegin = d.connect(this._current, "beforeBegin", this, function(){ - this._fire("beforeBegin"); - }), - onBegin = d.connect(this._current, "onBegin", this, function(arg){ - this._fire("onBegin", arguments); - }), - onPlay = d.connect(this._current, "onPlay", this, function(arg){ - this._fire("onPlay", arguments); - d.disconnect(beforeBegin); - d.disconnect(onBegin); - d.disconnect(onPlay); - }); - if(this._onAnimateCtx){ - d.disconnect(this._onAnimateCtx); - } - this._onAnimateCtx = d.connect(this._current, "onAnimate", this, "_onAnimate"); - if(this._onEndCtx){ - d.disconnect(this._onEndCtx); - } - this._onEndCtx = d.connect(this._current, "onEnd", this, "_onEnd"); - this._current.play.apply(this._current, arguments); - return this; - }, - pause: function(){ - if(this._current){ - var e = d.connect(this._current, "onPause", this, function(arg){ - this._fire("onPause", arguments); - d.disconnect(e); - }); - this._current.pause(); - } - return this; - }, - gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){ - this.pause(); - var offset = this.duration * percent; - this._current = null; - d.some(this._animations, function(a){ - if(a.duration <= offset){ - this._current = a; - return true; - } - offset -= a.duration; - return false; - }); - if(this._current){ - this._current.gotoPercent(offset / this._current.duration, andPlay); - } - return this; - }, - stop: function(/*boolean?*/ gotoEnd){ - if(this._current){ - if(gotoEnd){ - for(; this._index + 1 < this._animations.length; ++this._index){ - this._animations[this._index].stop(true); - } - this._current = this._animations[this._index]; - } - var e = d.connect(this._current, "onStop", this, function(arg){ - this._fire("onStop", arguments); - d.disconnect(e); - }); - this._current.stop(); - } - return this; - }, - status: function(){ - return this._current ? this._current.status() : "stopped"; - }, - destroy: function(){ - if(this._onAnimateCtx){ d.disconnect(this._onAnimateCtx); } - if(this._onEndCtx){ d.disconnect(this._onEndCtx); } - } - }); - d.extend(_chain, _baseObj); - - dojo.fx.chain = function(/*dojo.Animation[]*/ animations){ - // summary: - // Chain a list of `dojo.Animation`s to run in sequence - // - // description: - // Return a `dojo.Animation` which will play all passed - // `dojo.Animation` instances in sequence, firing its own - // synthesized events simulating a single animation. (eg: - // onEnd of this animation means the end of the chain, - // not the individual animations within) - // - // example: - // Once `node` is faded out, fade in `otherNode` - // | dojo.fx.chain([ - // | dojo.fadeIn({ node:node }), - // | dojo.fadeOut({ node:otherNode }) - // | ]).play(); - // - return new _chain(animations) // dojo.Animation - }; - - var _combine = function(animations){ - this._animations = animations||[]; - this._connects = []; - this._finished = 0; - - this.duration = 0; - d.forEach(animations, function(a){ - var duration = a.duration; - if(a.delay){ duration += a.delay; } - if(this.duration < duration){ this.duration = duration; } - this._connects.push(d.connect(a, "onEnd", this, "_onEnd")); - }, this); - - this._pseudoAnimation = new d.Animation({curve: [0, 1], duration: this.duration}); - var self = this; - d.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop", "onEnd"], - function(evt){ - self._connects.push(d.connect(self._pseudoAnimation, evt, - function(){ self._fire(evt, arguments); } - )); - } - ); - }; - d.extend(_combine, { - _doAction: function(action, args){ - d.forEach(this._animations, function(a){ - a[action].apply(a, args); - }); - return this; - }, - _onEnd: function(){ - if(++this._finished > this._animations.length){ - this._fire("onEnd"); - } - }, - _call: function(action, args){ - var t = this._pseudoAnimation; - t[action].apply(t, args); - }, - play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){ - this._finished = 0; - this._doAction("play", arguments); - this._call("play", arguments); - return this; - }, - pause: function(){ - this._doAction("pause", arguments); - this._call("pause", arguments); - return this; - }, - gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){ - var ms = this.duration * percent; - d.forEach(this._animations, function(a){ - a.gotoPercent(a.duration < ms ? 1 : (ms / a.duration), andPlay); - }); - this._call("gotoPercent", arguments); - return this; - }, - stop: function(/*boolean?*/ gotoEnd){ - this._doAction("stop", arguments); - this._call("stop", arguments); - return this; - }, - status: function(){ - return this._pseudoAnimation.status(); - }, - destroy: function(){ - d.forEach(this._connects, dojo.disconnect); - } - }); - d.extend(_combine, _baseObj); - - dojo.fx.combine = function(/*dojo.Animation[]*/ animations){ - // summary: - // Combine a list of `dojo.Animation`s to run in parallel - // - // description: - // Combine an array of `dojo.Animation`s to run in parallel, - // providing a new `dojo.Animation` instance encompasing each - // animation, firing standard animation events. - // - // example: - // Fade out `node` while fading in `otherNode` simultaneously - // | dojo.fx.combine([ - // | dojo.fadeIn({ node:node }), - // | dojo.fadeOut({ node:otherNode }) - // | ]).play(); - // - // example: - // When the longest animation ends, execute a function: - // | var anim = dojo.fx.combine([ - // | dojo.fadeIn({ node: n, duration:700 }), - // | dojo.fadeOut({ node: otherNode, duration: 300 }) - // | ]); - // | dojo.connect(anim, "onEnd", function(){ - // | // overall animation is done. - // | }); - // | anim.play(); // play the animation - // - return new _combine(animations); // dojo.Animation - }; - - dojo.fx.wipeIn = function(/*Object*/ args){ - // summary: - // Expand a node to it's natural height. - // - // description: - // Returns an animation that will expand the - // node defined in 'args' object from it's current height to - // it's natural height (with no scrollbar). - // Node must have no margin/border/padding. - // - // args: Object - // A hash-map of standard `dojo.Animation` constructor properties - // (such as easing: node: duration: and so on) - // - // example: - // | dojo.fx.wipeIn({ - // | node:"someId" - // | }).play() - var node = args.node = d.byId(args.node), s = node.style, o; - - var anim = d.animateProperty(d.mixin({ - properties: { - height: { - // wrapped in functions so we wait till the last second to query (in case value has changed) - start: function(){ - // start at current [computed] height, but use 1px rather than 0 - // because 0 causes IE to display the whole panel - o = s.overflow; - s.overflow = "hidden"; - if(s.visibility == "hidden" || s.display == "none"){ - s.height = "1px"; - s.display = ""; - s.visibility = ""; - return 1; - }else{ - var height = d.style(node, "height"); - return Math.max(height, 1); - } - }, - end: function(){ - return node.scrollHeight; - } - } - } - }, args)); - - d.connect(anim, "onEnd", function(){ - s.height = "auto"; - s.overflow = o; - }); - - return anim; // dojo.Animation - }; - - dojo.fx.wipeOut = function(/*Object*/ args){ - // summary: - // Shrink a node to nothing and hide it. - // - // description: - // Returns an animation that will shrink node defined in "args" - // from it's current height to 1px, and then hide it. - // - // args: Object - // A hash-map of standard `dojo.Animation` constructor properties - // (such as easing: node: duration: and so on) - // - // example: - // | dojo.fx.wipeOut({ node:"someId" }).play() - - var node = args.node = d.byId(args.node), s = node.style, o; - - var anim = d.animateProperty(d.mixin({ - properties: { - height: { - end: 1 // 0 causes IE to display the whole panel - } - } - }, args)); - - d.connect(anim, "beforeBegin", function(){ - o = s.overflow; - s.overflow = "hidden"; - s.display = ""; - }); - d.connect(anim, "onEnd", function(){ - s.overflow = o; - s.height = "auto"; - s.display = "none"; - }); - - return anim; // dojo.Animation - }; - - dojo.fx.slideTo = function(/*Object*/ args){ - // summary: - // Slide a node to a new top/left position - // - // description: - // Returns an animation that will slide "node" - // defined in args Object from its current position to - // the position defined by (args.left, args.top). - // - // args: Object - // A hash-map of standard `dojo.Animation` constructor properties - // (such as easing: node: duration: and so on). Special args members - // are `top` and `left`, which indicate the new position to slide to. - // - // example: - // | dojo.fx.slideTo({ node: node, left:"40", top:"50", units:"px" }).play() - - var node = args.node = d.byId(args.node), - top = null, left = null; - - var init = (function(n){ - return function(){ - var cs = d.getComputedStyle(n); - var pos = cs.position; - top = (pos == 'absolute' ? n.offsetTop : parseInt(cs.top) || 0); - left = (pos == 'absolute' ? n.offsetLeft : parseInt(cs.left) || 0); - if(pos != 'absolute' && pos != 'relative'){ - var ret = d.position(n, true); - top = ret.y; - left = ret.x; - n.style.position="absolute"; - n.style.top=top+"px"; - n.style.left=left+"px"; - } - }; - })(node); - init(); - - var anim = d.animateProperty(d.mixin({ - properties: { - top: args.top || 0, - left: args.left || 0 - } - }, args)); - d.connect(anim, "beforeBegin", anim, init); - - return anim; // dojo.Animation - }; - -})(); - -} +//>>built +define("dojo/fx",["./_base/lang","./Evented","./_base/kernel","./_base/array","./_base/connect","./_base/fx","./dom","./dom-style","./dom-geometry","./ready","require"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b){if(!_3.isAsync){_a(0,function(){var _c=["./fx/Toggler"];_b(_c);});}var _d=_3.fx={};var _e={_fire:function(_f,_10){if(this[_f]){this[_f].apply(this,_10||[]);}return this;}};var _11=function(_12){this._index=-1;this._animations=_12||[];this._current=this._onAnimateCtx=this._onEndCtx=null;this.duration=0;_4.forEach(this._animations,function(a){this.duration+=a.duration;if(a.delay){this.duration+=a.delay;}},this);};_11.prototype=new _2();_1.extend(_11,{_onAnimate:function(){this._fire("onAnimate",arguments);},_onEnd:function(){_5.disconnect(this._onAnimateCtx);_5.disconnect(this._onEndCtx);this._onAnimateCtx=this._onEndCtx=null;if(this._index+1==this._animations.length){this._fire("onEnd");}else{this._current=this._animations[++this._index];this._onAnimateCtx=_5.connect(this._current,"onAnimate",this,"_onAnimate");this._onEndCtx=_5.connect(this._current,"onEnd",this,"_onEnd");this._current.play(0,true);}},play:function(_13,_14){if(!this._current){this._current=this._animations[this._index=0];}if(!_14&&this._current.status()=="playing"){return this;}var _15=_5.connect(this._current,"beforeBegin",this,function(){this._fire("beforeBegin");}),_16=_5.connect(this._current,"onBegin",this,function(arg){this._fire("onBegin",arguments);}),_17=_5.connect(this._current,"onPlay",this,function(arg){this._fire("onPlay",arguments);_5.disconnect(_15);_5.disconnect(_16);_5.disconnect(_17);});if(this._onAnimateCtx){_5.disconnect(this._onAnimateCtx);}this._onAnimateCtx=_5.connect(this._current,"onAnimate",this,"_onAnimate");if(this._onEndCtx){_5.disconnect(this._onEndCtx);}this._onEndCtx=_5.connect(this._current,"onEnd",this,"_onEnd");this._current.play.apply(this._current,arguments);return this;},pause:function(){if(this._current){var e=_5.connect(this._current,"onPause",this,function(arg){this._fire("onPause",arguments);_5.disconnect(e);});this._current.pause();}return this;},gotoPercent:function(_18,_19){this.pause();var _1a=this.duration*_18;this._current=null;_4.some(this._animations,function(a){if(a.duration<=_1a){this._current=a;return true;}_1a-=a.duration;return false;});if(this._current){this._current.gotoPercent(_1a/this._current.duration,_19);}return this;},stop:function(_1b){if(this._current){if(_1b){for(;this._index+1this._animations.length){this._fire("onEnd");}},_call:function(_23,_24){var t=this._pseudoAnimation;t[_23].apply(t,_24);},play:function(_25,_26){this._finished=0;this._doAction("play",arguments);this._call("play",arguments);return this;},pause:function(){this._doAction("pause",arguments);this._call("pause",arguments);return this;},gotoPercent:function(_27,_28){var ms=this.duration*_27;_4.forEach(this._animations,function(a){a.gotoPercent(a.duration this._animations.length){ + this._fire("onEnd"); + } + }, + _call: function(action, args){ + var t = this._pseudoAnimation; + t[action].apply(t, args); + }, + play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){ + this._finished = 0; + this._doAction("play", arguments); + this._call("play", arguments); + return this; + }, + pause: function(){ + this._doAction("pause", arguments); + this._call("pause", arguments); + return this; + }, + gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){ + var ms = this.duration * percent; + arrayUtil.forEach(this._animations, function(a){ + a.gotoPercent(a.duration < ms ? 1 : (ms / a.duration), andPlay); + }); + this._call("gotoPercent", arguments); + return this; + }, + stop: function(/*boolean?*/ gotoEnd){ + this._doAction("stop", arguments); + this._call("stop", arguments); + return this; + }, + status: function(){ + return this._pseudoAnimation.status(); + }, + destroy: function(){ + arrayUtil.forEach(this._connects, connect.disconnect); + } + }); + lang.extend(_combine, _baseObj); + + coreFx.combine = /*===== dojo.fx.combine = =====*/ function(/*dojo.Animation[]*/ animations){ + // summary: + // Combine a list of `dojo.Animation`s to run in parallel + // + // description: + // Combine an array of `dojo.Animation`s to run in parallel, + // providing a new `dojo.Animation` instance encompasing each + // animation, firing standard animation events. + // + // example: + // Fade out `node` while fading in `otherNode` simultaneously + // | dojo.fx.combine([ + // | dojo.fadeIn({ node:node }), + // | dojo.fadeOut({ node:otherNode }) + // | ]).play(); + // + // example: + // When the longest animation ends, execute a function: + // | var anim = dojo.fx.combine([ + // | dojo.fadeIn({ node: n, duration:700 }), + // | dojo.fadeOut({ node: otherNode, duration: 300 }) + // | ]); + // | dojo.connect(anim, "onEnd", function(){ + // | // overall animation is done. + // | }); + // | anim.play(); // play the animation + // + return new _combine(animations); // dojo.Animation + }; + + coreFx.wipeIn = /*===== dojo.fx.wipeIn = =====*/ function(/*Object*/ args){ + // summary: + // Expand a node to it's natural height. + // + // description: + // Returns an animation that will expand the + // node defined in 'args' object from it's current height to + // it's natural height (with no scrollbar). + // Node must have no margin/border/padding. + // + // args: Object + // A hash-map of standard `dojo.Animation` constructor properties + // (such as easing: node: duration: and so on) + // + // example: + // | dojo.fx.wipeIn({ + // | node:"someId" + // | }).play() + var node = args.node = dom.byId(args.node), s = node.style, o; + + var anim = baseFx.animateProperty(lang.mixin({ + properties: { + height: { + // wrapped in functions so we wait till the last second to query (in case value has changed) + start: function(){ + // start at current [computed] height, but use 1px rather than 0 + // because 0 causes IE to display the whole panel + o = s.overflow; + s.overflow = "hidden"; + if(s.visibility == "hidden" || s.display == "none"){ + s.height = "1px"; + s.display = ""; + s.visibility = ""; + return 1; + }else{ + var height = domStyle.get(node, "height"); + return Math.max(height, 1); + } + }, + end: function(){ + return node.scrollHeight; + } + } + } + }, args)); + + var fini = function(){ + s.height = "auto"; + s.overflow = o; + }; + connect.connect(anim, "onStop", fini); + connect.connect(anim, "onEnd", fini); + + return anim; // dojo.Animation + }; + + coreFx.wipeOut = /*===== dojo.fx.wipeOut = =====*/ function(/*Object*/ args){ + // summary: + // Shrink a node to nothing and hide it. + // + // description: + // Returns an animation that will shrink node defined in "args" + // from it's current height to 1px, and then hide it. + // + // args: Object + // A hash-map of standard `dojo.Animation` constructor properties + // (such as easing: node: duration: and so on) + // + // example: + // | dojo.fx.wipeOut({ node:"someId" }).play() + + var node = args.node = dom.byId(args.node), s = node.style, o; + + var anim = baseFx.animateProperty(lang.mixin({ + properties: { + height: { + end: 1 // 0 causes IE to display the whole panel + } + } + }, args)); + + connect.connect(anim, "beforeBegin", function(){ + o = s.overflow; + s.overflow = "hidden"; + s.display = ""; + }); + var fini = function(){ + s.overflow = o; + s.height = "auto"; + s.display = "none"; + }; + connect.connect(anim, "onStop", fini); + connect.connect(anim, "onEnd", fini); + + return anim; // dojo.Animation + }; + + coreFx.slideTo = /*===== dojo.fx.slideTo = =====*/ function(/*Object*/ args){ + // summary: + // Slide a node to a new top/left position + // + // description: + // Returns an animation that will slide "node" + // defined in args Object from its current position to + // the position defined by (args.left, args.top). + // + // args: Object + // A hash-map of standard `dojo.Animation` constructor properties + // (such as easing: node: duration: and so on). Special args members + // are `top` and `left`, which indicate the new position to slide to. + // + // example: + // | .slideTo({ node: node, left:"40", top:"50", units:"px" }).play() + + var node = args.node = dom.byId(args.node), + top = null, left = null; + + var init = (function(n){ + return function(){ + var cs = domStyle.getComputedStyle(n); + var pos = cs.position; + top = (pos == 'absolute' ? n.offsetTop : parseInt(cs.top) || 0); + left = (pos == 'absolute' ? n.offsetLeft : parseInt(cs.left) || 0); + if(pos != 'absolute' && pos != 'relative'){ + var ret = geom.position(n, true); + top = ret.y; + left = ret.x; + n.style.position="absolute"; + n.style.top=top+"px"; + n.style.left=left+"px"; + } + }; + })(node); + init(); + + var anim = baseFx.animateProperty(lang.mixin({ + properties: { + top: args.top || 0, + left: args.left || 0 + } + }, args)); + connect.connect(anim, "beforeBegin", anim, init); + + return anim; // dojo.Animation + }; + + return coreFx; +}); diff --git a/lib/dojo/fx/Toggler.js b/lib/dojo/fx/Toggler.js index dc4693d8..265586c3 100644 --- a/lib/dojo/fx/Toggler.js +++ b/lib/dojo/fx/Toggler.js @@ -4,105 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.fx.Toggler"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.fx.Toggler"] = true; -dojo.provide("dojo.fx.Toggler"); - - -dojo.declare("dojo.fx.Toggler", null, { - // summary: - // A simple `dojo.Animation` toggler API. - // - // description: - // class constructor for an animation toggler. It accepts a packed - // set of arguments about what type of animation to use in each - // direction, duration, etc. All available members are mixed into - // these animations from the constructor (for example, `node`, - // `showDuration`, `hideDuration`). - // - // example: - // | var t = new dojo.fx.Toggler({ - // | node: "nodeId", - // | showDuration: 500, - // | // hideDuration will default to "200" - // | showFunc: dojo.fx.wipeIn, - // | // hideFunc will default to "fadeOut" - // | }); - // | t.show(100); // delay showing for 100ms - // | // ...time passes... - // | t.hide(); - - // node: DomNode - // the node to target for the showing and hiding animations - node: null, - - // showFunc: Function - // The function that returns the `dojo.Animation` to show the node - showFunc: dojo.fadeIn, - - // hideFunc: Function - // The function that returns the `dojo.Animation` to hide the node - hideFunc: dojo.fadeOut, - - // showDuration: - // Time in milliseconds to run the show Animation - showDuration: 200, - - // hideDuration: - // Time in milliseconds to run the hide Animation - hideDuration: 200, - - // FIXME: need a policy for where the toggler should "be" the next - // time show/hide are called if we're stopped somewhere in the - // middle. - // FIXME: also would be nice to specify individual showArgs/hideArgs mixed into - // each animation individually. - // FIXME: also would be nice to have events from the animations exposed/bridged - - /*===== - _showArgs: null, - _showAnim: null, - - _hideArgs: null, - _hideAnim: null, - - _isShowing: false, - _isHiding: false, - =====*/ - - constructor: function(args){ - var _t = this; - - dojo.mixin(_t, args); - _t.node = args.node; - _t._showArgs = dojo.mixin({}, args); - _t._showArgs.node = _t.node; - _t._showArgs.duration = _t.showDuration; - _t.showAnim = _t.showFunc(_t._showArgs); - - _t._hideArgs = dojo.mixin({}, args); - _t._hideArgs.node = _t.node; - _t._hideArgs.duration = _t.hideDuration; - _t.hideAnim = _t.hideFunc(_t._hideArgs); - - dojo.connect(_t.showAnim, "beforeBegin", dojo.hitch(_t.hideAnim, "stop", true)); - dojo.connect(_t.hideAnim, "beforeBegin", dojo.hitch(_t.showAnim, "stop", true)); - }, - - show: function(delay){ - // summary: Toggle the node to showing - // delay: Integer? - // Ammount of time to stall playing the show animation - return this.showAnim.play(delay || 0); - }, - - hide: function(delay){ - // summary: Toggle the node to hidden - // delay: Integer? - // Ammount of time to stall playing the hide animation - return this.hideAnim.play(delay || 0); - } -}); - -} +//>>built +define("dojo/fx/Toggler",["../_base/lang","../_base/declare","../_base/fx","../_base/connect"],function(_1,_2,_3,_4){return _2("dojo.fx.Toggler",null,{node:null,showFunc:_3.fadeIn,hideFunc:_3.fadeOut,showDuration:200,hideDuration:200,constructor:function(_5){var _6=this;_1.mixin(_6,_5);_6.node=_5.node;_6._showArgs=_1.mixin({},_5);_6._showArgs.node=_6.node;_6._showArgs.duration=_6.showDuration;_6.showAnim=_6.showFunc(_6._showArgs);_6._hideArgs=_1.mixin({},_5);_6._hideArgs.node=_6.node;_6._hideArgs.duration=_6.hideDuration;_6.hideAnim=_6.hideFunc(_6._hideArgs);_4.connect(_6.showAnim,"beforeBegin",_1.hitch(_6.hideAnim,"stop",true));_4.connect(_6.hideAnim,"beforeBegin",_1.hitch(_6.showAnim,"stop",true));},show:function(_7){return this.showAnim.play(_7||0);},hide:function(_8){return this.hideAnim.play(_8||0);}});}); \ No newline at end of file diff --git a/lib/dojo/fx/Toggler.js.uncompressed.js b/lib/dojo/fx/Toggler.js.uncompressed.js new file mode 100644 index 00000000..3e4891af --- /dev/null +++ b/lib/dojo/fx/Toggler.js.uncompressed.js @@ -0,0 +1,103 @@ +define("dojo/fx/Toggler", ["../_base/lang","../_base/declare","../_base/fx", "../_base/connect"], + function(lang, declare, baseFx, connectUtil) { + // module: + // dojo/fx/Toggler + // summary: + // TODOC + +return declare("dojo.fx.Toggler", null, { + // summary: + // A simple `dojo.Animation` toggler API. + // + // description: + // class constructor for an animation toggler. It accepts a packed + // set of arguments about what type of animation to use in each + // direction, duration, etc. All available members are mixed into + // these animations from the constructor (for example, `node`, + // `showDuration`, `hideDuration`). + // + // example: + // | var t = new dojo.fx.Toggler({ + // | node: "nodeId", + // | showDuration: 500, + // | // hideDuration will default to "200" + // | showFunc: dojo.fx.wipeIn, + // | // hideFunc will default to "fadeOut" + // | }); + // | t.show(100); // delay showing for 100ms + // | // ...time passes... + // | t.hide(); + + // node: DomNode + // the node to target for the showing and hiding animations + node: null, + + // showFunc: Function + // The function that returns the `dojo.Animation` to show the node + showFunc: baseFx.fadeIn, + + // hideFunc: Function + // The function that returns the `dojo.Animation` to hide the node + hideFunc: baseFx.fadeOut, + + // showDuration: + // Time in milliseconds to run the show Animation + showDuration: 200, + + // hideDuration: + // Time in milliseconds to run the hide Animation + hideDuration: 200, + + // FIXME: need a policy for where the toggler should "be" the next + // time show/hide are called if we're stopped somewhere in the + // middle. + // FIXME: also would be nice to specify individual showArgs/hideArgs mixed into + // each animation individually. + // FIXME: also would be nice to have events from the animations exposed/bridged + + /*===== + _showArgs: null, + _showAnim: null, + + _hideArgs: null, + _hideAnim: null, + + _isShowing: false, + _isHiding: false, + =====*/ + + constructor: function(args){ + var _t = this; + + lang.mixin(_t, args); + _t.node = args.node; + _t._showArgs = lang.mixin({}, args); + _t._showArgs.node = _t.node; + _t._showArgs.duration = _t.showDuration; + _t.showAnim = _t.showFunc(_t._showArgs); + + _t._hideArgs = lang.mixin({}, args); + _t._hideArgs.node = _t.node; + _t._hideArgs.duration = _t.hideDuration; + _t.hideAnim = _t.hideFunc(_t._hideArgs); + + connectUtil.connect(_t.showAnim, "beforeBegin", lang.hitch(_t.hideAnim, "stop", true)); + connectUtil.connect(_t.hideAnim, "beforeBegin", lang.hitch(_t.showAnim, "stop", true)); + }, + + show: function(delay){ + // summary: Toggle the node to showing + // delay: Integer? + // Ammount of time to stall playing the show animation + return this.showAnim.play(delay || 0); + }, + + hide: function(delay){ + // summary: Toggle the node to hidden + // delay: Integer? + // Ammount of time to stall playing the hide animation + return this.hideAnim.play(delay || 0); + } +}); + +}); diff --git a/lib/dojo/fx/easing.js b/lib/dojo/fx/easing.js index c26af897..e9a2fb75 100644 --- a/lib/dojo/fx/easing.js +++ b/lib/dojo/fx/easing.js @@ -4,285 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.fx.easing"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.fx.easing"] = true; -dojo.provide("dojo.fx.easing"); - -dojo.getObject("fx.easing", true, dojo); - -dojo.fx.easing = { - // summary: - // Collection of easing functions to use beyond the default - // `dojo._defaultEasing` function. - // - // description: - // - // Easing functions are used to manipulate the iteration through - // an `dojo.Animation`s _Line. _Line being the properties of an Animation, - // and the easing function progresses through that Line determing - // how quickly (or slowly) it should go. Or more accurately: modify - // the value of the _Line based on the percentage of animation completed. - // - // All functions follow a simple naming convention of "ease type" + "when". - // If the name of the function ends in Out, the easing described appears - // towards the end of the animation. "In" means during the beginning, - // and InOut means both ranges of the Animation will applied, both - // beginning and end. - // - // One does not call the easing function directly, it must be passed to - // the `easing` property of an animation. - // - // example: - // | dojo.require("dojo.fx.easing"); - // | var anim = dojo.fadeOut({ - // | node: 'node', - // | duration: 2000, - // | // note there is no () - // | easing: dojo.fx.easing.quadIn - // | }).play(); - // - - linear: function(/* Decimal? */n){ - // summary: A linear easing function - return n; - }, - - quadIn: function(/* Decimal? */n){ - return Math.pow(n, 2); - }, - - quadOut: function(/* Decimal? */n){ - return n * (n - 2) * -1; - }, - - quadInOut: function(/* Decimal? */n){ - n = n * 2; - if(n < 1){ return Math.pow(n, 2) / 2; } - return -1 * ((--n) * (n - 2) - 1) / 2; - }, - - cubicIn: function(/* Decimal? */n){ - return Math.pow(n, 3); - }, - - cubicOut: function(/* Decimal? */n){ - return Math.pow(n - 1, 3) + 1; - }, - - cubicInOut: function(/* Decimal? */n){ - n = n * 2; - if(n < 1){ return Math.pow(n, 3) / 2; } - n -= 2; - return (Math.pow(n, 3) + 2) / 2; - }, - - quartIn: function(/* Decimal? */n){ - return Math.pow(n, 4); - }, - - quartOut: function(/* Decimal? */n){ - return -1 * (Math.pow(n - 1, 4) - 1); - }, - - quartInOut: function(/* Decimal? */n){ - n = n * 2; - if(n < 1){ return Math.pow(n, 4) / 2; } - n -= 2; - return -1 / 2 * (Math.pow(n, 4) - 2); - }, - - quintIn: function(/* Decimal? */n){ - return Math.pow(n, 5); - }, - - quintOut: function(/* Decimal? */n){ - return Math.pow(n - 1, 5) + 1; - }, - - quintInOut: function(/* Decimal? */n){ - n = n * 2; - if(n < 1){ return Math.pow(n, 5) / 2; }; - n -= 2; - return (Math.pow(n, 5) + 2) / 2; - }, - - sineIn: function(/* Decimal? */n){ - return -1 * Math.cos(n * (Math.PI / 2)) + 1; - }, - - sineOut: function(/* Decimal? */n){ - return Math.sin(n * (Math.PI / 2)); - }, - - sineInOut: function(/* Decimal? */n){ - return -1 * (Math.cos(Math.PI * n) - 1) / 2; - }, - - expoIn: function(/* Decimal? */n){ - return (n == 0) ? 0 : Math.pow(2, 10 * (n - 1)); - }, - - expoOut: function(/* Decimal? */n){ - return (n == 1) ? 1 : (-1 * Math.pow(2, -10 * n) + 1); - }, - - expoInOut: function(/* Decimal? */n){ - if(n == 0){ return 0; } - if(n == 1){ return 1; } - n = n * 2; - if(n < 1){ return Math.pow(2, 10 * (n - 1)) / 2; } - --n; - return (-1 * Math.pow(2, -10 * n) + 2) / 2; - }, - - circIn: function(/* Decimal? */n){ - return -1 * (Math.sqrt(1 - Math.pow(n, 2)) - 1); - }, - - circOut: function(/* Decimal? */n){ - n = n - 1; - return Math.sqrt(1 - Math.pow(n, 2)); - }, - - circInOut: function(/* Decimal? */n){ - n = n * 2; - if(n < 1){ return -1 / 2 * (Math.sqrt(1 - Math.pow(n, 2)) - 1); } - n -= 2; - return 1 / 2 * (Math.sqrt(1 - Math.pow(n, 2)) + 1); - }, - - backIn: function(/* Decimal? */n){ - // summary: - // An easing function that starts away from the target, - // and quickly accelerates towards the end value. - // - // Use caution when the easing will cause values to become - // negative as some properties cannot be set to negative values. - var s = 1.70158; - return Math.pow(n, 2) * ((s + 1) * n - s); - }, - - backOut: function(/* Decimal? */n){ - // summary: - // An easing function that pops past the range briefly, and slowly comes back. - // - // description: - // An easing function that pops past the range briefly, and slowly comes back. - // - // Use caution when the easing will cause values to become negative as some - // properties cannot be set to negative values. - - n = n - 1; - var s = 1.70158; - return Math.pow(n, 2) * ((s + 1) * n + s) + 1; - }, - - backInOut: function(/* Decimal? */n){ - // summary: - // An easing function combining the effects of `backIn` and `backOut` - // - // description: - // An easing function combining the effects of `backIn` and `backOut`. - // Use caution when the easing will cause values to become negative - // as some properties cannot be set to negative values. - var s = 1.70158 * 1.525; - n = n * 2; - if(n < 1){ return (Math.pow(n, 2) * ((s + 1) * n - s)) / 2; } - n-=2; - return (Math.pow(n, 2) * ((s + 1) * n + s) + 2) / 2; - }, - - elasticIn: function(/* Decimal? */n){ - // summary: - // An easing function the elastically snaps from the start value - // - // description: - // An easing function the elastically snaps from the start value - // - // Use caution when the elasticity will cause values to become negative - // as some properties cannot be set to negative values. - if(n == 0 || n == 1){ return n; } - var p = .3; - var s = p / 4; - n = n - 1; - return -1 * Math.pow(2, 10 * n) * Math.sin((n - s) * (2 * Math.PI) / p); - }, - - elasticOut: function(/* Decimal? */n){ - // summary: - // An easing function that elasticly snaps around the target value, - // near the end of the Animation - // - // description: - // An easing function that elasticly snaps around the target value, - // near the end of the Animation - // - // Use caution when the elasticity will cause values to become - // negative as some properties cannot be set to negative values. - if(n==0 || n == 1){ return n; } - var p = .3; - var s = p / 4; - return Math.pow(2, -10 * n) * Math.sin((n - s) * (2 * Math.PI) / p) + 1; - }, - - elasticInOut: function(/* Decimal? */n){ - // summary: - // An easing function that elasticly snaps around the value, near - // the beginning and end of the Animation. - // - // description: - // An easing function that elasticly snaps around the value, near - // the beginning and end of the Animation. - // - // Use caution when the elasticity will cause values to become - // negative as some properties cannot be set to negative values. - if(n == 0) return 0; - n = n * 2; - if(n == 2) return 1; - var p = .3 * 1.5; - var s = p / 4; - if(n < 1){ - n -= 1; - return -.5 * (Math.pow(2, 10 * n) * Math.sin((n - s) * (2 * Math.PI) / p)); - } - n -= 1; - return .5 * (Math.pow(2, -10 * n) * Math.sin((n - s) * (2 * Math.PI) / p)) + 1; - }, - - bounceIn: function(/* Decimal? */n){ - // summary: - // An easing function that 'bounces' near the beginning of an Animation - return (1 - dojo.fx.easing.bounceOut(1 - n)); // Decimal - }, - - bounceOut: function(/* Decimal? */n){ - // summary: - // An easing function that 'bounces' near the end of an Animation - var s = 7.5625; - var p = 2.75; - var l; - if(n < (1 / p)){ - l = s * Math.pow(n, 2); - }else if(n < (2 / p)){ - n -= (1.5 / p); - l = s * Math.pow(n, 2) + .75; - }else if(n < (2.5 / p)){ - n -= (2.25 / p); - l = s * Math.pow(n, 2) + .9375; - }else{ - n -= (2.625 / p); - l = s * Math.pow(n, 2) + .984375; - } - return l; - }, - - bounceInOut: function(/* Decimal? */n){ - // summary: - // An easing function that 'bounces' at the beginning and end of the Animation - if(n < 0.5){ return dojo.fx.easing.bounceIn(n * 2) / 2; } - return (dojo.fx.easing.bounceOut(n * 2 - 1) / 2) + 0.5; // Decimal - } -}; - -} +//>>built +define("dojo/fx/easing",["../_base/lang"],function(_1){var _2={linear:function(n){return n;},quadIn:function(n){return Math.pow(n,2);},quadOut:function(n){return n*(n-2)*-1;},quadInOut:function(n){n=n*2;if(n<1){return Math.pow(n,2)/2;}return -1*((--n)*(n-2)-1)/2;},cubicIn:function(n){return Math.pow(n,3);},cubicOut:function(n){return Math.pow(n-1,3)+1;},cubicInOut:function(n){n=n*2;if(n<1){return Math.pow(n,3)/2;}n-=2;return (Math.pow(n,3)+2)/2;},quartIn:function(n){return Math.pow(n,4);},quartOut:function(n){return -1*(Math.pow(n-1,4)-1);},quartInOut:function(n){n=n*2;if(n<1){return Math.pow(n,4)/2;}n-=2;return -1/2*(Math.pow(n,4)-2);},quintIn:function(n){return Math.pow(n,5);},quintOut:function(n){return Math.pow(n-1,5)+1;},quintInOut:function(n){n=n*2;if(n<1){return Math.pow(n,5)/2;}n-=2;return (Math.pow(n,5)+2)/2;},sineIn:function(n){return -1*Math.cos(n*(Math.PI/2))+1;},sineOut:function(n){return Math.sin(n*(Math.PI/2));},sineInOut:function(n){return -1*(Math.cos(Math.PI*n)-1)/2;},expoIn:function(n){return (n==0)?0:Math.pow(2,10*(n-1));},expoOut:function(n){return (n==1)?1:(-1*Math.pow(2,-10*n)+1);},expoInOut:function(n){if(n==0){return 0;}if(n==1){return 1;}n=n*2;if(n<1){return Math.pow(2,10*(n-1))/2;}--n;return (-1*Math.pow(2,-10*n)+2)/2;},circIn:function(n){return -1*(Math.sqrt(1-Math.pow(n,2))-1);},circOut:function(n){n=n-1;return Math.sqrt(1-Math.pow(n,2));},circInOut:function(n){n=n*2;if(n<1){return -1/2*(Math.sqrt(1-Math.pow(n,2))-1);}n-=2;return 1/2*(Math.sqrt(1-Math.pow(n,2))+1);},backIn:function(n){var s=1.70158;return Math.pow(n,2)*((s+1)*n-s);},backOut:function(n){n=n-1;var s=1.70158;return Math.pow(n,2)*((s+1)*n+s)+1;},backInOut:function(n){var s=1.70158*1.525;n=n*2;if(n<1){return (Math.pow(n,2)*((s+1)*n-s))/2;}n-=2;return (Math.pow(n,2)*((s+1)*n+s)+2)/2;},elasticIn:function(n){if(n==0||n==1){return n;}var p=0.3;var s=p/4;n=n-1;return -1*Math.pow(2,10*n)*Math.sin((n-s)*(2*Math.PI)/p);},elasticOut:function(n){if(n==0||n==1){return n;}var p=0.3;var s=p/4;return Math.pow(2,-10*n)*Math.sin((n-s)*(2*Math.PI)/p)+1;},elasticInOut:function(n){if(n==0){return 0;}n=n*2;if(n==2){return 1;}var p=0.3*1.5;var s=p/4;if(n<1){n-=1;return -0.5*(Math.pow(2,10*n)*Math.sin((n-s)*(2*Math.PI)/p));}n-=1;return 0.5*(Math.pow(2,-10*n)*Math.sin((n-s)*(2*Math.PI)/p))+1;},bounceIn:function(n){return (1-_2.bounceOut(1-n));},bounceOut:function(n){var s=7.5625;var p=2.75;var l;if(n<(1/p)){l=s*Math.pow(n,2);}else{if(n<(2/p)){n-=(1.5/p);l=s*Math.pow(n,2)+0.75;}else{if(n<(2.5/p)){n-=(2.25/p);l=s*Math.pow(n,2)+0.9375;}else{n-=(2.625/p);l=s*Math.pow(n,2)+0.984375;}}}return l;},bounceInOut:function(n){if(n<0.5){return _2.bounceIn(n*2)/2;}return (_2.bounceOut(n*2-1)/2)+0.5;}};_1.setObject("dojo.fx.easing",_2);return _2;}); \ No newline at end of file diff --git a/lib/dojo/fx/easing.js.uncompressed.js b/lib/dojo/fx/easing.js.uncompressed.js new file mode 100644 index 00000000..6663deb2 --- /dev/null +++ b/lib/dojo/fx/easing.js.uncompressed.js @@ -0,0 +1,284 @@ +define("dojo/fx/easing", ["../_base/lang"], function(lang) { +// module: +// dojo/fx/easing +// summary: +// This module defines standard easing functions that are useful for animations. + +var easingFuncs = /*===== dojo.fx.easing= =====*/ { + // summary: + // Collection of easing functions to use beyond the default + // `dojo._defaultEasing` function. + // + // description: + // + // Easing functions are used to manipulate the iteration through + // an `dojo.Animation`s _Line. _Line being the properties of an Animation, + // and the easing function progresses through that Line determing + // how quickly (or slowly) it should go. Or more accurately: modify + // the value of the _Line based on the percentage of animation completed. + // + // All functions follow a simple naming convention of "ease type" + "when". + // If the name of the function ends in Out, the easing described appears + // towards the end of the animation. "In" means during the beginning, + // and InOut means both ranges of the Animation will applied, both + // beginning and end. + // + // One does not call the easing function directly, it must be passed to + // the `easing` property of an animation. + // + // example: + // | dojo.require("dojo.fx.easing"); + // | var anim = dojo.fadeOut({ + // | node: 'node', + // | duration: 2000, + // | // note there is no () + // | easing: dojo.fx.easing.quadIn + // | }).play(); + // + + linear: function(/* Decimal? */n){ + // summary: A linear easing function + return n; + }, + + quadIn: function(/* Decimal? */n){ + return Math.pow(n, 2); + }, + + quadOut: function(/* Decimal? */n){ + return n * (n - 2) * -1; + }, + + quadInOut: function(/* Decimal? */n){ + n = n * 2; + if(n < 1){ return Math.pow(n, 2) / 2; } + return -1 * ((--n) * (n - 2) - 1) / 2; + }, + + cubicIn: function(/* Decimal? */n){ + return Math.pow(n, 3); + }, + + cubicOut: function(/* Decimal? */n){ + return Math.pow(n - 1, 3) + 1; + }, + + cubicInOut: function(/* Decimal? */n){ + n = n * 2; + if(n < 1){ return Math.pow(n, 3) / 2; } + n -= 2; + return (Math.pow(n, 3) + 2) / 2; + }, + + quartIn: function(/* Decimal? */n){ + return Math.pow(n, 4); + }, + + quartOut: function(/* Decimal? */n){ + return -1 * (Math.pow(n - 1, 4) - 1); + }, + + quartInOut: function(/* Decimal? */n){ + n = n * 2; + if(n < 1){ return Math.pow(n, 4) / 2; } + n -= 2; + return -1 / 2 * (Math.pow(n, 4) - 2); + }, + + quintIn: function(/* Decimal? */n){ + return Math.pow(n, 5); + }, + + quintOut: function(/* Decimal? */n){ + return Math.pow(n - 1, 5) + 1; + }, + + quintInOut: function(/* Decimal? */n){ + n = n * 2; + if(n < 1){ return Math.pow(n, 5) / 2; } + n -= 2; + return (Math.pow(n, 5) + 2) / 2; + }, + + sineIn: function(/* Decimal? */n){ + return -1 * Math.cos(n * (Math.PI / 2)) + 1; + }, + + sineOut: function(/* Decimal? */n){ + return Math.sin(n * (Math.PI / 2)); + }, + + sineInOut: function(/* Decimal? */n){ + return -1 * (Math.cos(Math.PI * n) - 1) / 2; + }, + + expoIn: function(/* Decimal? */n){ + return (n == 0) ? 0 : Math.pow(2, 10 * (n - 1)); + }, + + expoOut: function(/* Decimal? */n){ + return (n == 1) ? 1 : (-1 * Math.pow(2, -10 * n) + 1); + }, + + expoInOut: function(/* Decimal? */n){ + if(n == 0){ return 0; } + if(n == 1){ return 1; } + n = n * 2; + if(n < 1){ return Math.pow(2, 10 * (n - 1)) / 2; } + --n; + return (-1 * Math.pow(2, -10 * n) + 2) / 2; + }, + + circIn: function(/* Decimal? */n){ + return -1 * (Math.sqrt(1 - Math.pow(n, 2)) - 1); + }, + + circOut: function(/* Decimal? */n){ + n = n - 1; + return Math.sqrt(1 - Math.pow(n, 2)); + }, + + circInOut: function(/* Decimal? */n){ + n = n * 2; + if(n < 1){ return -1 / 2 * (Math.sqrt(1 - Math.pow(n, 2)) - 1); } + n -= 2; + return 1 / 2 * (Math.sqrt(1 - Math.pow(n, 2)) + 1); + }, + + backIn: function(/* Decimal? */n){ + // summary: + // An easing function that starts away from the target, + // and quickly accelerates towards the end value. + // + // Use caution when the easing will cause values to become + // negative as some properties cannot be set to negative values. + var s = 1.70158; + return Math.pow(n, 2) * ((s + 1) * n - s); + }, + + backOut: function(/* Decimal? */n){ + // summary: + // An easing function that pops past the range briefly, and slowly comes back. + // + // description: + // An easing function that pops past the range briefly, and slowly comes back. + // + // Use caution when the easing will cause values to become negative as some + // properties cannot be set to negative values. + + n = n - 1; + var s = 1.70158; + return Math.pow(n, 2) * ((s + 1) * n + s) + 1; + }, + + backInOut: function(/* Decimal? */n){ + // summary: + // An easing function combining the effects of `backIn` and `backOut` + // + // description: + // An easing function combining the effects of `backIn` and `backOut`. + // Use caution when the easing will cause values to become negative + // as some properties cannot be set to negative values. + var s = 1.70158 * 1.525; + n = n * 2; + if(n < 1){ return (Math.pow(n, 2) * ((s + 1) * n - s)) / 2; } + n-=2; + return (Math.pow(n, 2) * ((s + 1) * n + s) + 2) / 2; + }, + + elasticIn: function(/* Decimal? */n){ + // summary: + // An easing function the elastically snaps from the start value + // + // description: + // An easing function the elastically snaps from the start value + // + // Use caution when the elasticity will cause values to become negative + // as some properties cannot be set to negative values. + if(n == 0 || n == 1){ return n; } + var p = .3; + var s = p / 4; + n = n - 1; + return -1 * Math.pow(2, 10 * n) * Math.sin((n - s) * (2 * Math.PI) / p); + }, + + elasticOut: function(/* Decimal? */n){ + // summary: + // An easing function that elasticly snaps around the target value, + // near the end of the Animation + // + // description: + // An easing function that elasticly snaps around the target value, + // near the end of the Animation + // + // Use caution when the elasticity will cause values to become + // negative as some properties cannot be set to negative values. + if(n==0 || n == 1){ return n; } + var p = .3; + var s = p / 4; + return Math.pow(2, -10 * n) * Math.sin((n - s) * (2 * Math.PI) / p) + 1; + }, + + elasticInOut: function(/* Decimal? */n){ + // summary: + // An easing function that elasticly snaps around the value, near + // the beginning and end of the Animation. + // + // description: + // An easing function that elasticly snaps around the value, near + // the beginning and end of the Animation. + // + // Use caution when the elasticity will cause values to become + // negative as some properties cannot be set to negative values. + if(n == 0) return 0; + n = n * 2; + if(n == 2) return 1; + var p = .3 * 1.5; + var s = p / 4; + if(n < 1){ + n -= 1; + return -.5 * (Math.pow(2, 10 * n) * Math.sin((n - s) * (2 * Math.PI) / p)); + } + n -= 1; + return .5 * (Math.pow(2, -10 * n) * Math.sin((n - s) * (2 * Math.PI) / p)) + 1; + }, + + bounceIn: function(/* Decimal? */n){ + // summary: + // An easing function that 'bounces' near the beginning of an Animation + return (1 - easingFuncs.bounceOut(1 - n)); // Decimal + }, + + bounceOut: function(/* Decimal? */n){ + // summary: + // An easing function that 'bounces' near the end of an Animation + var s = 7.5625; + var p = 2.75; + var l; + if(n < (1 / p)){ + l = s * Math.pow(n, 2); + }else if(n < (2 / p)){ + n -= (1.5 / p); + l = s * Math.pow(n, 2) + .75; + }else if(n < (2.5 / p)){ + n -= (2.25 / p); + l = s * Math.pow(n, 2) + .9375; + }else{ + n -= (2.625 / p); + l = s * Math.pow(n, 2) + .984375; + } + return l; + }, + + bounceInOut: function(/* Decimal? */n){ + // summary: + // An easing function that 'bounces' at the beginning and end of the Animation + if(n < 0.5){ return easingFuncs.bounceIn(n * 2) / 2; } + return (easingFuncs.bounceOut(n * 2 - 1) / 2) + 0.5; // Decimal + } +}; + +lang.setObject("dojo.fx.easing", easingFuncs); + +return easingFuncs; +}); diff --git a/lib/dojo/gears.js b/lib/dojo/gears.js index d5595b19..bc59a9dd 100644 --- a/lib/dojo/gears.js +++ b/lib/dojo/gears.js @@ -4,62 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.gears"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.gears"] = true; -dojo.provide("dojo.gears"); - -dojo.getObject("gears", true, dojo); - -dojo.gears._gearsObject = function(){ - // summary: - // factory method to get a Google Gears plugin instance to - // expose in the browser runtime environment, if present - var factory; - var results; - - var gearsObj = dojo.getObject("google.gears"); - if(gearsObj){ return gearsObj; } // already defined elsewhere - - if(typeof GearsFactory != "undefined"){ // Firefox - factory = new GearsFactory(); - }else{ - if(dojo.isIE){ - // IE - try{ - factory = new ActiveXObject("Gears.Factory"); - }catch(e){ - // ok to squelch; there's no gears factory. move on. - } - }else if(navigator.mimeTypes["application/x-googlegears"]){ - // Safari? - factory = document.createElement("object"); - factory.setAttribute("type", "application/x-googlegears"); - factory.setAttribute("width", 0); - factory.setAttribute("height", 0); - factory.style.display = "none"; - document.documentElement.appendChild(factory); - } - } - - // still nothing? - if(!factory){ return null; } - - // define the global objects now; don't overwrite them though if they - // were somehow set internally by the Gears plugin, which is on their - // dev roadmap for the future - dojo.setObject("google.gears.factory", factory); - return dojo.getObject("google.gears"); -}; - -/*===== -dojo.gears.available = { - // summary: True if client is using Google Gears -}; -=====*/ -// see if we have Google Gears installed, and if -// so, make it available in the runtime environment -// and in the Google standard 'google.gears' global object -dojo.gears.available = (!!dojo.gears._gearsObject())||0; - -} +//>>built +define("dojo/gears",["./_base/kernel","./_base/lang","./_base/sniff"],function(_1,_2,_3){_2.getObject("gears",true,_1);_1.gears._gearsObject=function(){var _4;var _5=_2.getObject("google.gears");if(_5){return _5;}if(typeof GearsFactory!="undefined"){_4=new GearsFactory();}else{if(_3("ie")){try{_4=new ActiveXObject("Gears.Factory");}catch(e){}}else{if(navigator.mimeTypes["application/x-googlegears"]){_4=document.createElement("object");_4.setAttribute("type","application/x-googlegears");_4.setAttribute("width",0);_4.setAttribute("height",0);_4.style.display="none";document.documentElement.appendChild(_4);}}}if(!_4){return null;}_2.setObject("google.gears.factory",_4);return _2.getObject("google.gears");};_1.gears.available=(!!_1.gears._gearsObject())||0;return _1.gears;}); \ No newline at end of file diff --git a/lib/dojo/gears.js.uncompressed.js b/lib/dojo/gears.js.uncompressed.js new file mode 100644 index 00000000..8ab6c956 --- /dev/null +++ b/lib/dojo/gears.js.uncompressed.js @@ -0,0 +1,61 @@ +define("dojo/gears", ["./_base/kernel", "./_base/lang", "./_base/sniff"], + function(dojo, lang, has) { + // module: + // dojo/gears + // summary: + // TODOC + +lang.getObject("gears", true, dojo); + +dojo.gears._gearsObject = function(){ + // summary: + // factory method to get a Google Gears plugin instance to + // expose in the browser runtime environment, if present + var factory; + + var gearsObj = lang.getObject("google.gears"); + if(gearsObj){ return gearsObj; } // already defined elsewhere + + if(typeof GearsFactory != "undefined"){ // Firefox + factory = new GearsFactory(); + }else{ + if(has("ie")){ + // IE + try{ + factory = new ActiveXObject("Gears.Factory"); + }catch(e){ + // ok to squelch; there's no gears factory. move on. + } + }else if(navigator.mimeTypes["application/x-googlegears"]){ + // Safari? + factory = document.createElement("object"); + factory.setAttribute("type", "application/x-googlegears"); + factory.setAttribute("width", 0); + factory.setAttribute("height", 0); + factory.style.display = "none"; + document.documentElement.appendChild(factory); + } + } + + // still nothing? + if(!factory){ return null; } + + // define the global objects now; don't overwrite them though if they + // were somehow set internally by the Gears plugin, which is on their + // dev roadmap for the future + lang.setObject("google.gears.factory", factory); + return lang.getObject("google.gears"); +}; + +/*===== +dojo.gears.available = { + // summary: True if client is using Google Gears +}; +=====*/ +// see if we have Google Gears installed, and if +// so, make it available in the runtime environment +// and in the Google standard 'google.gears' global object +dojo.gears.available = (!!dojo.gears._gearsObject())||0; + +return dojo.gears; +}); diff --git a/lib/dojo/has.js b/lib/dojo/has.js new file mode 100644 index 00000000..32160dc0 --- /dev/null +++ b/lib/dojo/has.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/has",["require"],function(_1){var _2=_1.has||function(){};if(!1){var _3=typeof window!="undefined"&&typeof location!="undefined"&&typeof document!="undefined"&&window.location==location&&window.document==document,_4=this,_5=_3&&document,_6=_5&&_5.createElement("DiV"),_7={};_2=function(_8){return typeof _7[_8]=="function"?(_7[_8]=_7[_8](_4,_5,_6)):_7[_8];};_2.cache=_7;_2.add=function(_9,_a,_b,_c){(typeof _7[_9]=="undefined"||_c)&&(_7[_9]=_a);return _b&&_2(_9);};true||_2.add("host-browser",_3);true||_2.add("dom",_3);true||_2.add("dojo-dom-ready-api",1);true||_2.add("dojo-sniff",1);}if(1){var _d=navigator.userAgent;_2.add("dom-addeventlistener",!!document.addEventListener);_2.add("touch","ontouchstart" in document);_2.add("device-width",screen.availWidth||innerWidth);_2.add("agent-ios",!!_d.match(/iPhone|iP[ao]d/));_2.add("agent-android",_d.indexOf("android")>1);}_2.clearElement=function(_e){_e.innerHTML="";return _e;};_2.normalize=function(id,_f){var _10=id.match(/[\?:]|[^:\?]*/g),i=0,get=function(_11){var _12=_10[i++];if(_12==":"){return 0;}else{if(_10[i++]=="?"){if(!_11&&_2(_12)){return get();}else{get(true);return get(_11);}}return _12||0;}};id=get();return id&&_f(id);};_2.load=function(id,_13,_14){if(id){_13([id],_14);}else{_14();}};return _2;}); \ No newline at end of file diff --git a/lib/dojo/has.js.uncompressed.js b/lib/dojo/has.js.uncompressed.js new file mode 100644 index 00000000..18ed4f58 --- /dev/null +++ b/lib/dojo/has.js.uncompressed.js @@ -0,0 +1,178 @@ +define("dojo/has", ["require"], function(require) { + // module: + // dojo/has + // summary: + // Defines the has.js API and several feature tests used by dojo. + // description: + // This module defines the has API as described by the project has.js with the following additional features: + // + // * the has test cache is exposed at has.cache. + // * the method has.add includes a forth parameter that controls whether or not existing tests are replaced + // * the loader's has cache may be optionally copied into this module's has cahce. + // + // This module adopted from https://github.com/phiggins42/has.js; thanks has.js team! + + // try to pull the has implementation from the loader; both the dojo loader and bdLoad provide one + // WARNING: if a foreign loader defines require.has to be something other than the has.js API, then this implementation fail + var has = require.has || function(){}; + if(!1){ + // notice the condition is written so that if 1 is transformed to 1 during a build + // the conditional will be (!1 && typeof has=="function") which is statically false and the closure + // compiler will discard the block. + var + isBrowser = + // the most fundamental decision: are we in the browser? + typeof window != "undefined" && + typeof location != "undefined" && + typeof document != "undefined" && + window.location == location && window.document == document, + + // has API variables + global = this, + doc = isBrowser && document, + element = doc && doc.createElement("DiV"), + cache = {}; + + has = /*===== dojo.has= =====*/ function(name){ + // summary: + // Return the current value of the named feature. + // + // name: String|Integer + // The name (if a string) or identifier (if an integer) of the feature to test. + // + // description: + // Returns the value of the feature named by name. The feature must have been + // previously added to the cache by has.add. + + return typeof cache[name] == "function" ? (cache[name] = cache[name](global, doc, element)) : cache[name]; // Boolean + }; + + has.cache = cache; + + has.add = /*====== dojo.has.add= ======*/ function(name, test, now, force){ + // summary: + // Register a new feature test for some named feature. + // + // name: String|Integer + // The name (if a string) or identifier (if an integer) of the feature to test. + // + // test: Function + // A test function to register. If a function, queued for testing until actually + // needed. The test function should return a boolean indicating + // the presence of a feature or bug. + // + // now: Boolean? + // Optional. Omit if `test` is not a function. Provides a way to immediately + // run the test and cache the result. + // + // force: Boolean? + // Optional. If the test already exists and force is truthy, then the existing + // test will be replaced; otherwise, add does not replace an existing test (that + // is, by default, the first test advice wins). + // + // example: + // A redundant test, testFn with immediate execution: + // | has.add("javascript", function(){ return true; }, true); + // + // example: + // Again with the redundantness. You can do this in your tests, but we should + // not be doing this in any internal has.js tests + // | has.add("javascript", true); + // + // example: + // Three things are passed to the testFunction. `global`, `document`, and a generic element + // from which to work your test should the need arise. + // | has.add("bug-byid", function(g, d, el){ + // | // g == global, typically window, yadda yadda + // | // d == document object + // | // el == the generic element. a `has` element. + // | return false; // fake test, byid-when-form-has-name-matching-an-id is slightly longer + // | }); + + (typeof cache[name]=="undefined" || force) && (cache[name]= test); + return now && has(name); + }; + + // since we're operating under a loader that doesn't provide a has API, we must explicitly initialize + // has as it would have otherwise been initialized by the dojo loader; use has.add to the builder + // can optimize these away iff desired + true || has.add("host-browser", isBrowser); + true || has.add("dom", isBrowser); + true || has.add("dojo-dom-ready-api", 1); + true || has.add("dojo-sniff", 1); + } + + if(1){ + var agent = navigator.userAgent; + // Common application level tests + has.add("dom-addeventlistener", !!document.addEventListener); + has.add("touch", "ontouchstart" in document); + // I don't know if any of these tests are really correct, just a rough guess + has.add("device-width", screen.availWidth || innerWidth); + has.add("agent-ios", !!agent.match(/iPhone|iP[ao]d/)); + has.add("agent-android", agent.indexOf("android") > 1); + } + + has.clearElement = /*===== dojo.has.clearElement= ======*/ function(element) { + // summary: + // Deletes the contents of the element passed to test functions. + element.innerHTML= ""; + return element; + }; + + has.normalize = /*===== dojo.has.normalize= ======*/ function(id, toAbsMid){ + // summary: + // Resolves id into a module id based on possibly-nested tenary expression that branches on has feature test value(s). + // + // toAbsMid: Function + // Resolves a relative module id into an absolute module id + var + tokens = id.match(/[\?:]|[^:\?]*/g), i = 0, + get = function(skip){ + var term = tokens[i++]; + if(term == ":"){ + // empty string module name, resolves to 0 + return 0; + }else{ + // postfixed with a ? means it is a feature to branch on, the term is the name of the feature + if(tokens[i++] == "?"){ + if(!skip && has(term)){ + // matched the feature, get the first value from the options + return get(); + }else{ + // did not match, get the second value, passing over the first + get(true); + return get(skip); + } + } + // a module + return term || 0; + } + }; + id = get(); + return id && toAbsMid(id); + }; + + has.load = /*===== dojo.has.load= ======*/ function(id, parentRequire, loaded){ + // summary: + // Conditional loading of AMD modules based on a has feature test value. + // + // id: String + // Gives the resolved module id to load. + // + // parentRequire: Function + // The loader require function with respect to the module that contained the plugin resource in it's + // dependency list. + // + // loaded: Function + // Callback to loader that consumes result of plugin demand. + + if(id){ + parentRequire([id], loaded); + }else{ + loaded(); + } + }; + + return has; +}); diff --git a/lib/dojo/hash.js b/lib/dojo/hash.js index e7f6a400..b3908017 100644 --- a/lib/dojo/hash.js +++ b/lib/dojo/hash.js @@ -4,244 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.hash"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.hash"] = true; -dojo.provide("dojo.hash"); - - -//TODOC: where does this go? -// summary: -// Methods for monitoring and updating the hash in the browser URL. -// -// example: -// dojo.subscribe("/dojo/hashchange", context, callback); -// -// function callback (hashValue){ -// // do something based on the hash value. -// } - -(function(){ - dojo.hash = function(/* String? */ hash, /* Boolean? */ replace){ - // summary: - // Gets or sets the hash string. - // description: - // Handles getting and setting of location.hash. - // - If no arguments are passed, acts as a getter. - // - If a string is passed, acts as a setter. - // hash: - // the hash is set - #string. - // replace: - // If true, updates the hash value in the current history - // state instead of creating a new history state. - // returns: - // when used as a getter, returns the current hash string. - // when used as a setter, returns the new hash string. - - // getter - if(!arguments.length){ - return _getHash(); - } - // setter - if(hash.charAt(0) == "#"){ - hash = hash.substring(1); - } - if(replace){ - _replace(hash); - }else{ - location.href = "#" + hash; - } - return hash; // String - }; - - // Global vars - var _recentHash, _ieUriMonitor, _connect, - _pollFrequency = dojo.config.hashPollFrequency || 100; - - //Internal functions - function _getSegment(str, delimiter){ - var i = str.indexOf(delimiter); - return (i >= 0) ? str.substring(i+1) : ""; - } - - function _getHash(){ - return _getSegment(location.href, "#"); - } - - function _dispatchEvent(){ - dojo.publish("/dojo/hashchange", [_getHash()]); - } - - function _pollLocation(){ - if(_getHash() === _recentHash){ - return; - } - _recentHash = _getHash(); - _dispatchEvent(); - } - - function _replace(hash){ - if(_ieUriMonitor){ - if(_ieUriMonitor.isTransitioning()){ - setTimeout(dojo.hitch(null,_replace,hash), _pollFrequency); - return; - } - var href = _ieUriMonitor.iframe.location.href; - var index = href.indexOf('?'); - // main frame will detect and update itself - _ieUriMonitor.iframe.location.replace(href.substring(0, index) + "?" + hash); - return; - } - location.replace("#"+hash); - !_connect && _pollLocation(); - } - - function IEUriMonitor(){ - // summary: - // Determine if the browser's URI has changed or if the user has pressed the - // back or forward button. If so, call _dispatchEvent. - // - // description: - // IE doesn't add changes to the URI's hash into the history unless the hash - // value corresponds to an actual named anchor in the document. To get around - // this IE difference, we use a background IFrame to maintain a back-forward - // history, by updating the IFrame's query string to correspond to the - // value of the main browser location's hash value. - // - // E.g. if the value of the browser window's location changes to - // - // #action=someAction - // - // ... then we'd update the IFrame's source to: - // - // ?action=someAction - // - // This design leads to a somewhat complex state machine, which is - // described below: - // - // s1: Stable state - neither the window's location has changed nor - // has the IFrame's location. Note that this is the 99.9% case, so - // we optimize for it. - // Transitions: s1, s2, s3 - // s2: Window's location changed - when a user clicks a hyperlink or - // code programmatically changes the window's URI. - // Transitions: s4 - // s3: Iframe's location changed as a result of user pressing back or - // forward - when the user presses back or forward, the location of - // the background's iframe changes to the previous or next value in - // its history. - // Transitions: s1 - // s4: IEUriMonitor has programmatically changed the location of the - // background iframe, but it's location hasn't yet changed. In this - // case we do nothing because we need to wait for the iframe's - // location to reflect its actual state. - // Transitions: s4, s5 - // s5: IEUriMonitor has programmatically changed the location of the - // background iframe, and the iframe's location has caught up with - // reality. In this case we need to transition to s1. - // Transitions: s1 - // - // The hashchange event is always dispatched on the transition back to s1. - // - - // create and append iframe - var ifr = document.createElement("iframe"), - IFRAME_ID = "dojo-hash-iframe", - ifrSrc = dojo.config.dojoBlankHtmlUrl || dojo.moduleUrl("dojo", "resources/blank.html"); - - if(dojo.config.useXDomain && !dojo.config.dojoBlankHtmlUrl){ - console.warn("dojo.hash: When using cross-domain Dojo builds," - + " please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl" - + " to the path on your domain to blank.html"); - } - - ifr.id = IFRAME_ID; - ifr.src = ifrSrc + "?" + _getHash(); - ifr.style.display = "none"; - document.body.appendChild(ifr); - - this.iframe = dojo.global[IFRAME_ID]; - var recentIframeQuery, transitioning, expectedIFrameQuery, docTitle, ifrOffline, - iframeLoc = this.iframe.location; - - function resetState(){ - _recentHash = _getHash(); - recentIframeQuery = ifrOffline ? _recentHash : _getSegment(iframeLoc.href, "?"); - transitioning = false; - expectedIFrameQuery = null; - } - - this.isTransitioning = function(){ - return transitioning; - }; - - this.pollLocation = function(){ - if(!ifrOffline) { - try{ - //see if we can access the iframe's location without a permission denied error - var iframeSearch = _getSegment(iframeLoc.href, "?"); - //good, the iframe is same origin (no thrown exception) - if(document.title != docTitle){ //sync title of main window with title of iframe. - docTitle = this.iframe.document.title = document.title; - } - }catch(e){ - //permission denied - server cannot be reached. - ifrOffline = true; - console.error("dojo.hash: Error adding history entry. Server unreachable."); - } - } - var hash = _getHash(); - if(transitioning && _recentHash === hash){ - // we're in an iframe transition (s4 or s5) - if(ifrOffline || iframeSearch === expectedIFrameQuery){ - // s5 (iframe caught up to main window or iframe offline), transition back to s1 - resetState(); - _dispatchEvent(); - }else{ - // s4 (waiting for iframe to catch up to main window) - setTimeout(dojo.hitch(this,this.pollLocation),0); - return; - } - }else if(_recentHash === hash && (ifrOffline || recentIframeQuery === iframeSearch)){ - // we're in stable state (s1, iframe query == main window hash), do nothing - }else{ - // the user has initiated a URL change somehow. - // sync iframe query <-> main window hash - if(_recentHash !== hash){ - // s2 (main window location changed), set iframe url and transition to s4 - _recentHash = hash; - transitioning = true; - expectedIFrameQuery = hash; - ifr.src = ifrSrc + "?" + expectedIFrameQuery; - ifrOffline = false; //we're updating the iframe src - set offline to false so we can check again on next poll. - setTimeout(dojo.hitch(this,this.pollLocation),0); //yielded transition to s4 while iframe reloads. - return; - }else if(!ifrOffline){ - // s3 (iframe location changed via back/forward button), set main window url and transition to s1. - location.href = "#" + iframeLoc.search.substring(1); - resetState(); - _dispatchEvent(); - } - } - setTimeout(dojo.hitch(this,this.pollLocation), _pollFrequency); - }; - resetState(); // initialize state (transition to s1) - setTimeout(dojo.hitch(this,this.pollLocation), _pollFrequency); - } - dojo.addOnLoad(function(){ - if("onhashchange" in dojo.global && (!dojo.isIE || (dojo.isIE >= 8 && document.compatMode != "BackCompat"))){ //need this IE browser test because "onhashchange" exists in IE8 in IE7 mode - _connect = dojo.connect(dojo.global,"onhashchange",_dispatchEvent); - }else{ - if(document.addEventListener){ // Non-IE - _recentHash = _getHash(); - setInterval(_pollLocation, _pollFrequency); //Poll the window location for changes - }else if(document.attachEvent){ // IE7- - //Use hidden iframe in versions of IE that don't have onhashchange event - _ieUriMonitor = new IEUriMonitor(); - } - // else non-supported browser, do nothing. - } - }); -})(); - -} +//>>built +define("dojo/hash",["./_base/kernel","require","./_base/connect","./_base/lang","./ready","./_base/sniff"],function(_1,_2,_3,_4,_5,_6){_1.hash=function(_7,_8){if(!arguments.length){return _9();}if(_7.charAt(0)=="#"){_7=_7.substring(1);}if(_8){_a(_7);}else{location.href="#"+_7;}return _7;};var _b,_c,_d,_e=_1.config.hashPollFrequency||100;function _f(str,_10){var i=str.indexOf(_10);return (i>=0)?str.substring(i+1):"";};function _9(){return _f(location.href,"#");};function _11(){_3.publish("/dojo/hashchange",[_9()]);};function _12(){if(_9()===_b){return;}_b=_9();_11();};function _a(_13){if(_c){if(_c.isTransitioning()){setTimeout(_4.hitch(null,_a,_13),_e);return;}var _14=_c.iframe.location.href;var _15=_14.indexOf("?");_c.iframe.location.replace(_14.substring(0,_15)+"?"+_13);return;}location.replace("#"+_13);!_d&&_12();};function _16(){var ifr=document.createElement("iframe"),_17="dojo-hash-iframe",_18=_1.config.dojoBlankHtmlUrl||_2.toUrl("./resources/blank.html");if(_1.config.useXDomain&&!_1.config.dojoBlankHtmlUrl){console.warn("dojo.hash: When using cross-domain Dojo builds,"+" please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl"+" to the path on your domain to blank.html");}ifr.id=_17;ifr.src=_18+"?"+_9();ifr.style.display="none";document.body.appendChild(ifr);this.iframe=_1.global[_17];var _19,_1a,_1b,_1c,_1d,_1e=this.iframe.location;function _1f(){_b=_9();_19=_1d?_b:_f(_1e.href,"?");_1a=false;_1b=null;};this.isTransitioning=function(){return _1a;};this.pollLocation=function(){if(!_1d){try{var _20=_f(_1e.href,"?");if(document.title!=_1c){_1c=this.iframe.document.title=document.title;}}catch(e){_1d=true;console.error("dojo.hash: Error adding history entry. Server unreachable.");}}var _21=_9();if(_1a&&_b===_21){if(_1d||_20===_1b){_1f();_11();}else{setTimeout(_4.hitch(this,this.pollLocation),0);return;}}else{if(_b===_21&&(_1d||_19===_20)){}else{if(_b!==_21){_b=_21;_1a=true;_1b=_21;ifr.src=_18+"?"+_1b;_1d=false;setTimeout(_4.hitch(this,this.pollLocation),0);return;}else{if(!_1d){location.href="#"+_1e.search.substring(1);_1f();_11();}}}}setTimeout(_4.hitch(this,this.pollLocation),_e);};_1f();setTimeout(_4.hitch(this,this.pollLocation),_e);};_5(function(){if("onhashchange" in _1.global&&(!_6("ie")||(_6("ie")>=8&&document.compatMode!="BackCompat"))){_d=_3.connect(_1.global,"onhashchange",_11);}else{if(document.addEventListener){_b=_9();setInterval(_12,_e);}else{if(document.attachEvent){_c=new _16();}}}});return _1.hash;}); \ No newline at end of file diff --git a/lib/dojo/hash.js.uncompressed.js b/lib/dojo/hash.js.uncompressed.js new file mode 100644 index 00000000..6824f818 --- /dev/null +++ b/lib/dojo/hash.js.uncompressed.js @@ -0,0 +1,243 @@ +define("dojo/hash", ["./_base/kernel", "require", "./_base/connect", "./_base/lang", "./ready", "./_base/sniff"], + function(dojo, require, connect, lang, ready, has) { + // module: + // dojo/hash + // summary: + // TODOC + + +//TODOC: where does this go? +// summary: +// Methods for monitoring and updating the hash in the browser URL. +// +// example: +// dojo.subscribe("/dojo/hashchange", context, callback); +// +// function callback (hashValue){ +// // do something based on the hash value. +// } + + dojo.hash = function(/* String? */ hash, /* Boolean? */ replace){ + // summary: + // Gets or sets the hash string. + // description: + // Handles getting and setting of location.hash. + // - If no arguments are passed, acts as a getter. + // - If a string is passed, acts as a setter. + // hash: + // the hash is set - #string. + // replace: + // If true, updates the hash value in the current history + // state instead of creating a new history state. + // returns: + // when used as a getter, returns the current hash string. + // when used as a setter, returns the new hash string. + + // getter + if(!arguments.length){ + return _getHash(); + } + // setter + if(hash.charAt(0) == "#"){ + hash = hash.substring(1); + } + if(replace){ + _replace(hash); + }else{ + location.href = "#" + hash; + } + return hash; // String + }; + + // Global vars + var _recentHash, _ieUriMonitor, _connect, + _pollFrequency = dojo.config.hashPollFrequency || 100; + + //Internal functions + function _getSegment(str, delimiter){ + var i = str.indexOf(delimiter); + return (i >= 0) ? str.substring(i+1) : ""; + } + + function _getHash(){ + return _getSegment(location.href, "#"); + } + + function _dispatchEvent(){ + connect.publish("/dojo/hashchange", [_getHash()]); + } + + function _pollLocation(){ + if(_getHash() === _recentHash){ + return; + } + _recentHash = _getHash(); + _dispatchEvent(); + } + + function _replace(hash){ + if(_ieUriMonitor){ + if(_ieUriMonitor.isTransitioning()){ + setTimeout(lang.hitch(null,_replace,hash), _pollFrequency); + return; + } + var href = _ieUriMonitor.iframe.location.href; + var index = href.indexOf('?'); + // main frame will detect and update itself + _ieUriMonitor.iframe.location.replace(href.substring(0, index) + "?" + hash); + return; + } + location.replace("#"+hash); + !_connect && _pollLocation(); + } + + function IEUriMonitor(){ + // summary: + // Determine if the browser's URI has changed or if the user has pressed the + // back or forward button. If so, call _dispatchEvent. + // + // description: + // IE doesn't add changes to the URI's hash into the history unless the hash + // value corresponds to an actual named anchor in the document. To get around + // this IE difference, we use a background IFrame to maintain a back-forward + // history, by updating the IFrame's query string to correspond to the + // value of the main browser location's hash value. + // + // E.g. if the value of the browser window's location changes to + // + // #action=someAction + // + // ... then we'd update the IFrame's source to: + // + // ?action=someAction + // + // This design leads to a somewhat complex state machine, which is + // described below: + // + // s1: Stable state - neither the window's location has changed nor + // has the IFrame's location. Note that this is the 99.9% case, so + // we optimize for it. + // Transitions: s1, s2, s3 + // s2: Window's location changed - when a user clicks a hyperlink or + // code programmatically changes the window's URI. + // Transitions: s4 + // s3: Iframe's location changed as a result of user pressing back or + // forward - when the user presses back or forward, the location of + // the background's iframe changes to the previous or next value in + // its history. + // Transitions: s1 + // s4: IEUriMonitor has programmatically changed the location of the + // background iframe, but it's location hasn't yet changed. In this + // case we do nothing because we need to wait for the iframe's + // location to reflect its actual state. + // Transitions: s4, s5 + // s5: IEUriMonitor has programmatically changed the location of the + // background iframe, and the iframe's location has caught up with + // reality. In this case we need to transition to s1. + // Transitions: s1 + // + // The hashchange event is always dispatched on the transition back to s1. + // + + // create and append iframe + var ifr = document.createElement("iframe"), + IFRAME_ID = "dojo-hash-iframe", + ifrSrc = dojo.config.dojoBlankHtmlUrl || require.toUrl("./resources/blank.html"); + + if(dojo.config.useXDomain && !dojo.config.dojoBlankHtmlUrl){ + console.warn("dojo.hash: When using cross-domain Dojo builds," + + " please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl" + + " to the path on your domain to blank.html"); + } + + ifr.id = IFRAME_ID; + ifr.src = ifrSrc + "?" + _getHash(); + ifr.style.display = "none"; + document.body.appendChild(ifr); + + this.iframe = dojo.global[IFRAME_ID]; + var recentIframeQuery, transitioning, expectedIFrameQuery, docTitle, ifrOffline, + iframeLoc = this.iframe.location; + + function resetState(){ + _recentHash = _getHash(); + recentIframeQuery = ifrOffline ? _recentHash : _getSegment(iframeLoc.href, "?"); + transitioning = false; + expectedIFrameQuery = null; + } + + this.isTransitioning = function(){ + return transitioning; + }; + + this.pollLocation = function(){ + if(!ifrOffline) { + try{ + //see if we can access the iframe's location without a permission denied error + var iframeSearch = _getSegment(iframeLoc.href, "?"); + //good, the iframe is same origin (no thrown exception) + if(document.title != docTitle){ //sync title of main window with title of iframe. + docTitle = this.iframe.document.title = document.title; + } + }catch(e){ + //permission denied - server cannot be reached. + ifrOffline = true; + console.error("dojo.hash: Error adding history entry. Server unreachable."); + } + } + var hash = _getHash(); + if(transitioning && _recentHash === hash){ + // we're in an iframe transition (s4 or s5) + if(ifrOffline || iframeSearch === expectedIFrameQuery){ + // s5 (iframe caught up to main window or iframe offline), transition back to s1 + resetState(); + _dispatchEvent(); + }else{ + // s4 (waiting for iframe to catch up to main window) + setTimeout(lang.hitch(this,this.pollLocation),0); + return; + } + }else if(_recentHash === hash && (ifrOffline || recentIframeQuery === iframeSearch)){ + // we're in stable state (s1, iframe query == main window hash), do nothing + }else{ + // the user has initiated a URL change somehow. + // sync iframe query <-> main window hash + if(_recentHash !== hash){ + // s2 (main window location changed), set iframe url and transition to s4 + _recentHash = hash; + transitioning = true; + expectedIFrameQuery = hash; + ifr.src = ifrSrc + "?" + expectedIFrameQuery; + ifrOffline = false; //we're updating the iframe src - set offline to false so we can check again on next poll. + setTimeout(lang.hitch(this,this.pollLocation),0); //yielded transition to s4 while iframe reloads. + return; + }else if(!ifrOffline){ + // s3 (iframe location changed via back/forward button), set main window url and transition to s1. + location.href = "#" + iframeLoc.search.substring(1); + resetState(); + _dispatchEvent(); + } + } + setTimeout(lang.hitch(this,this.pollLocation), _pollFrequency); + }; + resetState(); // initialize state (transition to s1) + setTimeout(lang.hitch(this,this.pollLocation), _pollFrequency); + } + ready(function(){ + if("onhashchange" in dojo.global && (!has("ie") || (has("ie") >= 8 && document.compatMode != "BackCompat"))){ //need this IE browser test because "onhashchange" exists in IE8 in IE7 mode + _connect = connect.connect(dojo.global,"onhashchange",_dispatchEvent); + }else{ + if(document.addEventListener){ // Non-IE + _recentHash = _getHash(); + setInterval(_pollLocation, _pollFrequency); //Poll the window location for changes + }else if(document.attachEvent){ // IE7- + //Use hidden iframe in versions of IE that don't have onhashchange event + _ieUriMonitor = new IEUriMonitor(); + } + // else non-supported browser, do nothing. + } + }); + + return dojo.hash; + +}); diff --git a/lib/dojo/html.js b/lib/dojo/html.js index f88f899c..97872db2 100644 --- a/lib/dojo/html.js +++ b/lib/dojo/html.js @@ -4,347 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.html"] = true; -dojo.provide("dojo.html"); -dojo.require("dojo.parser"); - -dojo.getObject("html", true, dojo); - -// the parser might be needed.. -(function(){ // private scope, sort of a namespace - - // idCounter is incremented with each instantiation to allow asignment of a unique id for tracking, logging purposes - var idCounter = 0, - d = dojo; - - dojo.html._secureForInnerHtml = function(/*String*/ cont){ - // summary: - // removes !DOCTYPE and title elements from the html string. - // - // khtml is picky about dom faults, you can't attach a style or node as child of body - // must go into head, so we need to cut out those tags - // cont: - // An html string for insertion into the dom - // - return cont.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig, ""); // String - }; - -/*==== - dojo.html._emptyNode = function(node){ - // summary: - // removes all child nodes from the given node - // node: DOMNode - // the parent element - }; -=====*/ - dojo.html._emptyNode = dojo.empty; - - dojo.html._setNodeContent = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont){ - // summary: - // inserts the given content into the given node - // node: - // the parent element - // content: - // the content to be set on the parent element. - // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes - - // always empty - d.empty(node); - - if(cont) { - if(typeof cont == "string") { - cont = d._toDom(cont, node.ownerDocument); - } - if(!cont.nodeType && d.isArrayLike(cont)) { - // handle as enumerable, but it may shrink as we enumerate it - for(var startlen=cont.length, i=0; i<cont.length; i=startlen==cont.length ? i+1 : 0) { - d.place( cont[i], node, "last"); - } - } else { - // pass nodes, documentFragments and unknowns through to dojo.place - d.place(cont, node, "last"); - } - } - - // return DomNode - return node; - }; - - // we wrap up the content-setting operation in a object - dojo.declare("dojo.html._ContentSetter", null, - { - // node: DomNode|String - // An node which will be the parent element that we set content into - node: "", - - // content: String|DomNode|DomNode[] - // The content to be placed in the node. Can be an HTML string, a node reference, or a enumerable list of nodes - content: "", - - // id: String? - // Usually only used internally, and auto-generated with each instance - id: "", - - // cleanContent: Boolean - // Should the content be treated as a full html document, - // and the real content stripped of <html>, <body> wrapper before injection - cleanContent: false, - - // extractContent: Boolean - // Should the content be treated as a full html document, and the real content stripped of <html>, <body> wrapper before injection - extractContent: false, - - // parseContent: Boolean - // Should the node by passed to the parser after the new content is set - parseContent: false, - - // 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: dojo._scopeName, - - // startup: Boolean - // Start the child widgets after parsing them. Only obeyed if parseContent is true. - startup: true, - - // lifecyle methods - constructor: function(/* Object */params, /* String|DomNode */node){ - // summary: - // Provides a configurable, extensible object to wrap the setting on content on a node - // call the set() method to actually set the content.. - - // the original params are mixed directly into the instance "this" - dojo.mixin(this, params || {}); - - // give precedence to params.node vs. the node argument - // and ensure its a node, not an id string - node = this.node = dojo.byId( this.node || node ); - - if(!this.id){ - this.id = [ - "Setter", - (node) ? node.id || node.tagName : "", - idCounter++ - ].join("_"); - } - }, - set: function(/* String|DomNode|NodeList? */ cont, /* Object? */ params){ - // summary: - // front-end to the set-content sequence - // cont: - // An html string, node or enumerable list of nodes for insertion into the dom - // If not provided, the object's content property will be used - if(undefined !== cont){ - this.content = cont; - } - // in the re-use scenario, set needs to be able to mixin new configuration - if(params){ - this._mixin(params); - } - - this.onBegin(); - this.setContent(); - this.onEnd(); - - return this.node; - }, - setContent: function(){ - // summary: - // sets the content on the node - - var node = this.node; - if(!node) { - // can't proceed - throw new Error(this.declaredClass + ": setContent given no node"); - } - try{ - node = dojo.html._setNodeContent(node, this.content); - }catch(e){ - // check if a domfault occurs when we are appending this.errorMessage - // like for instance if domNode is a UL and we try append a DIV - - // FIXME: need to allow the user to provide a content error message string - var errMess = this.onContentError(e); - try{ - node.innerHTML = errMess; - }catch(e){ - console.error('Fatal ' + this.declaredClass + '.setContent could not change content due to '+e.message, e); - } - } - // always put back the node for the next method - this.node = node; // DomNode - }, - - empty: function() { - // summary - // cleanly empty out existing content - - // destroy any widgets from a previous run - // NOTE: if you dont want this you'll need to empty - // the parseResults array property yourself to avoid bad things happenning - if(this.parseResults && this.parseResults.length) { - dojo.forEach(this.parseResults, function(w) { - if(w.destroy){ - w.destroy(); - } - }); - delete this.parseResults; - } - // this is fast, but if you know its already empty or safe, you could - // override empty to skip this step - dojo.html._emptyNode(this.node); - }, - - onBegin: function(){ - // summary - // Called after instantiation, but before set(); - // It allows modification of any of the object properties - // - including the node and content provided - before the set operation actually takes place - // This default implementation checks for cleanContent and extractContent flags to - // optionally pre-process html string content - var cont = this.content; - - if(dojo.isString(cont)){ - if(this.cleanContent){ - cont = dojo.html._secureForInnerHtml(cont); - } - - if(this.extractContent){ - var match = cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im); - if(match){ cont = match[1]; } - } - } - - // clean out the node and any cruft associated with it - like widgets - this.empty(); - - this.content = cont; - return this.node; /* DomNode */ - }, - - onEnd: function(){ - // summary - // Called after set(), when the new content has been pushed into the node - // It provides an opportunity for post-processing before handing back the node to the caller - // This default implementation checks a parseContent flag to optionally run the dojo parser over the new content - if(this.parseContent){ - // populates this.parseResults if you need those.. - this._parse(); - } - return this.node; /* DomNode */ - }, - - tearDown: function(){ - // summary - // manually reset the Setter instance if its being re-used for example for another set() - // description - // tearDown() is not called automatically. - // In normal use, the Setter instance properties are simply allowed to fall out of scope - // but the tearDown method can be called to explicitly reset this instance. - delete this.parseResults; - delete this.node; - delete this.content; - }, - - onContentError: function(err){ - return "Error occured setting content: " + err; - }, - - _mixin: function(params){ - // mix properties/methods into the instance - // TODO: the intention with tearDown is to put the Setter's state - // back to that of the original constructor (vs. deleting/resetting everything regardless of ctor params) - // so we could do something here to move the original properties aside for later restoration - var empty = {}, key; - for(key in params){ - if(key in empty){ continue; } - // TODO: here's our opportunity to mask the properties we dont consider configurable/overridable - // .. but history shows we'll almost always guess wrong - this[key] = params[key]; - } - }, - _parse: function(){ - // summary: - // runs the dojo parser over the node contents, storing any results in this.parseResults - // Any errors resulting from parsing are passed to _onError for handling - - var rootNode = this.node; - try{ - // store the results (widgets, whatever) for potential retrieval - var inherited = {}; - dojo.forEach(["dir", "lang", "textDir"], function(name){ - if(this[name]){ - inherited[name] = this[name]; - } - }, this); - this.parseResults = dojo.parser.parse({ - rootNode: rootNode, - noStart: !this.startup, - inherited: inherited, - scope: this.parserScope - }); - }catch(e){ - this._onError('Content', e, "Error parsing in _ContentSetter#"+this.id); - } - }, - - _onError: function(type, err, consoleText){ - // summary: - // shows user the string that is returned by on[type]Error - // overide/implement 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 - dojo.html._setNodeContent(this.node, errText, true); - } - } - }); // end dojo.declare() - - dojo.html.set = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont, /* Object? */ params){ - // summary: - // inserts (replaces) the given content into the given node. dojo.place(cont, node, "only") - // may be a better choice for simple HTML insertion. - // description: - // Unless you need to use the params capabilities of this method, you should use - // dojo.place(cont, node, "only"). dojo.place() has more robust support for injecting - // an HTML string into the DOM, but it only handles inserting an HTML string as DOM - // elements, or inserting a DOM node. dojo.place does not handle NodeList insertions - // or the other capabilities as defined by the params object for this method. - // node: - // the parent element that will receive the content - // cont: - // the content to be set on the parent element. - // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes - // params: - // Optional flags/properties to configure the content-setting. See dojo.html._ContentSetter - // example: - // A safe string/node/nodelist content replacement/injection with hooks for extension - // Example Usage: - // dojo.html.set(node, "some string"); - // dojo.html.set(node, contentNode, {options}); - // dojo.html.set(node, myNode.childNodes, {options}); - if(undefined == cont){ - console.warn("dojo.html.set: no cont argument provided, using empty string"); - cont = ""; - } - if(!params){ - // simple and fast - return dojo.html._setNodeContent(node, cont, true); - }else{ - // more options but slower - // note the arguments are reversed in order, to match the convention for instantiation via the parser - var op = new dojo.html._ContentSetter(dojo.mixin( - params, - { content: cont, node: node } - )); - return op.set(); - } - }; -})(); - -} +//>>built +define("dojo/html",["./_base/kernel","./_base/lang","./_base/array","./_base/declare","./dom","./dom-construct","./parser"],function(_1,_2,_3,_4,_5,_6,_7){_2.getObject("html",true,_1);var _8=0;_1.html._secureForInnerHtml=function(_9){return _9.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig,"");};_1.html._emptyNode=_6.empty;_1.html._setNodeContent=function(_a,_b){_6.empty(_a);if(_b){if(typeof _b=="string"){_b=_6.toDom(_b,_a.ownerDocument);}if(!_b.nodeType&&_2.isArrayLike(_b)){for(var _c=_b.length,i=0;i<_b.length;i=_c==_b.length?i+1:0){_6.place(_b[i],_a,"last");}}else{_6.place(_b,_a,"last");}}return _a;};_4("dojo.html._ContentSetter",null,{node:"",content:"",id:"",cleanContent:false,extractContent:false,parseContent:false,parserScope:_1._scopeName,startup:true,constructor:function(_d,_e){_2.mixin(this,_d||{});_e=this.node=_5.byId(this.node||_e);if(!this.id){this.id=["Setter",(_e)?_e.id||_e.tagName:"",_8++].join("_");}},set:function(_f,_10){if(undefined!==_f){this.content=_f;}if(_10){this._mixin(_10);}this.onBegin();this.setContent();this.onEnd();return this.node;},setContent:function(){var _11=this.node;if(!_11){throw new Error(this.declaredClass+": setContent given no node");}try{_11=_1.html._setNodeContent(_11,this.content);}catch(e){var _12=this.onContentError(e);try{_11.innerHTML=_12;}catch(e){console.error("Fatal "+this.declaredClass+".setContent could not change content due to "+e.message,e);}}this.node=_11;},empty:function(){if(this.parseResults&&this.parseResults.length){_3.forEach(this.parseResults,function(w){if(w.destroy){w.destroy();}});delete this.parseResults;}_1.html._emptyNode(this.node);},onBegin:function(){var _13=this.content;if(_2.isString(_13)){if(this.cleanContent){_13=_1.html._secureForInnerHtml(_13);}if(this.extractContent){var _14=_13.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_14){_13=_14[1];}}}this.empty();this.content=_13;return this.node;},onEnd:function(){if(this.parseContent){this._parse();}return this.node;},tearDown:function(){delete this.parseResults;delete this.node;delete this.content;},onContentError:function(err){return "Error occured setting content: "+err;},_mixin:function(_15){var _16={},key;for(key in _15){if(key in _16){continue;}this[key]=_15[key];}},_parse:function(){var _17=this.node;try{var _18={};_3.forEach(["dir","lang","textDir"],function(_19){if(this[_19]){_18[_19]=this[_19];}},this);this.parseResults=_7.parse({rootNode:_17,noStart:!this.startup,inherited:_18,scope:this.parserScope});}catch(e){this._onError("Content",e,"Error parsing in _ContentSetter#"+this.id);}},_onError:function(_1a,err,_1b){var _1c=this["on"+_1a+"Error"].call(this,err);if(_1b){console.error(_1b,err);}else{if(_1c){_1.html._setNodeContent(this.node,_1c,true);}}}});_1.html.set=function(_1d,_1e,_1f){if(undefined==_1e){console.warn("dojo.html.set: no cont argument provided, using empty string");_1e="";}if(!_1f){return _1.html._setNodeContent(_1d,_1e,true);}else{var op=new _1.html._ContentSetter(_2.mixin(_1f,{content:_1e,node:_1d}));return op.set();}};return _1.html;}); \ No newline at end of file diff --git a/lib/dojo/html.js.uncompressed.js b/lib/dojo/html.js.uncompressed.js new file mode 100644 index 00000000..69697310 --- /dev/null +++ b/lib/dojo/html.js.uncompressed.js @@ -0,0 +1,342 @@ +define("dojo/html", ["./_base/kernel", "./_base/lang", "./_base/array", "./_base/declare", "./dom", "./dom-construct", "./parser"], function(dojo, lang, darray, declare, dom, domConstruct, parser) { + // module: + // dojo/html + // summary: + // TODOC + + lang.getObject("html", true, dojo); + + // the parser might be needed.. + + // idCounter is incremented with each instantiation to allow asignment of a unique id for tracking, logging purposes + var idCounter = 0; + + dojo.html._secureForInnerHtml = function(/*String*/ cont){ + // summary: + // removes !DOCTYPE and title elements from the html string. + // + // khtml is picky about dom faults, you can't attach a style or <title> node as child of body + // must go into head, so we need to cut out those tags + // cont: + // An html string for insertion into the dom + // + return cont.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig, ""); // String + }; + +/*==== + dojo.html._emptyNode = function(node){ + // summary: + // removes all child nodes from the given node + // node: DOMNode + // the parent element + }; +=====*/ + dojo.html._emptyNode = domConstruct.empty; + + dojo.html._setNodeContent = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont){ + // summary: + // inserts the given content into the given node + // node: + // the parent element + // content: + // the content to be set on the parent element. + // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes + + // always empty + domConstruct.empty(node); + + if(cont) { + if(typeof cont == "string") { + cont = domConstruct.toDom(cont, node.ownerDocument); + } + if(!cont.nodeType && lang.isArrayLike(cont)) { + // handle as enumerable, but it may shrink as we enumerate it + for(var startlen=cont.length, i=0; i<cont.length; i=startlen==cont.length ? i+1 : 0) { + domConstruct.place( cont[i], node, "last"); + } + } else { + // pass nodes, documentFragments and unknowns through to dojo.place + domConstruct.place(cont, node, "last"); + } + } + + // return DomNode + return node; + }; + + // we wrap up the content-setting operation in a object + declare("dojo.html._ContentSetter", null, + { + // node: DomNode|String + // An node which will be the parent element that we set content into + node: "", + + // content: String|DomNode|DomNode[] + // The content to be placed in the node. Can be an HTML string, a node reference, or a enumerable list of nodes + content: "", + + // id: String? + // Usually only used internally, and auto-generated with each instance + id: "", + + // cleanContent: Boolean + // Should the content be treated as a full html document, + // and the real content stripped of <html>, <body> wrapper before injection + cleanContent: false, + + // extractContent: Boolean + // Should the content be treated as a full html document, and the real content stripped of <html>, <body> wrapper before injection + extractContent: false, + + // parseContent: Boolean + // Should the node by passed to the parser after the new content is set + parseContent: false, + + // 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: dojo._scopeName, + + // startup: Boolean + // Start the child widgets after parsing them. Only obeyed if parseContent is true. + startup: true, + + // lifecyle methods + constructor: function(/* Object */params, /* String|DomNode */node){ + // summary: + // Provides a configurable, extensible object to wrap the setting on content on a node + // call the set() method to actually set the content.. + + // the original params are mixed directly into the instance "this" + lang.mixin(this, params || {}); + + // give precedence to params.node vs. the node argument + // and ensure its a node, not an id string + node = this.node = dom.byId( this.node || node ); + + if(!this.id){ + this.id = [ + "Setter", + (node) ? node.id || node.tagName : "", + idCounter++ + ].join("_"); + } + }, + set: function(/* String|DomNode|NodeList? */ cont, /* Object? */ params){ + // summary: + // front-end to the set-content sequence + // cont: + // An html string, node or enumerable list of nodes for insertion into the dom + // If not provided, the object's content property will be used + if(undefined !== cont){ + this.content = cont; + } + // in the re-use scenario, set needs to be able to mixin new configuration + if(params){ + this._mixin(params); + } + + this.onBegin(); + this.setContent(); + this.onEnd(); + + return this.node; + }, + setContent: function(){ + // summary: + // sets the content on the node + + var node = this.node; + if(!node) { + // can't proceed + throw new Error(this.declaredClass + ": setContent given no node"); + } + try{ + node = dojo.html._setNodeContent(node, this.content); + }catch(e){ + // check if a domfault occurs when we are appending this.errorMessage + // like for instance if domNode is a UL and we try append a DIV + + // FIXME: need to allow the user to provide a content error message string + var errMess = this.onContentError(e); + try{ + node.innerHTML = errMess; + }catch(e){ + console.error('Fatal ' + this.declaredClass + '.setContent could not change content due to '+e.message, e); + } + } + // always put back the node for the next method + this.node = node; // DomNode + }, + + empty: function() { + // summary + // cleanly empty out existing content + + // destroy any widgets from a previous run + // NOTE: if you dont want this you'll need to empty + // the parseResults array property yourself to avoid bad things happenning + if(this.parseResults && this.parseResults.length) { + darray.forEach(this.parseResults, function(w) { + if(w.destroy){ + w.destroy(); + } + }); + delete this.parseResults; + } + // this is fast, but if you know its already empty or safe, you could + // override empty to skip this step + dojo.html._emptyNode(this.node); + }, + + onBegin: function(){ + // summary + // Called after instantiation, but before set(); + // It allows modification of any of the object properties + // - including the node and content provided - before the set operation actually takes place + // This default implementation checks for cleanContent and extractContent flags to + // optionally pre-process html string content + var cont = this.content; + + if(lang.isString(cont)){ + if(this.cleanContent){ + cont = dojo.html._secureForInnerHtml(cont); + } + + if(this.extractContent){ + var match = cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im); + if(match){ cont = match[1]; } + } + } + + // clean out the node and any cruft associated with it - like widgets + this.empty(); + + this.content = cont; + return this.node; /* DomNode */ + }, + + onEnd: function(){ + // summary + // Called after set(), when the new content has been pushed into the node + // It provides an opportunity for post-processing before handing back the node to the caller + // This default implementation checks a parseContent flag to optionally run the dojo parser over the new content + if(this.parseContent){ + // populates this.parseResults if you need those.. + this._parse(); + } + return this.node; /* DomNode */ + }, + + tearDown: function(){ + // summary + // manually reset the Setter instance if its being re-used for example for another set() + // description + // tearDown() is not called automatically. + // In normal use, the Setter instance properties are simply allowed to fall out of scope + // but the tearDown method can be called to explicitly reset this instance. + delete this.parseResults; + delete this.node; + delete this.content; + }, + + onContentError: function(err){ + return "Error occured setting content: " + err; + }, + + _mixin: function(params){ + // mix properties/methods into the instance + // TODO: the intention with tearDown is to put the Setter's state + // back to that of the original constructor (vs. deleting/resetting everything regardless of ctor params) + // so we could do something here to move the original properties aside for later restoration + var empty = {}, key; + for(key in params){ + if(key in empty){ continue; } + // TODO: here's our opportunity to mask the properties we dont consider configurable/overridable + // .. but history shows we'll almost always guess wrong + this[key] = params[key]; + } + }, + _parse: function(){ + // summary: + // runs the dojo parser over the node contents, storing any results in this.parseResults + // Any errors resulting from parsing are passed to _onError for handling + + var rootNode = this.node; + try{ + // store the results (widgets, whatever) for potential retrieval + var inherited = {}; + darray.forEach(["dir", "lang", "textDir"], function(name){ + if(this[name]){ + inherited[name] = this[name]; + } + }, this); + this.parseResults = parser.parse({ + rootNode: rootNode, + noStart: !this.startup, + inherited: inherited, + scope: this.parserScope + }); + }catch(e){ + this._onError('Content', e, "Error parsing in _ContentSetter#"+this.id); + } + }, + + _onError: function(type, err, consoleText){ + // summary: + // shows user the string that is returned by on[type]Error + // overide/implement 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 + dojo.html._setNodeContent(this.node, errText, true); + } + } + }); // end dojo.declare() + + dojo.html.set = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont, /* Object? */ params){ + // summary: + // inserts (replaces) the given content into the given node. dojo.place(cont, node, "only") + // may be a better choice for simple HTML insertion. + // description: + // Unless you need to use the params capabilities of this method, you should use + // dojo.place(cont, node, "only"). dojo.place() has more robust support for injecting + // an HTML string into the DOM, but it only handles inserting an HTML string as DOM + // elements, or inserting a DOM node. dojo.place does not handle NodeList insertions + // or the other capabilities as defined by the params object for this method. + // node: + // the parent element that will receive the content + // cont: + // the content to be set on the parent element. + // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes + // params: + // Optional flags/properties to configure the content-setting. See dojo.html._ContentSetter + // example: + // A safe string/node/nodelist content replacement/injection with hooks for extension + // Example Usage: + // dojo.html.set(node, "some string"); + // dojo.html.set(node, contentNode, {options}); + // dojo.html.set(node, myNode.childNodes, {options}); + if(undefined == cont){ + console.warn("dojo.html.set: no cont argument provided, using empty string"); + cont = ""; + } + if(!params){ + // simple and fast + return dojo.html._setNodeContent(node, cont, true); + }else{ + // more options but slower + // note the arguments are reversed in order, to match the convention for instantiation via the parser + var op = new dojo.html._ContentSetter(lang.mixin( + params, + { content: cont, node: node } + )); + return op.set(); + } + }; + + return dojo.html; +}); diff --git a/lib/dojo/i18n.js b/lib/dojo/i18n.js index 893490fe..b79ec6c5 100644 --- a/lib/dojo/i18n.js +++ b/lib/dojo/i18n.js @@ -4,259 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -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.getObject("i18n", true, dojo); - -/*===== -dojo.i18n = { - // summary: Utility classes to enable loading of resources for internationalization (i18n) -}; -=====*/ - -// when using a real AMD loader, dojo.i18n.getLocalization is already defined by dojo/lib/backCompat -dojo.i18n.getLocalization = 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. - //Using ["indexOf"] so customBase builds do not see - //this as a dojo._base.array dependency. - 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){ - hash = hash.root || 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<extra.length; i++){ - req(m,b,extra[i], availableFlatLocales); - } - }; - } -})(); - -dojo.i18n._searchLocalePath = function(/*String*/locale, /*Boolean*/down, /*Function*/searchFunc){ - // summary: - // A helper method to assist in searching for locale-based resources. - // Will iterate through the variants of a particular locale, either up - // or down, executing a callback function. For example, "en-us" and - // true will try "en-us" followed by "en" and finally "ROOT". - - locale = dojo.i18n.normalizeLocale(locale); - - var elements = locale.split('-'); - var searchlist = []; - for(var i = elements.length; 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<localesGenerated.length;i++){ - if(localesGenerated[i] == loc){ - dojo["require"](bundlePrefix+"_"+loc); - return true; // Boolean - } - } - return false; // Boolean - }); - } - preload(); - var extra = dojo.config.extraLocale||[]; - for(var i=0; i<extra.length; i++){ - preload(extra[i]); - } -}; - -} +//>>built +define("dojo/i18n",["./_base/kernel","require","./has","./_base/array","./_base/config","./_base/lang","./_base/xhr","./json"],function(_1,_2,_3,_4,_5,_6,_7,_8){_3.add("dojo-preload-i18n-Api",1);true||_3.add("dojo-v1x-i18n-Api",1);var _9=_1.i18n={},_a=/(^.*(^|\/)nls)(\/|$)([^\/]*)\/?([^\/]*)/,_b=function(_c,_d,_e,_f){for(var _10=[_e+_f],_11=_d.split("-"),_12="",i=0;i<_11.length;i++){_12+=(_12?"-":"")+_11[i];if(!_c||_c[_12]){_10.push(_e+_12+"/"+_f);}}return _10;},_13={},_14=_1.getL10nName=function(_15,_16,_17){_17=_17?_17.toLowerCase():_1.locale;_15="dojo/i18n!"+_15.replace(/\./g,"/");_16=_16.replace(/\./g,"/");return (/root/i.test(_17))?(_15+"/nls/"+_16):(_15+"/nls/"+_17+"/"+_16);},_18=function(_19,_1a,_1b,_1c,_1d,_1e){_19([_1a],function(_1f){var _20=_6.clone(_1f.root),_21=_b(!_1f._v1x&&_1f,_1d,_1b,_1c);_19(_21,function(){for(var i=1;i<_21.length;i++){_20=_6.mixin(_6.clone(_20),arguments[i]);}var _22=_1a+"/"+_1d;_13[_22]=_20;_1e();});});},_23=function(id,_24){return /^\./.test(id)?_24(id):id;},_25=function(_26){var _27=_5.extraLocale||[];_27=_6.isArray(_27)?_27:[_27];_27.push(_26);return _27;},_28=function(id,_29,_2a){if(_3("dojo-preload-i18n-Api")){var _2b=id.split("*"),_2c=_2b[1]=="preload";if(_2c){if(!_13[id]){_13[id]=1;_2d(_2b[2],_8.parse(_2b[3]),1);}_2a(1);}if(_2c||_2e(id,_29,_2a)){return;}}var _2f=_a.exec(id),_30=_2f[1]+"/",_31=_2f[5]||_2f[4],_32=_30+_31,_33=(_2f[5]&&_2f[4]),_34=_33||_1.locale,_35=_32+"/"+_34,_36=_33?[_34]:_25(_34),_37=_36.length,_38=function(){if(!--_37){_2a(_6.delegate(_13[_35]));}};_4.forEach(_36,function(_39){var _3a=_32+"/"+_39;if(_3("dojo-preload-i18n-Api")){_3b(_3a);}if(!_13[_3a]){_18(_29,_32,_30,_31,_39,_38);}else{_38();}});};if(_3("dojo-unit-tests")){var _3c=_9.unitTests=[];}if(_3("dojo-preload-i18n-Api")||1){var _3d=_9.normalizeLocale=function(_3e){var _3f=_3e?_3e.toLowerCase():_1.locale;return _3f=="root"?"ROOT":_3f;},_40=function(mid){return (1&&1)?_2.isXdUrl(_2.toUrl(mid+".js")):true;},_41=0,_42=[],_2d=_9._preloadLocalizations=function(_43,_44,_45){function _46(_47,_48){var _49=_47.split("-");while(_49.length){if(_48(_49.join("-"))){return true;}_49.pop();}return _48("ROOT");};function _4a(_4b){_4b=_3d(_4b);_46(_4b,function(loc){if(_4.indexOf(_44,loc)>=0){var mid=_43.replace(/\./g,"/")+"_"+loc;_41++;(_40(mid)||_45?_2:_50)([mid],function(_4c){for(var p in _4c){_13[p+"/"+_4b]=_4c[p];}--_41;while(!_41&&_42.length){_28.apply(null,_42.shift());}});return true;}return false;});};_4a();_4.forEach(_1.config.extraLocale,_4a);},_2e=function(id,_4d,_4e){if(_41){_42.push([id,_4d,_4e]);}return _41;};}if(1){var _4f=new Function("__bundle","__checkForLegacyModules","__mid","var define = function(){define.called = 1;},"+" require = function(){define.called = 1;};"+"try{"+"define.called = 0;"+"eval(__bundle);"+"if(define.called==1)"+"return 1;"+"if((__checkForLegacyModules = __checkForLegacyModules(__mid)))"+"return __checkForLegacyModules;"+"}catch(e){}"+"try{"+"return eval('('+__bundle+')');"+"}catch(e){"+"return e;"+"}"),_50=function(_51,_52){var _53=[];_4.forEach(_51,function(mid){var url=_2.toUrl(mid+".js");function _28(_54){var _55=_4f(_54,_3b,mid);if(_55===1){_2([mid],function(_56){_53.push(_13[url]=_56);});}else{if(_55 instanceof Error){console.error("failed to evaluate i18n bundle; url="+url,_55);_55={};}_53.push(_13[url]=(/nls\/[^\/]+\/[^\/]+$/.test(url)?_55:{root:_55,_v1x:1}));}};if(_13[url]){_53.push(_13[url]);}else{var _57=_2.syncLoadNls(mid);if(_57){_53.push(_57);}else{if(!_7){try{_2.getText(url,true,_28);}catch(e){_53.push(_13[url]={});}}else{_7.get({url:url,sync:true,load:_28,error:function(){_53.push(_13[url]={});}});}}}});_52&&_52.apply(null,_53);},_3b=function(_58){for(var _59,_5a=_58.split("/"),_5b=_1.global[_5a[0]],i=1;_5b&&i<_5a.length-1;_5b=_5b[_5a[i++]]){}if(_5b){_59=_5b[_5a[i]];if(!_59){_59=_5b[_5a[i].replace(/-/g,"_")];}if(_59){_13[_58]=_59;}}return _59;};_9.getLocalization=function(_5c,_5d,_5e){var _5f,_60=_14(_5c,_5d,_5e).substring(10);_28(_60,(!_40(_60)?_50:_2),function(_61){_5f=_61;});return _5f;};if(_3("dojo-unit-tests")){_3c.push(function(doh){doh.register("tests.i18n.unit",function(t){var _62;_62=_4f("{prop:1}");t.is({prop:1},_62);t.is(undefined,_62[1]);_62=_4f("({prop:1})");t.is({prop:1},_62);t.is(undefined,_62[1]);_62=_4f("{'prop-x':1}");t.is({"prop-x":1},_62);t.is(undefined,_62[1]);_62=_4f("({'prop-x':1})");t.is({"prop-x":1},_62);t.is(undefined,_62[1]);_62=_4f("define({'prop-x':1})");t.is(1,_62);_62=_4f("this is total nonsense and should throw an error");t.is(_62 instanceof Error,true);});});}}return _6.mixin(_9,{dynamic:true,normalize:_23,load:_28,cache:_13});}); \ No newline at end of file diff --git a/lib/dojo/i18n.js.uncompressed.js b/lib/dojo/i18n.js.uncompressed.js new file mode 100644 index 00000000..ebc94c26 --- /dev/null +++ b/lib/dojo/i18n.js.uncompressed.js @@ -0,0 +1,514 @@ +define("dojo/i18n", ["./_base/kernel", "require", "./has", "./_base/array", "./_base/config", "./_base/lang", "./_base/xhr", "./json"], + function(dojo, require, has, array, config, lang, xhr, json) { + // module: + // dojo/i18n + // summary: + // This module implements the !dojo/i18n plugin and the v1.6- i18n API + // description: + // We choose to include our own plugin to leverage functionality already contained in dojo + // and thereby reduce the size of the plugin compared to various loader implementations. Also, this + // allows foreign AMD loaders to be used without their plugins. + + + has.add("dojo-preload-i18n-Api", + // if true, define the preload localizations machinery + 1 + ); + + true || has.add("dojo-v1x-i18n-Api", + // if true, define the v1.x i18n functions + 1 + ); + + var + thisModule= dojo.i18n= + // the dojo.i18n module + {}, + + nlsRe= + // regexp for reconstructing the master bundle name from parts of the regexp match + // nlsRe.exec("foo/bar/baz/nls/en-ca/foo") gives: + // ["foo/bar/baz/nls/en-ca/foo", "foo/bar/baz/nls/", "/", "/", "en-ca", "foo"] + // nlsRe.exec("foo/bar/baz/nls/foo") gives: + // ["foo/bar/baz/nls/foo", "foo/bar/baz/nls/", "/", "/", "foo", ""] + // so, if match[5] is blank, it means this is the top bundle definition. + // courtesy of http://requirejs.org + /(^.*(^|\/)nls)(\/|$)([^\/]*)\/?([^\/]*)/, + + getAvailableLocales= function( + root, + locale, + bundlePath, + bundleName + ){ + // return a vector of module ids containing all available locales with respect to the target locale + // For example, assuming: + // * the root bundle indicates specific bundles for "fr" and "fr-ca", + // * bundlePath is "myPackage/nls" + // * bundleName is "myBundle" + // Then a locale argument of "fr-ca" would return + // ["myPackage/nls/myBundle", "myPackage/nls/fr/myBundle", "myPackage/nls/fr-ca/myBundle"] + // Notice that bundles are returned least-specific to most-specific, starting with the root. + // + // If root===false indicates we're working with a pre-AMD i18n bundle that doesn't tell about the available locales; + // therefore, assume everything is available and get 404 errors that indicate a particular localization is not available + // + + for(var result= [bundlePath + bundleName], localeParts= locale.split("-"), current= "", i= 0; i<localeParts.length; i++){ + current+= (current ? "-" : "") + localeParts[i]; + if(!root || root[current]){ + result.push(bundlePath + current + "/" + bundleName); + } + } + return result; + }, + + cache= {}, + + getL10nName= dojo.getL10nName = function(moduleName, bundleName, locale){ + locale = locale ? locale.toLowerCase() : dojo.locale; + moduleName = "dojo/i18n!" + moduleName.replace(/\./g, "/"); + bundleName = bundleName.replace(/\./g, "/"); + return (/root/i.test(locale)) ? + (moduleName + "/nls/" + bundleName) : + (moduleName + "/nls/" + locale + "/" + bundleName); + }, + + doLoad = function(require, bundlePathAndName, bundlePath, bundleName, locale, load){ + // get the root bundle which instructs which other bundles are required to construct the localized bundle + require([bundlePathAndName], function(root){ + var current= lang.clone(root.root), + availableLocales= getAvailableLocales(!root._v1x && root, locale, bundlePath, bundleName); + require(availableLocales, function(){ + for (var i= 1; i<availableLocales.length; i++){ + current= lang.mixin(lang.clone(current), arguments[i]); + } + // target may not have been resolve (e.g., maybe only "fr" exists when "fr-ca" was requested) + var target= bundlePathAndName + "/" + locale; + cache[target]= current; + load(); + }); + }); + }, + + normalize = function(id, toAbsMid){ + // id may be relative + // preload has form *preload*<path>/nls/<module>*<flattened locales> and + // therefore never looks like a relative + return /^\./.test(id) ? toAbsMid(id) : id; + }, + + getLocalesToLoad = function(targetLocale){ + var list = config.extraLocale || []; + list = lang.isArray(list) ? list : [list]; + list.push(targetLocale); + return list; + }, + + load = function(id, require, load){ + // + // id is in one of the following formats + // + // 1. <path>/nls/<bundle> + // => load the bundle, localized to config.locale; load all bundles localized to + // config.extraLocale (if any); return the loaded bundle localized to config.locale. + // + // 2. <path>/nls/<locale>/<bundle> + // => load then return the bundle localized to <locale> + // + // 3. *preload*<path>/nls/<module>*<JSON array of available locales> + // => for config.locale and all config.extraLocale, load all bundles found + // in the best-matching bundle rollup. A value of 1 is returned, which + // is meaningless other than to say the plugin is executing the requested + // preloads + // + // In cases 1 and 2, <path> is always normalized to an absolute module id upon entry; see + // normalize. In case 3, it <path> is assumed to be absolue; this is arranged by the builder. + // + // To load a bundle means to insert the bundle into the plugin's cache and publish the bundle + // value to the loader. Given <path>, <bundle>, and a particular <locale>, the cache key + // + // <path>/nls/<bundle>/<locale> + // + // will hold the value. Similarly, then plugin will publish this value to the loader by + // + // define("<path>/nls/<bundle>/<locale>", <bundle-value>); + // + // Given this algorithm, other machinery can provide fast load paths be preplacing + // values in the plugin's cache, which is public. When a load is demanded the + // cache is inspected before starting any loading. Explicitly placing values in the plugin + // cache is an advanced/experimental feature that should not be needed; use at your own risk. + // + // For the normal AMD algorithm, the root bundle is loaded first, which instructs the + // plugin what additional localized bundles are required for a particular locale. These + // additional locales are loaded and a mix of the root and each progressively-specific + // locale is returned. For example: + // + // 1. The client demands "dojo/i18n!some/path/nls/someBundle + // + // 2. The loader demands load(some/path/nls/someBundle) + // + // 3. This plugin require's "some/path/nls/someBundle", which is the root bundle. + // + // 4. Assuming config.locale is "ab-cd-ef" and the root bundle indicates that localizations + // are available for "ab" and "ab-cd-ef" (note the missing "ab-cd", then the plugin + // requires "some/path/nls/ab/someBundle" and "some/path/nls/ab-cd-ef/someBundle" + // + // 5. Upon receiving all required bundles, the plugin constructs the value of the bundle + // ab-cd-ef as... + // + // mixin(mixin(mixin({}, require("some/path/nls/someBundle"), + // require("some/path/nls/ab/someBundle")), + // require("some/path/nls/ab-cd-ef/someBundle")); + // + // This value is inserted into the cache and published to the loader at the + // key/module-id some/path/nls/someBundle/ab-cd-ef. + // + // The special preload signature (case 3) instructs the plugin to stop servicing all normal requests + // (further preload requests will be serviced) until all ongoing preloading has completed. + // + // The preload signature instructs the plugin that a special rollup module is available that contains + // one or more flattened, localized bundles. The JSON array of available locales indicates which locales + // are available. Here is an example: + // + // *preload*some/path/nls/someModule*["root", "ab", "ab-cd-ef"] + // + // This indicates the following rollup modules are available: + // + // some/path/nls/someModule_ROOT + // some/path/nls/someModule_ab + // some/path/nls/someModule_ab-cd-ef + // + // Each of these modules is a normal AMD module that contains one or more flattened bundles in a hash. + // For example, assume someModule contained the bundles some/bundle/path/someBundle and + // some/bundle/path/someOtherBundle, then some/path/nls/someModule_ab would be expressed as folllows: + // + // define({ + // some/bundle/path/someBundle:<value of someBundle, flattened with respect to locale ab>, + // some/bundle/path/someOtherBundle:<value of someOtherBundle, flattened with respect to locale ab>, + // }); + // + // E.g., given this design, preloading for locale=="ab" can execute the following algorithm: + // + // require(["some/path/nls/someModule_ab"], function(rollup){ + // for(var p in rollup){ + // var id = p + "/ab", + // cache[id] = rollup[p]; + // define(id, rollup[p]); + // } + // }); + // + // Similarly, if "ab-cd" is requested, the algorithm can determine that "ab" is the best available and + // load accordingly. + // + // The builder will write such rollups for every layer if a non-empty localeList profile property is + // provided. Further, the builder will include the following cache entry in the cache associated with + // any layer. + // + // "*now":function(r){r(['dojo/i18n!*preload*<path>/nls/<module>*<JSON array of available locales>']);} + // + // The *now special cache module instructs the loader to apply the provided function to context-require + // with respect to the particular layer being defined. This causes the plugin to hold all normal service + // requests until all preloading is complete. + // + // Notice that this algorithm is rarely better than the standard AMD load algorithm. Consider the normal case + // where the target locale has a single segment and a layer depends on a single bundle: + // + // Without Preloads: + // + // 1. Layer loads root bundle. + // 2. bundle is demanded; plugin loads single localized bundle. + // + // With Preloads: + // + // 1. Layer causes preloading of target bundle. + // 2. bundle is demanded; service is delayed until preloading complete; bundle is returned. + // + // In each case a single transaction is required to load the target bundle. In cases where multiple bundles + // are required and/or the locale has multiple segments, preloads still requires a single transaction whereas + // the normal path requires an additional transaction for each additional bundle/locale-segment. However all + // of these additional transactions can be done concurrently. Owing to this analysis, the entire preloading + // algorithm can be discard during a build by setting the has feature dojo-preload-i18n-Api to false. + // + if(has("dojo-preload-i18n-Api")){ + var split = id.split("*"), + preloadDemand = split[1]=="preload"; + if(preloadDemand){ + if(!cache[id]){ + // use cache[id] to prevent multiple preloads of the same preload; this shouldn't happen, but + // who knows what over-aggressive human optimizers may attempt + cache[id] = 1; + preloadL10n(split[2], json.parse(split[3]), 1); + } + // don't stall the loader! + load(1); + } + if(preloadDemand || waitForPreloads(id, require, load)){ + return; + } + } + + var match= nlsRe.exec(id), + bundlePath= match[1] + "/", + bundleName= match[5] || match[4], + bundlePathAndName= bundlePath + bundleName, + localeSpecified = (match[5] && match[4]), + targetLocale= localeSpecified || dojo.locale, + loadTarget= bundlePathAndName + "/" + targetLocale, + loadList = localeSpecified ? [targetLocale] : getLocalesToLoad(targetLocale), + remaining = loadList.length, + finish = function(){ + if(!--remaining){ + load(lang.delegate(cache[loadTarget])); + } + }; + array.forEach(loadList, function(locale){ + var target = bundlePathAndName + "/" + locale; + if(has("dojo-preload-i18n-Api")){ + checkForLegacyModules(target); + } + if(!cache[target]){ + doLoad(require, bundlePathAndName, bundlePath, bundleName, locale, finish); + }else{ + finish(); + } + }); + }; + + if(has("dojo-unit-tests")){ + var unitTests = thisModule.unitTests = []; + } + + if(has("dojo-preload-i18n-Api") || 1){ + var normalizeLocale = thisModule.normalizeLocale= function(locale){ + var result = locale ? locale.toLowerCase() : dojo.locale; + return result == "root" ? "ROOT" : result; + }, + + isXd = function(mid){ + return (1 && 1) ? + require.isXdUrl(require.toUrl(mid + ".js")) : + true; + }, + + preloading = 0, + + preloadWaitQueue = [], + + preloadL10n = thisModule._preloadLocalizations = function(/*String*/bundlePrefix, /*Array*/localesGenerated, /*boolean*/ guaranteedAmdFormat){ + // summary: + // Load available flattened resource bundles associated with a particular module for dojo.locale and all dojo.config.extraLocale (if any) + // + // descirption: + // Only called by built layer files. The entire locale hierarchy is loaded. For example, + // if locale=="ab-cd", then ROOT, "ab", and "ab-cd" are loaded. This is different than v1.6- + // in that the v1.6- would lonly load ab-cd...which was *always* flattened. + // + // If guaranteedAmdFormat is true, then the module can be loaded with require thereby circumventing the detection algorithm + // and the extra possible extra transaction. + // + + function forEachLocale(locale, func){ + // given locale= "ab-cd-ef", calls func on "ab-cd-ef", "ab-cd", "ab", "ROOT"; stops calling the first time func returns truthy + var parts = locale.split("-"); + while(parts.length){ + if(func(parts.join("-"))){ + return true; + } + parts.pop(); + } + return func("ROOT"); + } + + function preload(locale){ + locale = normalizeLocale(locale); + forEachLocale(locale, function(loc){ + if(array.indexOf(localesGenerated, loc)>=0){ + var mid = bundlePrefix.replace(/\./g, "/")+"_"+loc; + preloading++; + (isXd(mid) || guaranteedAmdFormat ? require : syncRequire)([mid], function(rollup){ + for(var p in rollup){ + cache[p + "/" + locale] = rollup[p]; + } + --preloading; + while(!preloading && preloadWaitQueue.length){ + load.apply(null, preloadWaitQueue.shift()); + } + }); + return true; + } + return false; + }); + } + + preload(); + array.forEach(dojo.config.extraLocale, preload); + }, + + waitForPreloads = function(id, require, load){ + if(preloading){ + preloadWaitQueue.push([id, require, load]); + } + return preloading; + }; + } + + if(1){ + // this code path assumes the dojo loader and won't work with a standard AMD loader + var evalBundle= + // use the function ctor to keep the minifiers away (also come close to global scope, but this is secondary) + new Function( + "__bundle", // the bundle to evalutate + "__checkForLegacyModules", // a function that checks if __bundle defined __mid in the global space + "__mid", // the mid that __bundle is intended to define + + // returns one of: + // 1 => the bundle was an AMD bundle + // a legacy bundle object that is the value of __mid + // instance of Error => could not figure out how to evaluate bundle + + // used to detect when __bundle calls define + "var define = function(){define.called = 1;}," + + " require = function(){define.called = 1;};" + + + "try{" + + "define.called = 0;" + + "eval(__bundle);" + + "if(define.called==1)" + // bundle called define; therefore signal it's an AMD bundle + + "return 1;" + + + "if((__checkForLegacyModules = __checkForLegacyModules(__mid)))" + // bundle was probably a v1.6- built NLS flattened NLS bundle that defined __mid in the global space + + "return __checkForLegacyModules;" + + + "}catch(e){}" + // evaulating the bundle was *neither* an AMD *nor* a legacy flattened bundle + // either way, re-eval *after* surrounding with parentheses + + + "try{" + + "return eval('('+__bundle+')');" + + "}catch(e){" + + "return e;" + + "}" + ), + + syncRequire= function(deps, callback){ + var results= []; + array.forEach(deps, function(mid){ + var url= require.toUrl(mid + ".js"); + + function load(text){ + var result = evalBundle(text, checkForLegacyModules, mid); + if(result===1){ + // the bundle was an AMD module; re-inject it through the normal AMD path + // we gotta do this since it could be an anonymous module and simply evaluating + // the text here won't provide the loader with the context to know what + // module is being defined()'d. With browser caching, this should be free; further + // this entire code path can be circumvented by using the AMD format to begin with + require([mid], function(bundle){ + results.push(cache[url]= bundle); + }); + }else{ + if(result instanceof Error){ + console.error("failed to evaluate i18n bundle; url=" + url, result); + result = {}; + } + // nls/<locale>/<bundle-name> indicates not the root. + results.push(cache[url] = (/nls\/[^\/]+\/[^\/]+$/.test(url) ? result : {root:result, _v1x:1})); + } + } + + if(cache[url]){ + results.push(cache[url]); + }else{ + var bundle= require.syncLoadNls(mid); + // don't need to check for legacy since syncLoadNls returns a module if the module + // (1) was already loaded, or (2) was in the cache. In case 1, if syncRequire is called + // from getLocalization --> load, then load will have called checkForLegacyModules() before + // calling syncRequire; if syncRequire is called from preloadLocalizations, then we + // don't care about checkForLegacyModules() because that will be done when a particular + // bundle is actually demanded. In case 2, checkForLegacyModules() is never relevant + // because cached modules are always v1.7+ built modules. + if(bundle){ + results.push(bundle); + }else{ + if(!xhr){ + try{ + require.getText(url, true, load); + }catch(e){ + results.push(cache[url]= {}); + } + }else{ + xhr.get({ + url:url, + sync:true, + load:load, + error:function(){ + results.push(cache[url]= {}); + } + }); + } + } + } + }); + callback && callback.apply(null, results); + }, + + checkForLegacyModules = function(target){ + // legacy code may have already loaded [e.g] the raw bundle x/y/z at x.y.z; when true, push into the cache + for(var result, names = target.split("/"), object = dojo.global[names[0]], i = 1; object && i<names.length-1; object = object[names[i++]]){} + if(object){ + result = object[names[i]]; + if(!result){ + // fallback for incorrect bundle build of 1.6 + result = object[names[i].replace(/-/g,"_")]; + } + if(result){ + cache[target] = result; + } + } + return result; + }; + + thisModule.getLocalization= function(moduleName, bundleName, locale){ + var result, + l10nName= getL10nName(moduleName, bundleName, locale).substring(10); + load(l10nName, (!isXd(l10nName) ? syncRequire : require), function(result_){ result= result_; }); + return result; + }; + + if(has("dojo-unit-tests")){ + unitTests.push(function(doh){ + doh.register("tests.i18n.unit", function(t){ + var check; + + check = evalBundle("{prop:1}"); + t.is({prop:1}, check); t.is(undefined, check[1]); + + check = evalBundle("({prop:1})"); + t.is({prop:1}, check); t.is(undefined, check[1]); + + check = evalBundle("{'prop-x':1}"); + t.is({'prop-x':1}, check); t.is(undefined, check[1]); + + check = evalBundle("({'prop-x':1})"); + t.is({'prop-x':1}, check); t.is(undefined, check[1]); + + check = evalBundle("define({'prop-x':1})"); + t.is(1, check); + + check = evalBundle("this is total nonsense and should throw an error"); + t.is(check instanceof Error, true); + }); + }); + } + } + + return lang.mixin(thisModule, { + dynamic:true, + normalize:normalize, + load:load, + cache:cache + }); +}); diff --git a/lib/dojo/io-query.js b/lib/dojo/io-query.js new file mode 100644 index 00000000..91f2e74d --- /dev/null +++ b/lib/dojo/io-query.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/io-query",["./_base/lang"],function(_1){var _2={};function _3(_4){var _5=encodeURIComponent,_6=[];for(var _7 in _4){var _8=_4[_7];if(_8!=_2[_7]){var _9=_5(_7)+"=";if(_1.isArray(_8)){for(var i=0,l=_8.length;i<l;++i){_6.push(_9+_5(_8[i]));}}else{_6.push(_9+_5(_8));}}}return _6.join("&");};function _a(_b){var _c=decodeURIComponent,qp=_b.split("&"),_d={},_e,_f;for(var i=0,l=qp.length,_10;i<l;++i){_10=qp[i];if(_10.length){var s=_10.indexOf("=");if(s<0){_e=_c(_10);_f="";}else{_e=_c(_10.slice(0,s));_f=_c(_10.slice(s+1));}if(typeof _d[_e]=="string"){_d[_e]=[_d[_e]];}if(_1.isArray(_d[_e])){_d[_e].push(_f);}else{_d[_e]=_f;}}}return _d;};return {objectToQuery:_3,queryToObject:_a};}); \ No newline at end of file diff --git a/lib/dojo/io-query.js.uncompressed.js b/lib/dojo/io-query.js.uncompressed.js new file mode 100644 index 00000000..a5799bfc --- /dev/null +++ b/lib/dojo/io-query.js.uncompressed.js @@ -0,0 +1,98 @@ +define("dojo/io-query", ["./_base/lang"], function(lang){ + // module: + // dojo/io-query + // summary: + // This module defines query string processing functions. + + var backstop = {}; + + function objectToQuery(/*Object*/ map){ + // summary: + // takes a name/value mapping object and returns a string representing + // a URL-encoded version of that object. + // example: + // this object: + // + // | { + // | blah: "blah", + // | multi: [ + // | "thud", + // | "thonk" + // | ] + // | }; + // + // yields the following query string: + // + // | "blah=blah&multi=thud&multi=thonk" + + // FIXME: need to implement encodeAscii!! + var enc = encodeURIComponent, pairs = []; + for(var name in map){ + var value = map[name]; + if(value != backstop[name]){ + var assign = enc(name) + "="; + if(lang.isArray(value)){ + for(var i = 0, l = value.length; i < l; ++i){ + pairs.push(assign + enc(value[i])); + } + }else{ + pairs.push(assign + enc(value)); + } + } + } + return pairs.join("&"); // String + } + + function queryToObject(/*String*/ str){ + // summary: + // Create an object representing a de-serialized query section of a + // URL. Query keys with multiple values are returned in an array. + // + // example: + // This string: + // + // | "foo=bar&foo=baz&thinger=%20spaces%20=blah&zonk=blarg&" + // + // results in this object structure: + // + // | { + // | foo: [ "bar", "baz" ], + // | thinger: " spaces =blah", + // | zonk: "blarg" + // | } + // + // Note that spaces and other urlencoded entities are correctly + // handled. + + // FIXME: should we grab the URL string if we're not passed one? + var dec = decodeURIComponent, qp = str.split("&"), ret = {}, name, val; + for(var i = 0, l = qp.length, item; i < l; ++i){ + item = qp[i]; + if(item.length){ + var s = item.indexOf("="); + if(s < 0){ + name = dec(item); + val = ""; + }else{ + name = dec(item.slice(0, s)); + val = dec(item.slice(s + 1)); + } + if(typeof ret[name] == "string"){ // inline'd type check + ret[name] = [ret[name]]; + } + + if(lang.isArray(ret[name])){ + ret[name].push(val); + }else{ + ret[name] = val; + } + } + } + return ret; // Object + } + + return { + objectToQuery: objectToQuery, + queryToObject: queryToObject + }; +}); \ No newline at end of file diff --git a/lib/dojo/io/iframe.js b/lib/dojo/io/iframe.js index aa8ddf29..9db3fbcf 100644 --- a/lib/dojo/io/iframe.js +++ b/lib/dojo/io/iframe.js @@ -4,380 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.io.iframe"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.io.iframe"] = true; -dojo.provide("dojo.io.iframe"); - -dojo.getObject("io", true, dojo); - -/*===== -dojo.declare("dojo.io.iframe.__ioArgs", dojo.__IoArgs, { - constructor: function(){ - // summary: - // All the properties described in the dojo.__ioArgs type, apply - // to this type. The following additional properties are allowed - // for dojo.io.iframe.send(): - // method: String? - // The HTTP method to use. "GET" or "POST" are the only supported - // values. It will try to read the value from the form node's - // method, then try this argument. If neither one exists, then it - // defaults to POST. - // handleAs: String? - // Specifies what format the result data should be given to the - // load/handle callback. Valid values are: text, html, xml, json, - // javascript. IMPORTANT: For all values EXCEPT html and xml, The - // server response should be an HTML file with a textarea element. - // The response data should be inside the textarea element. Using an - // HTML document the only reliable, cross-browser way this - // transport can know when the response has loaded. For the html - // handleAs value, just return a normal HTML document. NOTE: xml - // is now supported with this transport (as of 1.1+); a known issue - // is if the XML document in question is malformed, Internet Explorer - // will throw an uncatchable error. - // content: Object? - // If "form" is one of the other args properties, then the content - // object properties become hidden form form elements. For - // instance, a content object of {name1 : "value1"} is converted - // to a hidden form element with a name of "name1" and a value of - // "value1". If there is not a "form" property, then the content - // object is converted into a name=value&name=value string, by - // using dojo.objectToQuery(). - this.method = method; - this.handleAs = handleAs; - this.content = content; - } -}); -=====*/ - -dojo.io.iframe = { - // summary: - // Sends an Ajax I/O call using and Iframe (for instance, to upload files) - - create: function(/*String*/fname, /*String*/onloadstr, /*String?*/uri){ - // summary: - // Creates a hidden iframe in the page. Used mostly for IO - // transports. You do not need to call this to start a - // dojo.io.iframe request. Just call send(). - // fname: String - // The name of the iframe. Used for the name attribute on the - // iframe. - // onloadstr: String - // A string of JavaScript that will be executed when the content - // in the iframe loads. - // uri: String - // The value of the src attribute on the iframe element. If a - // value is not given, then dojo/resources/blank.html will be - // used. - if(window[fname]){ return window[fname]; } - if(window.frames[fname]){ return window.frames[fname]; } - var cframe = null; - var turi = uri; - if(!turi){ - if(dojo.config["useXDomain"] && !dojo.config["dojoBlankHtmlUrl"]){ - console.warn("dojo.io.iframe.create: When using cross-domain Dojo builds," - + " please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl" - + " to the path on your domain to blank.html"); - } - turi = (dojo.config["dojoBlankHtmlUrl"]||dojo.moduleUrl("dojo", "resources/blank.html")); - } - var cframe = dojo.place( - '<iframe id="'+fname+'" name="'+fname+'" src="'+turi+'" onload="'+onloadstr+ - '" style="position: absolute; left: 1px; top: 1px; height: 1px; width: 1px; visibility: hidden">', - dojo.body()); - - window[fname] = cframe; - - return cframe; - }, - - setSrc: function(/*DOMNode*/iframe, /*String*/src, /*Boolean*/replace){ - //summary: - // Sets the URL that is loaded in an IFrame. The replace parameter - // indicates whether location.replace() should be used when - // changing the location of the iframe. - try{ - if(!replace){ - if(dojo.isWebKit){ - iframe.location = src; - }else{ - frames[iframe.name].location = src; - } - }else{ - // Fun with DOM 0 incompatibilities! - var idoc; - if(dojo.isIE || dojo.isWebKit){ - idoc = iframe.contentWindow.document; - }else{ // if(d.isMozilla){ - idoc = iframe.contentWindow; - } - - //For Safari (at least 2.0.3) and Opera, if the iframe - //has just been created but it doesn't have content - //yet, then iframe.document may be null. In that case, - //use iframe.location and return. - if(!idoc){ - iframe.location = src; - return; - }else{ - idoc.location.replace(src); - } - } - }catch(e){ - console.log("dojo.io.iframe.setSrc: ", e); - } - }, - - doc: function(/*DOMNode*/iframeNode){ - //summary: Returns the document object associated with the iframe DOM Node argument. - var doc = iframeNode.contentDocument || // W3 - ( - ( - (iframeNode.name) && (iframeNode.document) && - (dojo.doc.getElementsByTagName("iframe")[iframeNode.name].contentWindow) && - (dojo.doc.getElementsByTagName("iframe")[iframeNode.name].contentWindow.document) - ) - ) || // IE - ( - (iframeNode.name)&&(dojo.doc.frames[iframeNode.name])&& - (dojo.doc.frames[iframeNode.name].document) - ) || null; - return doc; - }, - - send: function(/*dojo.io.iframe.__ioArgs*/args){ - //summary: - // Function that sends the request to the server. - // This transport can only process one send() request at a time, so if send() is called - //multiple times, it will queue up the calls and only process one at a time. - if(!this["_frame"]){ - this._frame = this.create(this._iframeName, dojo._scopeName + ".io.iframe._iframeOnload();"); - } - - //Set up the deferred. - var dfd = dojo._ioSetArgs( - args, - function(/*Deferred*/dfd){ - //summary: canceller function for dojo._ioSetArgs call. - dfd.canceled = true; - dfd.ioArgs._callNext(); - }, - function(/*Deferred*/dfd){ - //summary: okHandler function for dojo._ioSetArgs call. - var value = null; - try{ - var ioArgs = dfd.ioArgs; - var dii = dojo.io.iframe; - var ifd = dii.doc(dii._frame); - var handleAs = ioArgs.handleAs; - - //Assign correct value based on handleAs value. - value = ifd; //html - if(handleAs != "html"){ - if(handleAs == "xml"){ - // FF, Saf 3+ and Opera all seem to be fine with ifd being xml. We have to - // do it manually for IE6-8. Refs #6334. - if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){ - dojo.query("a", dii._frame.contentWindow.document.documentElement).orphan(); - var xmlText=(dii._frame.contentWindow.document).documentElement.innerText; - xmlText=xmlText.replace(/>\s+</g, "><"); - xmlText=dojo.trim(xmlText); - //Reusing some code in base dojo for handling XML content. Simpler and keeps - //Core from duplicating the effort needed to locate the XML Parser on IE. - var fauxXhr = { responseText: xmlText }; - value = dojo._contentHandlers["xml"](fauxXhr); // DOMDocument - } - }else{ - value = ifd.getElementsByTagName("textarea")[0].value; //text - if(handleAs == "json"){ - value = dojo.fromJson(value); //json - }else if(handleAs == "javascript"){ - value = dojo.eval(value); //javascript - } - } - } - }catch(e){ - value = e; - }finally{ - ioArgs._callNext(); - } - return value; - }, - function(/*Error*/error, /*Deferred*/dfd){ - //summary: errHandler function for dojo._ioSetArgs call. - dfd.ioArgs._hasError = true; - dfd.ioArgs._callNext(); - return error; - } - ); - - //Set up a function that will fire the next iframe request. Make sure it only - //happens once per deferred. - dfd.ioArgs._callNext = function(){ - if(!this["_calledNext"]){ - this._calledNext = true; - dojo.io.iframe._currentDfd = null; - dojo.io.iframe._fireNextRequest(); - } - }; - - this._dfdQueue.push(dfd); - this._fireNextRequest(); - - //Add it the IO watch queue, to get things like timeout support. - dojo._ioWatch( - dfd, - function(/*Deferred*/dfd){ - //validCheck - return !dfd.ioArgs["_hasError"]; - }, - function(dfd){ - //ioCheck - return (!!dfd.ioArgs["_finished"]); - }, - function(dfd){ - //resHandle - if(dfd.ioArgs._finished){ - dfd.callback(dfd); - }else{ - dfd.errback(new Error("Invalid dojo.io.iframe request state")); - } - } - ); - - return dfd; - }, - - _currentDfd: null, - _dfdQueue: [], - _iframeName: dojo._scopeName + "IoIframe", - - _fireNextRequest: function(){ - //summary: Internal method used to fire the next request in the bind queue. - try{ - if((this._currentDfd)||(this._dfdQueue.length == 0)){ return; } - //Find next deferred, skip the canceled ones. - do{ - var dfd = this._currentDfd = this._dfdQueue.shift(); - } while(dfd && dfd.canceled && this._dfdQueue.length); - - //If no more dfds, cancel. - if(!dfd || dfd.canceled){ - this._currentDfd = null; - return; - } - - var ioArgs = dfd.ioArgs; - var args = ioArgs.args; - - ioArgs._contentToClean = []; - var fn = dojo.byId(args["form"]); - var content = args["content"] || {}; - if(fn){ - if(content){ - // if we have things in content, we need to add them to the form - // before submission - var pHandler = function(name, value) { - dojo.create("input", {type: "hidden", name: name, value: value}, fn); - ioArgs._contentToClean.push(name); - }; - for(var x in content){ - var val = content[x]; - if(dojo.isArray(val) && val.length > 1){ - var i; - for (i = 0; i < val.length; i++) { - pHandler(x,val[i]); - } - }else{ - if(!fn[x]){ - pHandler(x,val); - }else{ - fn[x].value = val; - } - } - } - } - //IE requires going through getAttributeNode instead of just getAttribute in some form cases, - //so use it for all. See #2844 - var actnNode = fn.getAttributeNode("action"); - var mthdNode = fn.getAttributeNode("method"); - var trgtNode = fn.getAttributeNode("target"); - if(args["url"]){ - ioArgs._originalAction = actnNode ? actnNode.value : null; - if(actnNode){ - actnNode.value = args.url; - }else{ - fn.setAttribute("action",args.url); - } - } - if(!mthdNode || !mthdNode.value){ - if(mthdNode){ - mthdNode.value= (args["method"]) ? args["method"] : "post"; - }else{ - fn.setAttribute("method", (args["method"]) ? args["method"] : "post"); - } - } - ioArgs._originalTarget = trgtNode ? trgtNode.value: null; - if(trgtNode){ - trgtNode.value = this._iframeName; - }else{ - fn.setAttribute("target", this._iframeName); - } - fn.target = this._iframeName; - dojo._ioNotifyStart(dfd); - fn.submit(); - }else{ - // otherwise we post a GET string by changing URL location for the - // iframe - var tmpUrl = args.url + (args.url.indexOf("?") > -1 ? "&" : "?") + ioArgs.query; - dojo._ioNotifyStart(dfd); - this.setSrc(this._frame, tmpUrl, true); - } - }catch(e){ - dfd.errback(e); - } - }, - - _iframeOnload: function(){ - var dfd = this._currentDfd; - if(!dfd){ - this._fireNextRequest(); - return; - } - - var ioArgs = dfd.ioArgs; - var args = ioArgs.args; - var fNode = dojo.byId(args.form); - - if(fNode){ - // remove all the hidden content inputs - var toClean = ioArgs._contentToClean; - for(var i = 0; i < toClean.length; i++) { - var key = toClean[i]; - //Need to cycle over all nodes since we may have added - //an array value which means that more than one node could - //have the same .name value. - for(var j = 0; j < fNode.childNodes.length; j++){ - var chNode = fNode.childNodes[j]; - if(chNode.name == key){ - dojo.destroy(chNode); - break; - } - } - } - - // restore original action + target - if(ioArgs["_originalAction"]){ - fNode.setAttribute("action", ioArgs._originalAction); - } - if(ioArgs["_originalTarget"]){ - fNode.setAttribute("target", ioArgs._originalTarget); - fNode.target = ioArgs._originalTarget; - } - } - - ioArgs._finished = true; - } -}; - -} +//>>built +define("dojo/io/iframe",["../main","require"],function(_1,_2){_1.getObject("io",true,_1);_1.io.iframe={create:function(_3,_4,_5){if(window[_3]){return window[_3];}if(window.frames[_3]){return window.frames[_3];}var _6=_5;if(!_6){if(_1.config["useXDomain"]&&!_1.config["dojoBlankHtmlUrl"]){console.warn("dojo.io.iframe.create: When using cross-domain Dojo builds,"+" please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl"+" to the path on your domain to blank.html");}_6=(_1.config["dojoBlankHtmlUrl"]||_2.toUrl("../resources/blank.html"));}var _7=_1.place("<iframe id=\""+_3+"\" name=\""+_3+"\" src=\""+_6+"\" onload=\""+_4+"\" style=\"position: absolute; left: 1px; top: 1px; height: 1px; width: 1px; visibility: hidden\">",_1.body());window[_3]=_7;return _7;},setSrc:function(_8,_9,_a){try{if(!_a){if(_1.isWebKit){_8.location=_9;}else{frames[_8.name].location=_9;}}else{var _b;if(_1.isIE||_1.isWebKit){_b=_8.contentWindow.document;}else{_b=_8.contentWindow;}if(!_b){_8.location=_9;}else{_b.location.replace(_9);}}}catch(e){}},doc:function(_c){return _c.contentDocument||(((_c.name)&&(_c.document)&&(_1.doc.getElementsByTagName("iframe")[_c.name].contentWindow)&&(_1.doc.getElementsByTagName("iframe")[_c.name].contentWindow.document)))||((_c.name)&&(_1.doc.frames[_c.name])&&(_1.doc.frames[_c.name].document))||null;},send:function(_d){if(!this["_frame"]){this._frame=this.create(this._iframeName,_1._scopeName+".io.iframe._iframeOnload();");}var _e=_1._ioSetArgs(_d,function(_f){_f.canceled=true;_f.ioArgs._callNext();},function(dfd){var _10=null;try{var _11=dfd.ioArgs;var dii=_1.io.iframe;var ifd=dii.doc(dii._frame);var _12=_11.handleAs;_10=ifd;if(_12!="html"){if(_12=="xml"){if(_1.isIE<9||(_1.isIE&&_1.isQuirks)){_1.query("a",dii._frame.contentWindow.document.documentElement).orphan();var _13=(dii._frame.contentWindow.document).documentElement.innerText;_13=_13.replace(/>\s+</g,"><");_13=_1.trim(_13);var _14={responseText:_13};_10=_1._contentHandlers["xml"](_14);}}else{_10=ifd.getElementsByTagName("textarea")[0].value;if(_12=="json"){_10=_1.fromJson(_10);}else{if(_12=="javascript"){_10=_1.eval(_10);}}}}}catch(e){_10=e;}finally{_11._callNext();}return _10;},function(_15,dfd){dfd.ioArgs._hasError=true;dfd.ioArgs._callNext();return _15;});_e.ioArgs._callNext=function(){if(!this["_calledNext"]){this._calledNext=true;_1.io.iframe._currentDfd=null;_1.io.iframe._fireNextRequest();}};this._dfdQueue.push(_e);this._fireNextRequest();_1._ioWatch(_e,function(dfd){return !dfd.ioArgs["_hasError"];},function(dfd){return (!!dfd.ioArgs["_finished"]);},function(dfd){if(dfd.ioArgs._finished){dfd.callback(dfd);}else{dfd.errback(new Error("Invalid dojo.io.iframe request state"));}});return _e;},_currentDfd:null,_dfdQueue:[],_iframeName:_1._scopeName+"IoIframe",_fireNextRequest:function(){try{if((this._currentDfd)||(this._dfdQueue.length==0)){return;}do{var dfd=this._currentDfd=this._dfdQueue.shift();}while(dfd&&dfd.canceled&&this._dfdQueue.length);if(!dfd||dfd.canceled){this._currentDfd=null;return;}var _16=dfd.ioArgs;var _17=_16.args;_16._contentToClean=[];var fn=_1.byId(_17["form"]);var _18=_17["content"]||{};if(fn){if(_18){var _19=function(_1a,_1b){_1.create("input",{type:"hidden",name:_1a,value:_1b},fn);_16._contentToClean.push(_1a);};for(var x in _18){var val=_18[x];if(_1.isArray(val)&&val.length>1){var i;for(i=0;i<val.length;i++){_19(x,val[i]);}}else{if(!fn[x]){_19(x,val);}else{fn[x].value=val;}}}}var _1c=fn.getAttributeNode("action");var _1d=fn.getAttributeNode("method");var _1e=fn.getAttributeNode("target");if(_17["url"]){_16._originalAction=_1c?_1c.value:null;if(_1c){_1c.value=_17.url;}else{fn.setAttribute("action",_17.url);}}if(!_1d||!_1d.value){if(_1d){_1d.value=(_17["method"])?_17["method"]:"post";}else{fn.setAttribute("method",(_17["method"])?_17["method"]:"post");}}_16._originalTarget=_1e?_1e.value:null;if(_1e){_1e.value=this._iframeName;}else{fn.setAttribute("target",this._iframeName);}fn.target=this._iframeName;_1._ioNotifyStart(dfd);fn.submit();}else{var _1f=_17.url+(_17.url.indexOf("?")>-1?"&":"?")+_16.query;_1._ioNotifyStart(dfd);this.setSrc(this._frame,_1f,true);}}catch(e){dfd.errback(e);}},_iframeOnload:function(){var dfd=this._currentDfd;if(!dfd){this._fireNextRequest();return;}var _20=dfd.ioArgs;var _21=_20.args;var _22=_1.byId(_21.form);if(_22){var _23=_20._contentToClean;for(var i=0;i<_23.length;i++){var key=_23[i];for(var j=0;j<_22.childNodes.length;j++){var _24=_22.childNodes[j];if(_24.name==key){_1.destroy(_24);break;}}}if(_20["_originalAction"]){_22.setAttribute("action",_20._originalAction);}if(_20["_originalTarget"]){_22.setAttribute("target",_20._originalTarget);_22.target=_20._originalTarget;}}_20._finished=true;}};return _1.io.iframe;}); \ No newline at end of file diff --git a/lib/dojo/io/iframe.js.uncompressed.js b/lib/dojo/io/iframe.js.uncompressed.js new file mode 100644 index 00000000..9ac94827 --- /dev/null +++ b/lib/dojo/io/iframe.js.uncompressed.js @@ -0,0 +1,376 @@ +define("dojo/io/iframe", ["../main", "require"], function(dojo, require) { + // module: + // dojo/io/iframe + // summary: + // TODOC + +dojo.getObject("io", true, dojo); + +/*===== +dojo.declare("dojo.io.iframe.__ioArgs", dojo.__IoArgs, { + constructor: function(){ + // summary: + // All the properties described in the dojo.__ioArgs type, apply + // to this type. The following additional properties are allowed + // for dojo.io.iframe.send(): + // method: String? + // The HTTP method to use. "GET" or "POST" are the only supported + // values. It will try to read the value from the form node's + // method, then try this argument. If neither one exists, then it + // defaults to POST. + // handleAs: String? + // Specifies what format the result data should be given to the + // load/handle callback. Valid values are: text, html, xml, json, + // javascript. IMPORTANT: For all values EXCEPT html and xml, The + // server response should be an HTML file with a textarea element. + // The response data should be inside the textarea element. Using an + // HTML document the only reliable, cross-browser way this + // transport can know when the response has loaded. For the html + // handleAs value, just return a normal HTML document. NOTE: xml + // is now supported with this transport (as of 1.1+); a known issue + // is if the XML document in question is malformed, Internet Explorer + // will throw an uncatchable error. + // content: Object? + // If "form" is one of the other args properties, then the content + // object properties become hidden form form elements. For + // instance, a content object of {name1 : "value1"} is converted + // to a hidden form element with a name of "name1" and a value of + // "value1". If there is not a "form" property, then the content + // object is converted into a name=value&name=value string, by + // using dojo.objectToQuery(). + this.method = method; + this.handleAs = handleAs; + this.content = content; + } +}); +=====*/ + +dojo.io.iframe = { + // summary: + // Sends an Ajax I/O call using and Iframe (for instance, to upload files) + + create: function(/*String*/fname, /*String*/onloadstr, /*String?*/uri){ + // summary: + // Creates a hidden iframe in the page. Used mostly for IO + // transports. You do not need to call this to start a + // dojo.io.iframe request. Just call send(). + // fname: String + // The name of the iframe. Used for the name attribute on the + // iframe. + // onloadstr: String + // A string of JavaScript that will be executed when the content + // in the iframe loads. + // uri: String + // The value of the src attribute on the iframe element. If a + // value is not given, then dojo/resources/blank.html will be + // used. + if(window[fname]){ return window[fname]; } + if(window.frames[fname]){ return window.frames[fname]; } + var turi = uri; + if(!turi){ + if(dojo.config["useXDomain"] && !dojo.config["dojoBlankHtmlUrl"]){ + console.warn("dojo.io.iframe.create: When using cross-domain Dojo builds," + + " please save dojo/resources/blank.html to your domain and set djConfig.dojoBlankHtmlUrl" + + " to the path on your domain to blank.html"); + } + turi = (dojo.config["dojoBlankHtmlUrl"]||require.toUrl("../resources/blank.html")); + } + var cframe = dojo.place( + '<iframe id="'+fname+'" name="'+fname+'" src="'+turi+'" onload="'+onloadstr+ + '" style="position: absolute; left: 1px; top: 1px; height: 1px; width: 1px; visibility: hidden">', + dojo.body()); + + window[fname] = cframe; + + return cframe; + }, + + setSrc: function(/*DOMNode*/iframe, /*String*/src, /*Boolean*/replace){ + //summary: + // Sets the URL that is loaded in an IFrame. The replace parameter + // indicates whether location.replace() should be used when + // changing the location of the iframe. + try{ + if(!replace){ + if(dojo.isWebKit){ + iframe.location = src; + }else{ + frames[iframe.name].location = src; + } + }else{ + // Fun with DOM 0 incompatibilities! + var idoc; + if(dojo.isIE || dojo.isWebKit){ + idoc = iframe.contentWindow.document; + }else{ // if(d.isMozilla){ + idoc = iframe.contentWindow; + } + + //For Safari (at least 2.0.3) and Opera, if the iframe + //has just been created but it doesn't have content + //yet, then iframe.document may be null. In that case, + //use iframe.location and return. + if(!idoc){ + iframe.location = src; + }else{ + idoc.location.replace(src); + } + } + }catch(e){ + console.log("dojo.io.iframe.setSrc: ", e); + } + }, + + doc: function(/*DOMNode*/iframeNode){ + //summary: Returns the document object associated with the iframe DOM Node argument. + return iframeNode.contentDocument || // W3 + ( + ( + (iframeNode.name) && (iframeNode.document) && + (dojo.doc.getElementsByTagName("iframe")[iframeNode.name].contentWindow) && + (dojo.doc.getElementsByTagName("iframe")[iframeNode.name].contentWindow.document) + ) + ) || // IE + ( + (iframeNode.name)&&(dojo.doc.frames[iframeNode.name])&& + (dojo.doc.frames[iframeNode.name].document) + ) || null; + }, + + send: function(/*dojo.io.iframe.__ioArgs*/args){ + //summary: + // Function that sends the request to the server. + // This transport can only process one send() request at a time, so if send() is called + //multiple times, it will queue up the calls and only process one at a time. + if(!this["_frame"]){ + this._frame = this.create(this._iframeName, dojo._scopeName + ".io.iframe._iframeOnload();"); + } + + //Set up the deferred. + var dfd = dojo._ioSetArgs( + args, + function(/*Deferred*/dfd){ + //summary: canceller function for dojo._ioSetArgs call. + dfd.canceled = true; + dfd.ioArgs._callNext(); + }, + function(/*Deferred*/dfd){ + //summary: okHandler function for dojo._ioSetArgs call. + var value = null; + try{ + var ioArgs = dfd.ioArgs; + var dii = dojo.io.iframe; + var ifd = dii.doc(dii._frame); + var handleAs = ioArgs.handleAs; + + //Assign correct value based on handleAs value. + value = ifd; //html + if(handleAs != "html"){ + if(handleAs == "xml"){ + // FF, Saf 3+ and Opera all seem to be fine with ifd being xml. We have to + // do it manually for IE6-8. Refs #6334. + if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){ + dojo.query("a", dii._frame.contentWindow.document.documentElement).orphan(); + var xmlText=(dii._frame.contentWindow.document).documentElement.innerText; + xmlText=xmlText.replace(/>\s+</g, "><"); + xmlText=dojo.trim(xmlText); + //Reusing some code in base dojo for handling XML content. Simpler and keeps + //Core from duplicating the effort needed to locate the XML Parser on IE. + var fauxXhr = { responseText: xmlText }; + value = dojo._contentHandlers["xml"](fauxXhr); // DOMDocument + } + }else{ + value = ifd.getElementsByTagName("textarea")[0].value; //text + if(handleAs == "json"){ + value = dojo.fromJson(value); //json + }else if(handleAs == "javascript"){ + value = dojo.eval(value); //javascript + } + } + } + }catch(e){ + value = e; + }finally{ + ioArgs._callNext(); + } + return value; + }, + function(/*Error*/error, /*Deferred*/dfd){ + //summary: errHandler function for dojo._ioSetArgs call. + dfd.ioArgs._hasError = true; + dfd.ioArgs._callNext(); + return error; + } + ); + + //Set up a function that will fire the next iframe request. Make sure it only + //happens once per deferred. + dfd.ioArgs._callNext = function(){ + if(!this["_calledNext"]){ + this._calledNext = true; + dojo.io.iframe._currentDfd = null; + dojo.io.iframe._fireNextRequest(); + } + }; + + this._dfdQueue.push(dfd); + this._fireNextRequest(); + + //Add it the IO watch queue, to get things like timeout support. + dojo._ioWatch( + dfd, + function(/*Deferred*/dfd){ + //validCheck + return !dfd.ioArgs["_hasError"]; + }, + function(dfd){ + //ioCheck + return (!!dfd.ioArgs["_finished"]); + }, + function(dfd){ + //resHandle + if(dfd.ioArgs._finished){ + dfd.callback(dfd); + }else{ + dfd.errback(new Error("Invalid dojo.io.iframe request state")); + } + } + ); + + return dfd; + }, + + _currentDfd: null, + _dfdQueue: [], + _iframeName: dojo._scopeName + "IoIframe", + + _fireNextRequest: function(){ + //summary: Internal method used to fire the next request in the bind queue. + try{ + if((this._currentDfd)||(this._dfdQueue.length == 0)){ return; } + //Find next deferred, skip the canceled ones. + do{ + var dfd = this._currentDfd = this._dfdQueue.shift(); + } while(dfd && dfd.canceled && this._dfdQueue.length); + + //If no more dfds, cancel. + if(!dfd || dfd.canceled){ + this._currentDfd = null; + return; + } + + var ioArgs = dfd.ioArgs; + var args = ioArgs.args; + + ioArgs._contentToClean = []; + var fn = dojo.byId(args["form"]); + var content = args["content"] || {}; + if(fn){ + if(content){ + // if we have things in content, we need to add them to the form + // before submission + var pHandler = function(name, value) { + dojo.create("input", {type: "hidden", name: name, value: value}, fn); + ioArgs._contentToClean.push(name); + }; + for(var x in content){ + var val = content[x]; + if(dojo.isArray(val) && val.length > 1){ + var i; + for (i = 0; i < val.length; i++) { + pHandler(x,val[i]); + } + }else{ + if(!fn[x]){ + pHandler(x,val); + }else{ + fn[x].value = val; + } + } + } + } + //IE requires going through getAttributeNode instead of just getAttribute in some form cases, + //so use it for all. See #2844 + var actnNode = fn.getAttributeNode("action"); + var mthdNode = fn.getAttributeNode("method"); + var trgtNode = fn.getAttributeNode("target"); + if(args["url"]){ + ioArgs._originalAction = actnNode ? actnNode.value : null; + if(actnNode){ + actnNode.value = args.url; + }else{ + fn.setAttribute("action",args.url); + } + } + if(!mthdNode || !mthdNode.value){ + if(mthdNode){ + mthdNode.value= (args["method"]) ? args["method"] : "post"; + }else{ + fn.setAttribute("method", (args["method"]) ? args["method"] : "post"); + } + } + ioArgs._originalTarget = trgtNode ? trgtNode.value: null; + if(trgtNode){ + trgtNode.value = this._iframeName; + }else{ + fn.setAttribute("target", this._iframeName); + } + fn.target = this._iframeName; + dojo._ioNotifyStart(dfd); + fn.submit(); + }else{ + // otherwise we post a GET string by changing URL location for the + // iframe + var tmpUrl = args.url + (args.url.indexOf("?") > -1 ? "&" : "?") + ioArgs.query; + dojo._ioNotifyStart(dfd); + this.setSrc(this._frame, tmpUrl, true); + } + }catch(e){ + dfd.errback(e); + } + }, + + _iframeOnload: function(){ + var dfd = this._currentDfd; + if(!dfd){ + this._fireNextRequest(); + return; + } + + var ioArgs = dfd.ioArgs; + var args = ioArgs.args; + var fNode = dojo.byId(args.form); + + if(fNode){ + // remove all the hidden content inputs + var toClean = ioArgs._contentToClean; + for(var i = 0; i < toClean.length; i++) { + var key = toClean[i]; + //Need to cycle over all nodes since we may have added + //an array value which means that more than one node could + //have the same .name value. + for(var j = 0; j < fNode.childNodes.length; j++){ + var chNode = fNode.childNodes[j]; + if(chNode.name == key){ + dojo.destroy(chNode); + break; + } + } + } + + // restore original action + target + if(ioArgs["_originalAction"]){ + fNode.setAttribute("action", ioArgs._originalAction); + } + if(ioArgs["_originalTarget"]){ + fNode.setAttribute("target", ioArgs._originalTarget); + fNode.target = ioArgs._originalTarget; + } + } + + ioArgs._finished = true; + } +}; + +return dojo.io.iframe; +}); diff --git a/lib/dojo/io/script.js b/lib/dojo/io/script.js index a44e9f2e..03459fae 100644 --- a/lib/dojo/io/script.js +++ b/lib/dojo/io/script.js @@ -4,259 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.io.script"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.io.script"] = true; -dojo.provide("dojo.io.script"); - -dojo.getObject("io", true, dojo); - -/*===== -dojo.declare("dojo.io.script.__ioArgs", dojo.__IoArgs, { - constructor: function(){ - // summary: - // All the properties described in the dojo.__ioArgs type, apply to this - // type as well, EXCEPT "handleAs". It is not applicable to - // dojo.io.script.get() calls, since it is implied by the usage of - // "jsonp" (response will be a JSONP call returning JSON) - // or the response is pure JavaScript defined in - // the body of the script that was attached. - // callbackParamName: String - // Deprecated as of Dojo 1.4 in favor of "jsonp", but still supported for - // legacy code. See notes for jsonp property. - // jsonp: String - // The URL parameter name that indicates the JSONP callback string. - // For instance, when using Yahoo JSONP calls it is normally, - // jsonp: "callback". For AOL JSONP calls it is normally - // jsonp: "c". - // checkString: String - // A string of JavaScript that when evaluated like so: - // "typeof(" + checkString + ") != 'undefined'" - // being true means that the script fetched has been loaded. - // Do not use this if doing a JSONP type of call (use callbackParamName instead). - // frameDoc: Document - // The Document object for a child iframe. If this is passed in, the script - // will be attached to that document. This can be helpful in some comet long-polling - // scenarios with Firefox and Opera. - this.callbackParamName = callbackParamName; - this.jsonp = jsonp; - this.checkString = checkString; - this.frameDoc = frameDoc; - } -}); -=====*/ -(function(){ - var loadEvent = dojo.isIE ? "onreadystatechange" : "load", - readyRegExp = /complete|loaded/; - - dojo.io.script = { - get: function(/*dojo.io.script.__ioArgs*/args){ - // summary: - // sends a get request using a dynamically created script tag. - var dfd = this._makeScriptDeferred(args); - var ioArgs = dfd.ioArgs; - dojo._ioAddQueryToUrl(ioArgs); - - dojo._ioNotifyStart(dfd); - - if(this._canAttach(ioArgs)){ - var node = this.attach(ioArgs.id, ioArgs.url, args.frameDoc); - - //If not a jsonp callback or a polling checkString case, bind - //to load event on the script tag. - if(!ioArgs.jsonp && !ioArgs.args.checkString){ - var handle = dojo.connect(node, loadEvent, function(evt){ - if(evt.type == "load" || readyRegExp.test(node.readyState)){ - dojo.disconnect(handle); - ioArgs.scriptLoaded = evt; - } - }); - } - } - - dojo._ioWatch(dfd, this._validCheck, this._ioCheck, this._resHandle); - return dfd; - }, - - attach: function(/*String*/id, /*String*/url, /*Document?*/frameDocument){ - // summary: - // creates a new <script> tag pointing to the specified URL and - // adds it to the document. - // description: - // Attaches the script element to the DOM. Use this method if you - // just want to attach a script to the DOM and do not care when or - // if it loads. - var doc = (frameDocument || dojo.doc); - var element = doc.createElement("script"); - element.type = "text/javascript"; - element.src = url; - element.id = id; - element.charset = "utf-8"; - return doc.getElementsByTagName("head")[0].appendChild(element); - }, - - remove: function(/*String*/id, /*Document?*/frameDocument){ - //summary: removes the script element with the given id, from the given frameDocument. - //If no frameDocument is passed, the current document is used. - dojo.destroy(dojo.byId(id, frameDocument)); - - //Remove the jsonp callback on dojo.io.script, if it exists. - if(this["jsonp_" + id]){ - delete this["jsonp_" + id]; - } - }, - - _makeScriptDeferred: function(/*Object*/args){ - //summary: - // sets up a Deferred object for an IO request. - var dfd = dojo._ioSetArgs(args, this._deferredCancel, this._deferredOk, this._deferredError); - - var ioArgs = dfd.ioArgs; - ioArgs.id = dojo._scopeName + "IoScript" + (this._counter++); - ioArgs.canDelete = false; - - //Special setup for jsonp case - ioArgs.jsonp = args.callbackParamName || args.jsonp; - if(ioArgs.jsonp){ - //Add the jsonp parameter. - ioArgs.query = ioArgs.query || ""; - if(ioArgs.query.length > 0){ - ioArgs.query += "&"; - } - ioArgs.query += ioArgs.jsonp - + "=" - + (args.frameDoc ? "parent." : "") - + dojo._scopeName + ".io.script.jsonp_" + ioArgs.id + "._jsonpCallback"; - - ioArgs.frameDoc = args.frameDoc; - - //Setup the Deferred to have the jsonp callback. - ioArgs.canDelete = true; - dfd._jsonpCallback = this._jsonpCallback; - this["jsonp_" + ioArgs.id] = dfd; - } - return dfd; // dojo.Deferred - }, - - _deferredCancel: function(/*Deferred*/dfd){ - //summary: canceller function for dojo._ioSetArgs call. - - //DO NOT use "this" and expect it to be dojo.io.script. - dfd.canceled = true; - if(dfd.ioArgs.canDelete){ - dojo.io.script._addDeadScript(dfd.ioArgs); - } - }, - - _deferredOk: function(/*Deferred*/dfd){ - //summary: okHandler function for dojo._ioSetArgs call. - - //DO NOT use "this" and expect it to be dojo.io.script. - var ioArgs = dfd.ioArgs; - - //Add script to list of things that can be removed. - if(ioArgs.canDelete){ - dojo.io.script._addDeadScript(ioArgs); - } - - //Favor JSONP responses, script load events then lastly ioArgs. - //The ioArgs are goofy, but cannot return the dfd since that stops - //the callback chain in Deferred. The return value is not that important - //in that case, probably a checkString case. - return ioArgs.json || ioArgs.scriptLoaded || ioArgs; - }, - - _deferredError: function(/*Error*/error, /*Deferred*/dfd){ - //summary: errHandler function for dojo._ioSetArgs call. - - if(dfd.ioArgs.canDelete){ - //DO NOT use "this" and expect it to be dojo.io.script. - if(error.dojoType == "timeout"){ - //For timeouts, remove the script element immediately to - //avoid a response from it coming back later and causing trouble. - dojo.io.script.remove(dfd.ioArgs.id, dfd.ioArgs.frameDoc); - }else{ - dojo.io.script._addDeadScript(dfd.ioArgs); - } - } - console.log("dojo.io.script error", error); - return error; - }, - - _deadScripts: [], - _counter: 1, - - _addDeadScript: function(/*Object*/ioArgs){ - //summary: sets up an entry in the deadScripts array. - dojo.io.script._deadScripts.push({id: ioArgs.id, frameDoc: ioArgs.frameDoc}); - //Being extra paranoid about leaks: - ioArgs.frameDoc = null; - }, - - _validCheck: function(/*Deferred*/dfd){ - //summary: inflight check function to see if dfd is still valid. - - //Do script cleanup here. We wait for one inflight pass - //to make sure we don't get any weird things by trying to remove a script - //tag that is part of the call chain (IE 6 has been known to - //crash in that case). - var _self = dojo.io.script; - var deadScripts = _self._deadScripts; - if(deadScripts && deadScripts.length > 0){ - for(var i = 0; i < deadScripts.length; i++){ - //Remove the script tag - _self.remove(deadScripts[i].id, deadScripts[i].frameDoc); - deadScripts[i].frameDoc = null; - } - dojo.io.script._deadScripts = []; - } - - return true; - }, - - _ioCheck: function(/*Deferred*/dfd){ - //summary: inflight check function to see if IO finished. - var ioArgs = dfd.ioArgs; - //Check for finished jsonp - if(ioArgs.json || (ioArgs.scriptLoaded && !ioArgs.args.checkString)){ - return true; - } - - //Check for finished "checkString" case. - var checkString = ioArgs.args.checkString; - if(checkString && eval("typeof(" + checkString + ") != 'undefined'")){ - return true; - } - - return false; - }, - - _resHandle: function(/*Deferred*/dfd){ - //summary: inflight function to handle a completed response. - if(dojo.io.script._ioCheck(dfd)){ - dfd.callback(dfd); - }else{ - //This path should never happen since the only way we can get - //to _resHandle is if _ioCheck is true. - dfd.errback(new Error("inconceivable dojo.io.script._resHandle error")); - } - }, - - _canAttach: function(/*Object*/ioArgs){ - //summary: A method that can be overridden by other modules - //to control when the script attachment occurs. - return true; - }, - - _jsonpCallback: function(/*JSON Object*/json){ - //summary: - // generic handler for jsonp callback. A pointer to this function - // is used for all jsonp callbacks. NOTE: the "this" in this - // function will be the Deferred object that represents the script - // request. - this.ioArgs.json = json; - } - }; -})(); - -} +//>>built +define("dojo/io/script",["../main"],function(_1){_1.getObject("io",true,_1);var _2=_1.isIE?"onreadystatechange":"load",_3=/complete|loaded/;_1.io.script={get:function(_4){var _5=this._makeScriptDeferred(_4);var _6=_5.ioArgs;_1._ioAddQueryToUrl(_6);_1._ioNotifyStart(_5);if(this._canAttach(_6)){var _7=this.attach(_6.id,_6.url,_4.frameDoc);if(!_6.jsonp&&!_6.args.checkString){var _8=_1.connect(_7,_2,function(_9){if(_9.type=="load"||_3.test(_7.readyState)){_1.disconnect(_8);_6.scriptLoaded=_9;}});}}_1._ioWatch(_5,this._validCheck,this._ioCheck,this._resHandle);return _5;},attach:function(id,_a,_b){var _c=(_b||_1.doc);var _d=_c.createElement("script");_d.type="text/javascript";_d.src=_a;_d.id=id;_d.async=true;_d.charset="utf-8";return _c.getElementsByTagName("head")[0].appendChild(_d);},remove:function(id,_e){_1.destroy(_1.byId(id,_e));if(this["jsonp_"+id]){delete this["jsonp_"+id];}},_makeScriptDeferred:function(_f){var dfd=_1._ioSetArgs(_f,this._deferredCancel,this._deferredOk,this._deferredError);var _10=dfd.ioArgs;_10.id=_1._scopeName+"IoScript"+(this._counter++);_10.canDelete=false;_10.jsonp=_f.callbackParamName||_f.jsonp;if(_10.jsonp){_10.query=_10.query||"";if(_10.query.length>0){_10.query+="&";}_10.query+=_10.jsonp+"="+(_f.frameDoc?"parent.":"")+_1._scopeName+".io.script.jsonp_"+_10.id+"._jsonpCallback";_10.frameDoc=_f.frameDoc;_10.canDelete=true;dfd._jsonpCallback=this._jsonpCallback;this["jsonp_"+_10.id]=dfd;}return dfd;},_deferredCancel:function(dfd){dfd.canceled=true;if(dfd.ioArgs.canDelete){_1.io.script._addDeadScript(dfd.ioArgs);}},_deferredOk:function(dfd){var _11=dfd.ioArgs;if(_11.canDelete){_1.io.script._addDeadScript(_11);}return _11.json||_11.scriptLoaded||_11;},_deferredError:function(_12,dfd){if(dfd.ioArgs.canDelete){if(_12.dojoType=="timeout"){_1.io.script.remove(dfd.ioArgs.id,dfd.ioArgs.frameDoc);}else{_1.io.script._addDeadScript(dfd.ioArgs);}}return _12;},_deadScripts:[],_counter:1,_addDeadScript:function(_13){_1.io.script._deadScripts.push({id:_13.id,frameDoc:_13.frameDoc});_13.frameDoc=null;},_validCheck:function(dfd){var _14=_1.io.script;var _15=_14._deadScripts;if(_15&&_15.length>0){for(var i=0;i<_15.length;i++){_14.remove(_15[i].id,_15[i].frameDoc);_15[i].frameDoc=null;}_1.io.script._deadScripts=[];}return true;},_ioCheck:function(dfd){var _16=dfd.ioArgs;if(_16.json||(_16.scriptLoaded&&!_16.args.checkString)){return true;}var _17=_16.args.checkString;return _17&&eval("typeof("+_17+") != 'undefined'");},_resHandle:function(dfd){if(_1.io.script._ioCheck(dfd)){dfd.callback(dfd);}else{dfd.errback(new Error("inconceivable dojo.io.script._resHandle error"));}},_canAttach:function(_18){return true;},_jsonpCallback:function(_19){this.ioArgs.json=_19;}};return _1.io.script;}); \ No newline at end of file diff --git a/lib/dojo/io/script.js.uncompressed.js b/lib/dojo/io/script.js.uncompressed.js new file mode 100644 index 00000000..628e3194 --- /dev/null +++ b/lib/dojo/io/script.js.uncompressed.js @@ -0,0 +1,256 @@ +define("dojo/io/script", ["../main"], function(dojo) { + // module: + // dojo/io/script + // summary: + // TODOC + + dojo.getObject("io", true, dojo); + +/*===== +dojo.declare("dojo.io.script.__ioArgs", dojo.__IoArgs, { + constructor: function(){ + // summary: + // All the properties described in the dojo.__ioArgs type, apply to this + // type as well, EXCEPT "handleAs". It is not applicable to + // dojo.io.script.get() calls, since it is implied by the usage of + // "jsonp" (response will be a JSONP call returning JSON) + // or the response is pure JavaScript defined in + // the body of the script that was attached. + // callbackParamName: String + // Deprecated as of Dojo 1.4 in favor of "jsonp", but still supported for + // legacy code. See notes for jsonp property. + // jsonp: String + // The URL parameter name that indicates the JSONP callback string. + // For instance, when using Yahoo JSONP calls it is normally, + // jsonp: "callback". For AOL JSONP calls it is normally + // jsonp: "c". + // checkString: String + // A string of JavaScript that when evaluated like so: + // "typeof(" + checkString + ") != 'undefined'" + // being true means that the script fetched has been loaded. + // Do not use this if doing a JSONP type of call (use callbackParamName instead). + // frameDoc: Document + // The Document object for a child iframe. If this is passed in, the script + // will be attached to that document. This can be helpful in some comet long-polling + // scenarios with Firefox and Opera. + this.callbackParamName = callbackParamName; + this.jsonp = jsonp; + this.checkString = checkString; + this.frameDoc = frameDoc; + } +}); +=====*/ + + var loadEvent = dojo.isIE ? "onreadystatechange" : "load", + readyRegExp = /complete|loaded/; + + dojo.io.script = { + get: function(/*dojo.io.script.__ioArgs*/args){ + // summary: + // sends a get request using a dynamically created script tag. + var dfd = this._makeScriptDeferred(args); + var ioArgs = dfd.ioArgs; + dojo._ioAddQueryToUrl(ioArgs); + + dojo._ioNotifyStart(dfd); + + if(this._canAttach(ioArgs)){ + var node = this.attach(ioArgs.id, ioArgs.url, args.frameDoc); + + //If not a jsonp callback or a polling checkString case, bind + //to load event on the script tag. + if(!ioArgs.jsonp && !ioArgs.args.checkString){ + var handle = dojo.connect(node, loadEvent, function(evt){ + if(evt.type == "load" || readyRegExp.test(node.readyState)){ + dojo.disconnect(handle); + ioArgs.scriptLoaded = evt; + } + }); + } + } + + dojo._ioWatch(dfd, this._validCheck, this._ioCheck, this._resHandle); + return dfd; + }, + + attach: function(/*String*/id, /*String*/url, /*Document?*/frameDocument){ + // summary: + // creates a new <script> tag pointing to the specified URL and + // adds it to the document. + // description: + // Attaches the script element to the DOM. Use this method if you + // just want to attach a script to the DOM and do not care when or + // if it loads. + var doc = (frameDocument || dojo.doc); + var element = doc.createElement("script"); + element.type = "text/javascript"; + element.src = url; + element.id = id; + element.async = true; + element.charset = "utf-8"; + return doc.getElementsByTagName("head")[0].appendChild(element); + }, + + remove: function(/*String*/id, /*Document?*/frameDocument){ + //summary: removes the script element with the given id, from the given frameDocument. + //If no frameDocument is passed, the current document is used. + dojo.destroy(dojo.byId(id, frameDocument)); + + //Remove the jsonp callback on dojo.io.script, if it exists. + if(this["jsonp_" + id]){ + delete this["jsonp_" + id]; + } + }, + + _makeScriptDeferred: function(/*Object*/args){ + //summary: + // sets up a Deferred object for an IO request. + var dfd = dojo._ioSetArgs(args, this._deferredCancel, this._deferredOk, this._deferredError); + + var ioArgs = dfd.ioArgs; + ioArgs.id = dojo._scopeName + "IoScript" + (this._counter++); + ioArgs.canDelete = false; + + //Special setup for jsonp case + ioArgs.jsonp = args.callbackParamName || args.jsonp; + if(ioArgs.jsonp){ + //Add the jsonp parameter. + ioArgs.query = ioArgs.query || ""; + if(ioArgs.query.length > 0){ + ioArgs.query += "&"; + } + ioArgs.query += ioArgs.jsonp + + "=" + + (args.frameDoc ? "parent." : "") + + dojo._scopeName + ".io.script.jsonp_" + ioArgs.id + "._jsonpCallback"; + + ioArgs.frameDoc = args.frameDoc; + + //Setup the Deferred to have the jsonp callback. + ioArgs.canDelete = true; + dfd._jsonpCallback = this._jsonpCallback; + this["jsonp_" + ioArgs.id] = dfd; + } + return dfd; // dojo.Deferred + }, + + _deferredCancel: function(/*Deferred*/dfd){ + //summary: canceller function for dojo._ioSetArgs call. + + //DO NOT use "this" and expect it to be dojo.io.script. + dfd.canceled = true; + if(dfd.ioArgs.canDelete){ + dojo.io.script._addDeadScript(dfd.ioArgs); + } + }, + + _deferredOk: function(/*Deferred*/dfd){ + //summary: okHandler function for dojo._ioSetArgs call. + + //DO NOT use "this" and expect it to be dojo.io.script. + var ioArgs = dfd.ioArgs; + + //Add script to list of things that can be removed. + if(ioArgs.canDelete){ + dojo.io.script._addDeadScript(ioArgs); + } + + //Favor JSONP responses, script load events then lastly ioArgs. + //The ioArgs are goofy, but cannot return the dfd since that stops + //the callback chain in Deferred. The return value is not that important + //in that case, probably a checkString case. + return ioArgs.json || ioArgs.scriptLoaded || ioArgs; + }, + + _deferredError: function(/*Error*/error, /*Deferred*/dfd){ + //summary: errHandler function for dojo._ioSetArgs call. + + if(dfd.ioArgs.canDelete){ + //DO NOT use "this" and expect it to be dojo.io.script. + if(error.dojoType == "timeout"){ + //For timeouts, remove the script element immediately to + //avoid a response from it coming back later and causing trouble. + dojo.io.script.remove(dfd.ioArgs.id, dfd.ioArgs.frameDoc); + }else{ + dojo.io.script._addDeadScript(dfd.ioArgs); + } + } + console.log("dojo.io.script error", error); + return error; + }, + + _deadScripts: [], + _counter: 1, + + _addDeadScript: function(/*Object*/ioArgs){ + //summary: sets up an entry in the deadScripts array. + dojo.io.script._deadScripts.push({id: ioArgs.id, frameDoc: ioArgs.frameDoc}); + //Being extra paranoid about leaks: + ioArgs.frameDoc = null; + }, + + _validCheck: function(/*Deferred*/dfd){ + //summary: inflight check function to see if dfd is still valid. + + //Do script cleanup here. We wait for one inflight pass + //to make sure we don't get any weird things by trying to remove a script + //tag that is part of the call chain (IE 6 has been known to + //crash in that case). + var _self = dojo.io.script; + var deadScripts = _self._deadScripts; + if(deadScripts && deadScripts.length > 0){ + for(var i = 0; i < deadScripts.length; i++){ + //Remove the script tag + _self.remove(deadScripts[i].id, deadScripts[i].frameDoc); + deadScripts[i].frameDoc = null; + } + dojo.io.script._deadScripts = []; + } + + return true; + }, + + _ioCheck: function(/*Deferred*/dfd){ + //summary: inflight check function to see if IO finished. + var ioArgs = dfd.ioArgs; + //Check for finished jsonp + if(ioArgs.json || (ioArgs.scriptLoaded && !ioArgs.args.checkString)){ + return true; + } + + //Check for finished "checkString" case. + var checkString = ioArgs.args.checkString; + return checkString && eval("typeof(" + checkString + ") != 'undefined'"); + + + }, + + _resHandle: function(/*Deferred*/dfd){ + //summary: inflight function to handle a completed response. + if(dojo.io.script._ioCheck(dfd)){ + dfd.callback(dfd); + }else{ + //This path should never happen since the only way we can get + //to _resHandle is if _ioCheck is true. + dfd.errback(new Error("inconceivable dojo.io.script._resHandle error")); + } + }, + + _canAttach: function(/*Object*/ioArgs){ + //summary: A method that can be overridden by other modules + //to control when the script attachment occurs. + return true; + }, + + _jsonpCallback: function(/*JSON Object*/json){ + //summary: + // generic handler for jsonp callback. A pointer to this function + // is used for all jsonp callbacks. NOTE: the "this" in this + // function will be the Deferred object that represents the script + // request. + this.ioArgs.json = json; + } + }; + + return dojo.io.script; +}); diff --git a/lib/dojo/jaxer.js b/lib/dojo/jaxer.js index 2ac115e1..835661da 100644 --- a/lib/dojo/jaxer.js +++ b/lib/dojo/jaxer.js @@ -4,20 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.jaxer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.jaxer"] = true; -dojo.provide("dojo.jaxer"); - - -if(typeof print == "function"){ - console.debug = Jaxer.Log.debug; - console.warn = Jaxer.Log.warn; - console.error = Jaxer.Log.error; - console.info = Jaxer.Log.info; - console.log = Jaxer.Log.warn; -} - -onserverload = dojo._loadInit; - -} +//>>built +define("dojo/jaxer",["./main"],function(_1){if(typeof print=="function"){console.debug=Jaxer.Log.debug;console.warn=Jaxer.Log.warn;console.error=Jaxer.Log.error;console.info=Jaxer.Log.info;console.log=Jaxer.Log.warn;}onserverload=_1._loadInit;return _1;}); \ No newline at end of file diff --git a/lib/dojo/jaxer.js.uncompressed.js b/lib/dojo/jaxer.js.uncompressed.js new file mode 100644 index 00000000..b5b12da2 --- /dev/null +++ b/lib/dojo/jaxer.js.uncompressed.js @@ -0,0 +1,19 @@ +define("dojo/jaxer", ["./main"], function(dojo) { + // module: + // dojo/jaxer + // summary: + // TODOC + + +if(typeof print == "function"){ + console.debug = Jaxer.Log.debug; + console.warn = Jaxer.Log.warn; + console.error = Jaxer.Log.error; + console.info = Jaxer.Log.info; + console.log = Jaxer.Log.warn; +} + +onserverload = dojo._loadInit; + +return dojo; +}); diff --git a/lib/dojo/json.js b/lib/dojo/json.js new file mode 100644 index 00000000..fa84ba63 --- /dev/null +++ b/lib/dojo/json.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/json",["./has"],function(_1){"use strict";var _2=typeof JSON!="undefined";_1.add("json-parse",_2);_1.add("json-stringify",_2&&JSON.stringify({a:0},function(k,v){return v||1;})=="{\"a\":1}");if(_1("json-stringify")){return JSON;}else{var _3=function(_4){return ("\""+_4.replace(/(["\\])/g,"\\$1")+"\"").replace(/[\f]/g,"\\f").replace(/[\b]/g,"\\b").replace(/[\n]/g,"\\n").replace(/[\t]/g,"\\t").replace(/[\r]/g,"\\r");};return {parse:_1("json-parse")?JSON.parse:function(_5,_6){if(_6&&!/^([\s\[\{]*(?:"(?:\\.|[^"])+"|-?\d[\d\.]*(?:[Ee][+-]?\d+)?|null|true|false|)[\s\]\}]*(?:,|:|$))+$/.test(_5)){throw new SyntaxError("Invalid characters in JSON");}return eval("("+_5+")");},stringify:function(_7,_8,_9){var _a;if(typeof _8=="string"){_9=_8;_8=null;}function _b(it,_c,_d){if(_8){it=_8(_d,it);}var _e,_f=typeof it;if(_f=="number"){return isFinite(it)?it+"":"null";}if(_f=="boolean"){return it+"";}if(it===null){return "null";}if(typeof it=="string"){return _3(it);}if(_f=="function"||_f=="undefined"){return _a;}if(typeof it.toJSON=="function"){return _b(it.toJSON(_d),_c,_d);}if(it instanceof Date){return "\"{FullYear}-{Month+}-{Date}T{Hours}:{Minutes}:{Seconds}Z\"".replace(/\{(\w+)(\+)?\}/g,function(t,_10,_11){var num=it["getUTC"+_10]()+(_11?1:0);return num<10?"0"+num:num;});}if(it.valueOf()!==it){return _b(it.valueOf(),_c,_d);}var _12=_9?(_c+_9):"";var sep=_9?" ":"";var _13=_9?"\n":"";if(it instanceof Array){var itl=it.length,res=[];for(_d=0;_d<itl;_d++){var obj=it[_d];_e=_b(obj,_12,_d);if(typeof _e!="string"){_e="null";}res.push(_13+_12+_e);}return "["+res.join(",")+_13+_c+"]";}var _14=[];for(_d in it){var _15;if(typeof _d=="number"){_15="\""+_d+"\"";}else{if(typeof _d=="string"){_15=_3(_d);}else{continue;}}_e=_b(it[_d],_12,_d);if(typeof _e!="string"){continue;}_14.push(_13+_12+_15+":"+sep+_e);}return "{"+_14.join(",")+_13+_c+"}";};return _b(_7,"","");}};}}); \ No newline at end of file diff --git a/lib/dojo/json.js.uncompressed.js b/lib/dojo/json.js.uncompressed.js new file mode 100644 index 00000000..307730f0 --- /dev/null +++ b/lib/dojo/json.js.uncompressed.js @@ -0,0 +1,149 @@ +define("dojo/json", ["./has"], function(has){ + "use strict"; + var hasJSON = typeof JSON != "undefined"; + has.add("json-parse", hasJSON); // all the parsers work fine + // Firefox 3.5/Gecko 1.9 fails to use replacer in stringify properly https://bugzilla.mozilla.org/show_bug.cgi?id=509184 + has.add("json-stringify", hasJSON && JSON.stringify({a:0}, function(k,v){return v||1;}) == '{"a":1}'); + if(has("json-stringify")){ + return JSON; + } + else{ + var escapeString = function(/*String*/str){ + //summary: + // Adds escape sequences for non-visual characters, double quote and + // backslash and surrounds with double quotes to form a valid string + // literal. + return ('"' + str.replace(/(["\\])/g, '\\$1') + '"'). + replace(/[\f]/g, "\\f").replace(/[\b]/g, "\\b").replace(/[\n]/g, "\\n"). + replace(/[\t]/g, "\\t").replace(/[\r]/g, "\\r"); // string + }; + return { + parse: has("json-parse") ? JSON.parse : function(str, strict){ + // summary: + // Parses a [JSON](http://json.org) string to return a JavaScript object. + // description: + // This function follows [native JSON API](https://developer.mozilla.org/en/JSON) + // Throws for invalid JSON strings. This delegates to eval() if native JSON + // support is not available. By default this will evaluate any valid JS expression. + // With the strict parameter set to true, the parser will ensure that only + // valid JSON strings are parsed (otherwise throwing an error). Without the strict + // parameter, the content passed to this method must come + // from a trusted source. + // str: + // a string literal of a JSON item, for instance: + // `'{ "foo": [ "bar", 1, { "baz": "thud" } ] }'` + // strict: + // When set to true, this will ensure that only valid, secure JSON is ever parsed. + // Make sure this is set to true for untrusted content. Note that on browsers/engines + // without native JSON support, setting this to true will run slower. + if(strict && !/^([\s\[\{]*(?:"(?:\\.|[^"])+"|-?\d[\d\.]*(?:[Ee][+-]?\d+)?|null|true|false|)[\s\]\}]*(?:,|:|$))+$/.test(str)){ + throw new SyntaxError("Invalid characters in JSON"); + } + return eval('(' + str + ')'); + }, + stringify: function(value, replacer, spacer){ + // summary: + // Returns a [JSON](http://json.org) serialization of an object. + // description: + // Returns a [JSON](http://json.org) serialization of an object. + // This function follows [native JSON API](https://developer.mozilla.org/en/JSON) + // Note that this doesn't check for infinite recursion, so don't do that! + // value: + // A value to be serialized. + // replacer: + // A replacer function that is called for each value and can return a replacement + // spacer: + // A spacer string to be used for pretty printing of JSON + // + // example: + // simple serialization of a trivial object + // | define(["dojo/json"], function(JSON){ + // | var jsonStr = JSON.stringify({ howdy: "stranger!", isStrange: true }); + // | doh.is('{"howdy":"stranger!","isStrange":true}', jsonStr); + var undef; + if(typeof replacer == "string"){ + spacer = replacer; + replacer = null; + } + function stringify(it, indent, key){ + if(replacer){ + it = replacer(key, it); + } + var val, objtype = typeof it; + if(objtype == "number"){ + return isFinite(it) ? it + "" : "null"; + } + if(objtype == "boolean"){ + return it + ""; + } + if(it === null){ + return "null"; + } + if(typeof it == "string"){ + return escapeString(it); + } + if(objtype == "function" || objtype == "undefined"){ + return undef; // undefined + } + // short-circuit for objects that support "json" serialization + // if they return "self" then just pass-through... + if(typeof it.toJSON == "function"){ + return stringify(it.toJSON(key), indent, key); + } + if(it instanceof Date){ + return '"{FullYear}-{Month+}-{Date}T{Hours}:{Minutes}:{Seconds}Z"'.replace(/\{(\w+)(\+)?\}/g, function(t, prop, plus){ + var num = it["getUTC" + prop]() + (plus ? 1 : 0); + return num < 10 ? "0" + num : num; + }); + } + if(it.valueOf() !== it){ + // primitive wrapper, try again unwrapped: + return stringify(it.valueOf(), indent, key); + } + var nextIndent= spacer ? (indent + spacer) : ""; + /* we used to test for DOM nodes and throw, but FF serializes them as {}, so cross-browser consistency is probably not efficiently attainable */ + + var sep = spacer ? " " : ""; + var newLine = spacer ? "\n" : ""; + + // array + if(it instanceof Array){ + var itl = it.length, res = []; + for(key = 0; key < itl; key++){ + var obj = it[key]; + val = stringify(obj, nextIndent, key); + if(typeof val != "string"){ + val = "null"; + } + res.push(newLine + nextIndent + val); + } + return "[" + res.join(",") + newLine + indent + "]"; + } + // generic object code path + var output = []; + for(key in it){ + var keyStr; + if(typeof key == "number"){ + keyStr = '"' + key + '"'; + }else if(typeof key == "string"){ + keyStr = escapeString(key); + }else{ + // skip non-string or number keys + continue; + } + val = stringify(it[key], nextIndent, key); + if(typeof val != "string"){ + // skip non-serializable values + continue; + } + // At this point, the most non-IE browsers don't get in this branch + // (they have native JSON), so push is definitely the way to + output.push(newLine + nextIndent + keyStr + ":" + sep + val); + } + return "{" + output.join(",") + newLine + indent + "}"; // String + } + return stringify(value, "", ""); + } + }; + } +}); diff --git a/lib/dojo/keys.js b/lib/dojo/keys.js new file mode 100644 index 00000000..3086cd8b --- /dev/null +++ b/lib/dojo/keys.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/keys",["./_base/kernel","./_base/sniff"],function(_1,_2){return _1.keys={BACKSPACE:8,TAB:9,CLEAR:12,ENTER:13,SHIFT:16,CTRL:17,ALT:18,META:_2("safari")?91:224,PAUSE:19,CAPS_LOCK:20,ESCAPE:27,SPACE:32,PAGE_UP:33,PAGE_DOWN:34,END:35,HOME:36,LEFT_ARROW:37,UP_ARROW:38,RIGHT_ARROW:39,DOWN_ARROW:40,INSERT:45,DELETE:46,HELP:47,LEFT_WINDOW:91,RIGHT_WINDOW:92,SELECT:93,NUMPAD_0:96,NUMPAD_1:97,NUMPAD_2:98,NUMPAD_3:99,NUMPAD_4:100,NUMPAD_5:101,NUMPAD_6:102,NUMPAD_7:103,NUMPAD_8:104,NUMPAD_9:105,NUMPAD_MULTIPLY:106,NUMPAD_PLUS:107,NUMPAD_ENTER:108,NUMPAD_MINUS:109,NUMPAD_PERIOD:110,NUMPAD_DIVIDE:111,F1:112,F2:113,F3:114,F4:115,F5:116,F6:117,F7:118,F8:119,F9:120,F10:121,F11:122,F12:123,F13:124,F14:125,F15:126,NUM_LOCK:144,SCROLL_LOCK:145,UP_DPAD:175,DOWN_DPAD:176,LEFT_DPAD:177,RIGHT_DPAD:178,copyKey:_2("mac")&&!_2("air")?(_2("safari")?91:224):17};}); \ No newline at end of file diff --git a/lib/dojo/keys.js.uncompressed.js b/lib/dojo/keys.js.uncompressed.js new file mode 100644 index 00000000..e6dbd3d6 --- /dev/null +++ b/lib/dojo/keys.js.uncompressed.js @@ -0,0 +1,80 @@ +define("dojo/keys", ["./_base/kernel", "./_base/sniff"], function(dojo, has) { + // module: + // dojo/keys + // summary: + // key constants +// Constants + +// Public: client code should test +// keyCode against these named constants, as the +// actual codes can vary by browser. +return dojo.keys = { + // summary: + // Definitions for common key values + BACKSPACE: 8, + TAB: 9, + CLEAR: 12, + ENTER: 13, + SHIFT: 16, + CTRL: 17, + ALT: 18, + META: has("safari") ? 91 : 224, // the apple key on macs + PAUSE: 19, + CAPS_LOCK: 20, + ESCAPE: 27, + SPACE: 32, + PAGE_UP: 33, + PAGE_DOWN: 34, + END: 35, + HOME: 36, + LEFT_ARROW: 37, + UP_ARROW: 38, + RIGHT_ARROW: 39, + DOWN_ARROW: 40, + INSERT: 45, + DELETE: 46, + HELP: 47, + LEFT_WINDOW: 91, + RIGHT_WINDOW: 92, + SELECT: 93, + NUMPAD_0: 96, + NUMPAD_1: 97, + NUMPAD_2: 98, + NUMPAD_3: 99, + NUMPAD_4: 100, + NUMPAD_5: 101, + NUMPAD_6: 102, + NUMPAD_7: 103, + NUMPAD_8: 104, + NUMPAD_9: 105, + NUMPAD_MULTIPLY: 106, + NUMPAD_PLUS: 107, + NUMPAD_ENTER: 108, + NUMPAD_MINUS: 109, + NUMPAD_PERIOD: 110, + NUMPAD_DIVIDE: 111, + F1: 112, + F2: 113, + F3: 114, + F4: 115, + F5: 116, + F6: 117, + F7: 118, + F8: 119, + F9: 120, + F10: 121, + F11: 122, + F12: 123, + F13: 124, + F14: 125, + F15: 126, + NUM_LOCK: 144, + SCROLL_LOCK: 145, + UP_DPAD: 175, + DOWN_DPAD: 176, + LEFT_DPAD: 177, + RIGHT_DPAD: 178, + // virtual key mapping + copyKey: has("mac") && !has("air") ? (has("safari") ? 91 : 224 ) : 17 +}; +}); diff --git a/lib/dojo/lib/backCompat.js b/lib/dojo/lib/backCompat.js deleted file mode 100644 index 101f4e52..00000000 --- a/lib/dojo/lib/backCompat.js +++ /dev/null @@ -1,283 +0,0 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -// AMD module id = dojo/lib/backCompat -// -// This module defines those dojo properties/methods that are defined by -// dojo/_base/_loader/loader and are still needed when loading with and -// AMD loader (when loading with an AMD loader, dojo/_base/_loader/loader -// is never loaded). -// -// note: this module is relevant only when loading dojo with an AMD loader; -// it is never evaluated otherwise. - -define(["require", "dojo/_base/_loader/bootstrap"], function(require, dojo){ - // the following dojo properties do not exist in the AMD-loaded version of dojo 1.x: - var names= [ - "_moduleHasPrefix", - "_loadPath", - "_loadUri", - "_loadUriAndCheck", - "loaded", - "_callLoaded", - "_getModuleSymbols", - "_loadModule", - "require", - "provide", - "platformRequire", - "requireIf", - "requireAfterIf", - "registerModulePath" - ], i, name; - for(i = 0; i<names.length;){ - name = names[i++]; - dojo[name] = (function(name) { - return function(){ - console.warn("dojo." + name + " not available when using an AMD loader."); - }; - })(name); - } - - // define dojo.addOnLoad in terms of the DOMContentLoaded detection available from the AMD loaders - // (requirejs and bdBuild). Note that the behavior of this feature is slightly different compared to the dojo - // v1.x sync loader. There, the onload queue is fired upon detecting both DOMContentLoaded *and* all - // demanded modules have arrived. It is impossible to simulate this behavior with requirejs since it does - // not publish its internal status (it is possible with bdLoad). - // TODO: consider taking ownership of this API back from the loader. - // TODO: consider requesting requirejs publish more enough internal state to determine if all demanded - // modules have been defined. - var - argsToArray = function(args) { - var result = [], i; - for(i = 0; i<args.length;){ - result.push(args[i++]); - } - return result; - }, - - simpleHitch = function(context, callback){ - if(callback){ - return (typeof callback=="string") ? - function(){context[callback]();} : - function(){callback.call(context);}; - }else{ - return context; - } - }; - dojo.ready = dojo.addOnLoad = function(context, callback){ - require.ready(callback ? simpleHitch(context, callback) : context); - }; - dojo.addOnLoad(function() { - dojo.postLoad = dojo.config.afterOnLoad = true; - }); - var dca = dojo.config.addOnLoad; - if(dca){ - dojo.addOnLoad[(dca instanceof Array ? "apply" : "call")](dojo, dca); - } - - // TODO: in the dojo 1.x sync loader the array dojo._loaders holds the queue of callbacks to be executed - // upon DOMContentLoaded. This queue is manipulated directly by dojo/uacss, dojo/parser, dijit/_base/wia - // and others (at least in dojox). This is also impossible to simulate universally across all AMD loaders. - // The following will at least accept client code accessing dojo._loaders , dojo._loaders.unshift, and - // dojo._loaders.splice--which is all that exists in the current dojo/dijit code stacks. - var - loaders = dojo._loaders = [], - runLoaders = function(){ - var temp= loaders.slice(0); - Array.prototype.splice.apply(loaders, [0, loaders.length]); - while(temp.length){ - temp.shift().call(); - }; - }; - loaders.unshift = function() { - Array.prototype.unshift.apply(loaders, argsToArray(arguments)); - require.ready(runLoaders); - }; - loaders.splice = function() { - Array.prototype.splice.apply(loaders, argsToArray(arguments)); - require.ready(runLoaders); - }; - - //TODO: put unload handling in a separate module - var unloaders = dojo._unloaders = []; - dojo.unloaded = function(){ - while(unloaders.length){ - unloaders.pop().call(); - } - }; - - //TODO: kill this low-value function when it is exorcised from dojo - dojo._onto = function(arr, obj, fn){ - arr.push(fn ? simpleHitch(obj, fn) : obj); - }; - - //TODO: kill this when the bootstrap is rewritten to not include DOMContentLoaded detection - // (it should probably be just a module) for now, just sink the detection; leverage the - // AMD loaders to handle DOMContentLoaded detection - dojo._modulesLoaded = function(){}; - - //TODO: kill this when we understand its purpose relative to AMD - dojo.loadInit = function(init){ - init(); - }; - - var amdModuleName= function(moduleName){ - return moduleName.replace(/\./g, "/"); - }; - - dojo.getL10nName = function(moduleName, bundleName, locale){ - locale = locale ? locale.toLowerCase() : dojo.locale; - moduleName = "i18n!" + amdModuleName(moduleName); - return (/root/i.test(locale)) ? - (moduleName + "/nls/" + bundleName) : - (moduleName + "/nls/" + locale + "/" + bundleName); - }; - - dojo.requireLocalization = function(moduleName, bundleName, locale){ - // NOTE: locales other than the locale specified in dojo.locale need to be specifically - // declared as a module dependency when using AMD. - if(require.vendor!="altoviso.com"){ - locale = !locale || locale.toLowerCase() === dojo.locale ? "root" : locale; - } - return require(dojo.getL10nName(moduleName, bundleName, locale)); - }; - - dojo.i18n= { - getLocalization: dojo.requireLocalization, - normalizeLocale: function(locale){ - var result = locale ? locale.toLowerCase() : dojo.locale; - if(result == "root"){ - result = "ROOT"; - } - return result; - } - }; - - //TODO: dojo._Url seems rarely used and long to be part of the boostrap; consider moving - //note: this routine cut and paste from dojo/_base/_loader/loader - var - ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"), - ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"); - dojo._Url = function(){ - var n = null, - _a = arguments, - uri = [_a[0]]; - // resolve uri components relative to each other - for(var i = 1; i<_a.length; i++){ - if(!_a[i]){ continue; } - - // Safari doesn't support this.constructor so we have to be explicit - // FIXME: Tracked (and fixed) in Webkit bug 3537. - // http://bugs.webkit.org/show_bug.cgi?id=3537 - var relobj = new dojo._Url(_a[i]+""), - uriobj = new dojo._Url(uri[0]+""); - - if( - relobj.path == "" && - !relobj.scheme && - !relobj.authority && - !relobj.query - ){ - if(relobj.fragment != n){ - uriobj.fragment = relobj.fragment; - } - relobj = uriobj; - }else if(!relobj.scheme){ - relobj.scheme = uriobj.scheme; - - if(!relobj.authority){ - relobj.authority = uriobj.authority; - - if(relobj.path.charAt(0) != "/"){ - var path = uriobj.path.substring(0, - uriobj.path.lastIndexOf("/") + 1) + relobj.path; - - var segs = path.split("/"); - for(var j = 0; j < segs.length; j++){ - if(segs[j] == "."){ - // flatten "./" references - if(j == segs.length - 1){ - segs[j] = ""; - }else{ - segs.splice(j, 1); - j--; - } - }else if(j > 0 && !(j == 1 && segs[0] == "") && - segs[j] == ".." && segs[j-1] != ".."){ - // flatten "../" references - if(j == (segs.length - 1)){ - segs.splice(j, 1); - segs[j - 1] = ""; - }else{ - segs.splice(j - 1, 2); - j -= 2; - } - } - } - relobj.path = segs.join("/"); - } - } - } - - uri = []; - if(relobj.scheme){ - uri.push(relobj.scheme, ":"); - } - if(relobj.authority){ - uri.push("//", relobj.authority); - } - uri.push(relobj.path); - if(relobj.query){ - uri.push("?", relobj.query); - } - if(relobj.fragment){ - uri.push("#", relobj.fragment); - } - } - - this.uri = uri.join(""); - - // break the uri into its main components - var r = this.uri.match(ore); - - this.scheme = r[2] || (r[1] ? "" : n); - this.authority = r[4] || (r[3] ? "" : n); - this.path = r[5]; // can never be undefined - this.query = r[7] || (r[6] ? "" : n); - this.fragment = r[9] || (r[8] ? "" : n); - - if(this.authority != n){ - // server based naming authority - r = this.authority.match(ire); - - this.user = r[3] || n; - this.password = r[4] || n; - this.host = r[6] || r[7]; // ipv6 || ipv4 - this.port = r[9] || n; - } - }; - - dojo._Url.prototype.toString = function(){ return this.uri; }; - - dojo.moduleUrl = function(module, url){ - if(!module){ - //TODO: don't understand why this would ever be so, but that's the logic in loader - return null; - } - module = amdModuleName(module) + (url ? ("/" + url) : ""); - var - type= "", - match= module.match(/(.+)(\.[^\/]*)$/); - if (match) { - module= match[1]; - type= match[2]; - } - return new dojo._Url(require.nameToUrl(module, type)); // dojo._Url - }; - - return dojo; -}); diff --git a/lib/dojo/lib/kernel.js b/lib/dojo/lib/kernel.js deleted file mode 100644 index 94a3fefa..00000000 --- a/lib/dojo/lib/kernel.js +++ /dev/null @@ -1,26 +0,0 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -// AMD module id = dojo/lib/kernel -// -// This module ensures the dojo object is initialized by... -// -// * dojo/_base/_loader/bootstrap -// * dojo/lib/backCompat -// * dojo/_base/_loader/hostenv_browser -// -// This is roughly equivalent to the work that dojo.js does by injecting -// bootstrap, loader, and hostenv_browser. -// -// note: this module is relevant only when loading dojo with an AMD loader; -// it is never evaluated otherwise. - -// for now, we publish dojo into the global namespace because so many tests and apps expect it. -define(["dojo/_base/_loader/hostenv_browser"], function(dojo_){ - dojo= dojo_; - return dojo_; -}); diff --git a/lib/dojo/lib/main-browser.js b/lib/dojo/lib/main-browser.js deleted file mode 100644 index cb5cc2a4..00000000 --- a/lib/dojo/lib/main-browser.js +++ /dev/null @@ -1,61 +0,0 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -// AMD module id = dojo -// -// This is a package main module for the dojo package implemented so that the *absolute minimal* -// changes are made to the dojo 1.x code. It is by no means optimal and should/will be replaced with -// a less naive design--particularly as dojo v2.0 evolves. -// -// There are a few key design weaknesses in this implementation: -// -// * generally, v1.x bootstrap, tests, and apps assume dojo is global -// -// * the v1.x dojo/_base modules assume dojo is defined before they are defined -// and their factory functions go about populating dojo--which is really part of defining -// dojo. This leads to the appearance of a circular dependency and is a somewhat obtuse -// design since the dojo object must be delivered to them under a different module -// name (dojo/lib/kernel). -// -// * bootstrap modules tend to incorporate unrelated features (e.g., hostenv_browser includes -// DOMContentLoad detection, thereby making it impossible to build out this feature if a -// particular app does not need it). -// -// * The back compatibility layer requires/contains some non-optimal code that needs to be improved. -// -// As 1.7 and 2.0 evolve, these items will be addressed with more robust implementation. -// -// The boot sequence is as follows: -// -// dojo (this module) depends on... -// dojo/lib/kernel which depends on... -// dojo/_base/_loader/hostenv_browser which depends on... -// dojo/lib/backCompat which depends on... -// dojo/_base/_loader/bootstrap which depends on nothing -// -// This module further depends on the fairly ordinary modules in dojo/_base; each of these -// modules depends on dojo/lib/kernel (at least) which provide the dojo object for them to augment. - -define("dojo", [ - "dojo/lib/kernel", - "dojo/_base/lang", - "dojo/_base/array", - "dojo/_base/declare", - "dojo/_base/connect", - "dojo/_base/Deferred", - "dojo/_base/json", - "dojo/_base/Color", - "dojo/_base/window", - "dojo/_base/event", - "dojo/_base/html", - "dojo/_base/NodeList", - "dojo/_base/query", - "dojo/_base/xhr", - "dojo/_base/fx" -], function(dojo){ - return dojo; -}); diff --git a/lib/dojo/lib/plugins/i18n.js b/lib/dojo/lib/plugins/i18n.js deleted file mode 100644 index 93a57f76..00000000 --- a/lib/dojo/lib/plugins/i18n.js +++ /dev/null @@ -1,94 +0,0 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -// -// dojo i18n! plugin -// -// We choose to include our own plugin in hopes of leveraging functionality already contained in dojo -// and thereby reducing the size of the plugin compared to various loader implementations. Naturally, this -// allows AMD loaders to be used without their plugins. - -// CAUTION, this module may return improper results if the AMD loader does not support toAbsMid and client -// code passes relative plugin resource module ids. In that case, you should consider using the i18n! plugin -// that comes with your loader. - -define(["dojo"], function(dojo) { - var - nlsRe= - // regexp for reconstructing the master bundle name from parts of the regexp match - // nlsRe.exec("foo/bar/baz/nls/en-ca/foo") gives: - // ["foo/bar/baz/nls/en-ca/foo", "foo/bar/baz/nls/", "/", "/", "en-ca", "foo"] - // nlsRe.exec("foo/bar/baz/nls/foo") gives: - // ["foo/bar/baz/nls/foo", "foo/bar/baz/nls/", "/", "/", "foo", ""] - // so, if match[5] is blank, it means this is the top bundle definition. - // courtesy of http://requirejs.org - /(^.*(^|\/)nls(\/|$))([^\/]*)\/?([^\/]*)/, - - getAvailableLocales= function( - root, - locale, - bundlePath, - bundleName - ){ - // return a vector of module ids containing all available locales with respect to the target locale - // For example, assuming: - // * the root bundle indicates specific bundles for "fr" and "fr-ca", - // * bundlePath is "myPackage/nls" - // * bundleName is "myBundle" - // Then a locale argument of "fr-ca" would return - // ["myPackage/nls/myBundle", "myPackage/nls/fr/myBundle", "myPackage/nls/fr-ca/myBundle"] - // Notice that bundles are returned least-specific to most-specific, starting with the root. - - for(var result= [bundlePath + bundleName], localeParts= locale.split("-"), current= "", i= 0; i<localeParts.length; i++){ - current+= localeParts[i]; - if(root[current]){ - result.push(bundlePath + current + "/" + bundleName); - } - } - return result; - }, - - cache= {}; - - return { - load: function(id, require, load){ - // note: id may be relative - var - match= nlsRe.exec(id), - bundlePath= (require.toAbsMid && require.toAbsMid(match[1])) || match[1], - bundleName= match[5] || match[4], - bundlePathAndName= bundlePath + bundleName, - locale= (match[5] && match[4]) || dojo.locale, - target= bundlePathAndName + "/" + locale; - - // if we've already resolved this request, just return it - if (cache[target]) { - load(cache[target]); - return; - } - - // get the root bundle which instructs which other bundles are required to contruct the localized bundle - require([bundlePathAndName], function(root){ - var - current= cache[bundlePathAndName + "/"]= dojo.clone(root.root), - availableLocales= getAvailableLocales(root, locale, bundlePath, bundleName); - require(availableLocales, function(){ - for (var i= 1; i<availableLocales.length; i++){ - cache[bundlePathAndName + "/" + availableLocales[i]]= current= dojo.mixin(dojo.clone(current), arguments[i]); - } - // target may not have been resolve (e.g., maybe only "fr" exists when "fr-ca" was requested) - cache[target]= current; - load(current); - }); - }); - }, - - cache: function(mid, value){ - cache[mid]= value; - } - }; -}); diff --git a/lib/dojo/lib/plugins/text.js b/lib/dojo/lib/plugins/text.js deleted file mode 100644 index 75894a32..00000000 --- a/lib/dojo/lib/plugins/text.js +++ /dev/null @@ -1,70 +0,0 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -// -// dojo text! plugin -// -// We choose to include our own plugin in hopes of leveraging functionality already contained in dojo -// and thereby reducing the size of the plugin compared to various loader implementations. Naturally, this -// allows AMD loaders to be used without their plugins. - -// CAUTION, this module may return improper results if the AMD loader does not support toAbsMid and client -// code passes relative plugin resource module ids. In that case, you should consider using the text! plugin -// that comes with your loader. - -define(["dojo", "dojo/cache"], function(dojo){ - var - cached= {}, - - cache= function(cacheId, url, value){ - cached[cacheId]= value; - dojo.cache({toString:function(){return url;}}, value); - }, - - strip= function(text){ - //note: this function courtesy of James Burke (https://github.com/jrburke/requirejs) - //Strips <?xml ...?> declarations so that external SVG and XML - //documents can be added to a document without worry. Also, if the string - //is an HTML document, only the part inside the body tag is returned. - if(text){ - text= text.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, ""); - var matches= text.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im); - if(matches){ - text= matches[1]; - } - }else{ - text = ""; - } - return text; - }; - - return { - load:function(id, require, load){ - var match, cacheId, url, parts= id.split("!"); - if(require.toAbsMid){ - match= parts[0].match(/(.+)(\.[^\/]*)$/); - cacheId= match ? require.toAbsMid(match[1]) + match[2] : require.toAbsMid(parts[0]); - if(cacheId in cached){ - load(parts[1]=="strip" ? strip(cached[cacheId]) : cached[cacheId]); - return; - } - } - url= require.toUrl(parts[0]); - dojo.xhrGet({ - url:url, - load:function(text){ - cacheId && cache(cacheId, url, text); - load(parts[1]=="strip" ? strip(text) : text); - } - }); - }, - - cache:function(cacheId, mid, type, value) { - cache(cacheId, require.nameToUrl(mid) + type, value); - } - }; -}); diff --git a/lib/dojo/loadInit.js b/lib/dojo/loadInit.js new file mode 100644 index 00000000..e5f966fe --- /dev/null +++ b/lib/dojo/loadInit.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/loadInit",["./_base/loader"],function(_1){return {dynamic:0,normalize:function(id){return id;},load:_1.loadInit};}); \ No newline at end of file diff --git a/lib/dojo/loadInit.js.uncompressed.js b/lib/dojo/loadInit.js.uncompressed.js new file mode 100644 index 00000000..373931d1 --- /dev/null +++ b/lib/dojo/loadInit.js.uncompressed.js @@ -0,0 +1,7 @@ +define("dojo/loadInit", ["./_base/loader"], function(loader){ + return { + dynamic:0, + normalize:function(id){return id;}, + load:loader.loadInit + }; +}); diff --git a/lib/dojo/main.js b/lib/dojo/main.js new file mode 100644 index 00000000..f1443bcf --- /dev/null +++ b/lib/dojo/main.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/main",["./_base/kernel","./has","require","./_base/sniff","./_base/lang","./_base/array","./ready","./_base/declare","./_base/connect","./_base/Deferred","./_base/json","./_base/Color","./has!dojo-firebug?./_firebug/firebug","./_base/browser","./_base/loader"],function(_1,_2,_3,_4,_5,_6,_7){if(_1.config.isDebug){_3(["./_firebug/firebug"]);}true||_2.add("dojo-config-require",1);if(1){var _8=_1.config.require;if(_8){_8=_6.map(_5.isArray(_8)?_8:[_8],function(_9){return _9.replace(/\./g,"/");});if(_1.isAsync){_3(_8);}else{_7(1,function(){_3(_8);});}}}return _1;}); \ No newline at end of file diff --git a/lib/dojo/main.js.uncompressed.js b/lib/dojo/main.js.uncompressed.js new file mode 100644 index 00000000..18850843 --- /dev/null +++ b/lib/dojo/main.js.uncompressed.js @@ -0,0 +1,50 @@ +define("dojo/main", [ + "./_base/kernel", + "./has", + "require", + "./_base/sniff", + "./_base/lang", + "./_base/array", + "./ready", + "./_base/declare", + "./_base/connect", + "./_base/Deferred", + "./_base/json", + "./_base/Color", + "./has!dojo-firebug?./_firebug/firebug", + "./_base/browser", + "./_base/loader"], function(dojo, has, require, sniff, lang, array, ready){ + // module: + // dojo/main + // summary: + // This is the package main module for the dojo package; it loads dojo base appropriate for the execution environment. + + // the preferred way to load the dojo firebug console is by setting has("dojo-firebug") true in dojoConfig + // the isDebug config switch is for backcompat and will work fine in sync loading mode; it works in + // async mode too, but there's no guarantee when the module is loaded; therefore, if you need a firebug + // console guarnanteed at a particular spot in an app, either set config.has["dojo-firebug"] true before + // loading dojo.js or explicitly include dojo/_firebug/firebug in a dependency list. + if(dojo.config.isDebug){ + require(["./_firebug/firebug"]); + } + + // dojoConfig.require is deprecated; use the loader configuration property deps + true || has.add("dojo-config-require", 1); + if(1){ + var deps= dojo.config.require; + if(deps){ + // dojo.config.require may be dot notation + deps= array.map(lang.isArray(deps) ? deps : [deps], function(item){ return item.replace(/\./g, "/"); }); + if(dojo.isAsync){ + require(deps); + }else{ + // this is a bit janky; in 1.6- dojo is defined before these requires are applied; but in 1.7+ + // dojo isn't defined until returning from this module; this is only a problem in sync mode + // since we're in sync mode, we know we've got our loader with its priority ready queue + ready(1, function(){require(deps);}); + } + } + } + + return dojo; +}); diff --git a/lib/dojo/mouse.js b/lib/dojo/mouse.js new file mode 100644 index 00000000..397b5ee8 --- /dev/null +++ b/lib/dojo/mouse.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/mouse",["./_base/kernel","./on","./has","./dom","./_base/window"],function(_1,on,_2,_3,_4){_2.add("dom-quirks",_4.doc&&_4.doc.compatMode=="BackCompat");_2.add("events-mouseenter",_4.doc&&"onmouseenter" in _4.doc.createElement("div"));var _5;if(_2("dom-quirks")||!_2("dom-addeventlistener")){_5={LEFT:1,MIDDLE:4,RIGHT:2,isButton:function(e,_6){return e.button&_6;},isLeft:function(e){return e.button&1;},isMiddle:function(e){return e.button&4;},isRight:function(e){return e.button&2;}};}else{_5={LEFT:0,MIDDLE:1,RIGHT:2,isButton:function(e,_7){return e.button==_7;},isLeft:function(e){return e.button==0;},isMiddle:function(e){return e.button==1;},isRight:function(e){return e.button==2;}};}_1.mouseButtons=_5;function _8(_9,_a){var _b=function(_c,_d){return on(_c,_9,function(_e){if(!_3.isDescendant(_e.relatedTarget,_a?_e.target:_c)){return _d.call(this,_e);}});};if(!_a){_b.bubble=_8(_9,true);}return _b;};return {enter:_8("mouseover"),leave:_8("mouseout"),isLeft:_5.isLeft,isMiddle:_5.isMiddle,isRight:_5.isRight};}); \ No newline at end of file diff --git a/lib/dojo/mouse.js.uncompressed.js b/lib/dojo/mouse.js.uncompressed.js new file mode 100644 index 00000000..c6eceb47 --- /dev/null +++ b/lib/dojo/mouse.js.uncompressed.js @@ -0,0 +1,127 @@ +define("dojo/mouse", ["./_base/kernel", "./on", "./has", "./dom", "./_base/window"], function(dojo, on, has, dom, win){ + + /*===== + dojo.mouse = { + // summary: + // This module provide mouse event handling utility functions and exports + // mouseenter and mouseleave event emulation. + // enter: Synthetic Event + // This is an extension event for the mouseenter that IE provides, emulating the + // behavior on other browsers. + // leave: Synthetic Event + // This is an extension event for the mouseleave that IE provides, emulating the + // behavior on other browsers. + // isLeft: Function + // Test an event object (from a mousedown event) to see if the left button was pressed. + // isMiddle: Function + // Test an event object (from a mousedown event) to see if the middle button was pressed. + // isRight: Function + // Test an event object (from a mousedown event) to see if the right button was pressed. + // example: + // To use these events, you register a mouseenter like this: + // | define(["dojo/on", dojo/mouse"], function(on, mouse){ + // | on(targetNode, mouse.enter, function(event){ + // | dojo.addClass(targetNode, "highlighted"); + // | }); + // | on(targetNode, mouse.leave, function(event){ + // | dojo.removeClass(targetNode, "highlighted"); + // | }); + }; + ======*/ + + has.add("dom-quirks", win.doc && win.doc.compatMode == "BackCompat"); + has.add("events-mouseenter", win.doc && "onmouseenter" in win.doc.createElement("div")); + + var mouseButtons; + if(has("dom-quirks") || !has("dom-addeventlistener")){ + mouseButtons = { + LEFT: 1, + MIDDLE: 4, + RIGHT: 2, + // helper functions + isButton: function(e, button){ return e.button & button; }, + isLeft: function(e){ return e.button & 1; }, + isMiddle: function(e){ return e.button & 4; }, + isRight: function(e){ return e.button & 2; } + }; + }else{ + mouseButtons = { + LEFT: 0, + MIDDLE: 1, + RIGHT: 2, + // helper functions + isButton: function(e, button){ return e.button == button; }, + isLeft: function(e){ return e.button == 0; }, + isMiddle: function(e){ return e.button == 1; }, + isRight: function(e){ return e.button == 2; } + }; + } + dojo.mouseButtons = mouseButtons; + +/*===== + dojo.mouseButtons = { + // LEFT: Number + // Numeric value of the left mouse button for the platform. + LEFT: 0, + // MIDDLE: Number + // Numeric value of the middle mouse button for the platform. + MIDDLE: 1, + // RIGHT: Number + // Numeric value of the right mouse button for the platform. + RIGHT: 2, + + isButton: function(e, button){ + // summary: + // Checks an event object for a pressed button + // e: Event + // Event object to examine + // button: Number + // The button value (example: dojo.mouseButton.LEFT) + return e.button == button; // Boolean + }, + isLeft: function(e){ + // summary: + // Checks an event object for the pressed left button + // e: Event + // Event object to examine + return e.button == 0; // Boolean + }, + isMiddle: function(e){ + // summary: + // Checks an event object for the pressed middle button + // e: Event + // Event object to examine + return e.button == 1; // Boolean + }, + isRight: function(e){ + // summary: + // Checks an event object for the pressed right button + // e: Event + // Event object to examine + return e.button == 2; // Boolean + } + }; +=====*/ + + function eventHandler(type, mustBubble){ + // emulation of mouseenter/leave with mouseover/out using descendant checking + var handler = function(node, listener){ + return on(node, type, function(evt){ + if(!dom.isDescendant(evt.relatedTarget, mustBubble ? evt.target : node)){ + return listener.call(this, evt); + } + }); + }; + if(!mustBubble){ + handler.bubble = eventHandler(type, true); + } + return handler; + } + return { + enter: eventHandler("mouseover"), + leave: eventHandler("mouseout"), + isLeft: mouseButtons.isLeft, + isMiddle: mouseButtons.isMiddle, + isRight: mouseButtons.isRight + }; +}); diff --git a/lib/dojo/nls/ar/colors.js b/lib/dojo/nls/ar/colors.js index 50e4a128..a022327a 100644 --- a/lib/dojo/nls/ar/colors.js +++ b/lib/dojo/nls/ar/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"أزرق معدني فاتح","orangered":"أحمر مائل للبرتقالي","midnightblue":"أزرق بحري","cadetblue":"أزرق ملون بالرمادي","seashell":"أبيض مائل للأصفر فاتح","slategrey":"رمادي اردوازي","coral":"مرجاني","darkturquoise":"تركواز داكن","antiquewhite":"أبيض عتيق","mediumspringgreen":"أخضر ربيعي متوسط","salmon":"برتقالي وردي شاحب","darkgrey":"رمادي داكن","ivory":"عاجي","greenyellow":"أخضر مائل للأصفر","mistyrose":"وردي","lightsalmon":"فضي فاتح","silver":"فضي","dimgrey":"رمادي شاحب","orange":"برتقالي","white":"أبيض","navajowhite":"أبيض ملاحي","royalblue":"أزرق ملكي","deeppink":"أحمر وردي غامق","lime":"ليموني","oldlace":"برتقالي مائل للأصفر شاحب","chartreuse":"أخضر مائل للصفرة","darkcyan":"أزرق سماوي داكن","yellow":"أصفر","linen":"كتاني","olive":"أخضر زيتوني داكن","gold":"ذهبي","lawngreen":"أخضر بلون العشب","lightyellow":"أصفر فاتح","tan":"خمري","darkviolet":"بنفسجي داكن","lightslategrey":"رمادي اردوازي فاتح","grey":"رمادي","darkkhaki":"كاكي داكن","green":"أخضر","deepskyblue":"أزرق سماوي غامق","aqua":"أزرق مائي","sienna":"بني محروق","mintcream":"أصفر شاحب مائل للأخضر الزرعي","rosybrown":"بني وردي","mediumslateblue":"أزرق اردوازي متوسط","magenta":"أحمر قرمزي","lightseagreen":"أخضر مائل للأزرق فاتح","cyan":"أزرق سماوي","olivedrab":"أسود فاتح","darkgoldenrod":"أصفر ذهبي داكن","slateblue":"أزرق اردوازي","mediumaquamarine":"أزرق مائل للأخضر (زبرجد) متوسط","lavender":"أرجواني شاحب","mediumseagreen":"أخضر مائل للأزرق متوسط","maroon":"أحمر داكن","darkslategray":"رمادي اردوازي داكن","mediumturquoise":"تركواز متوسط","ghostwhite":"أبيض شفاف","darkblue":"أزرق داكن","mediumvioletred":"أحمر-بنفسجي متوسط","brown":"بني","lightgray":"رمادي فاتح","sandybrown":"بني مائل للصفرة","pink":"وردي","firebrick":"أصفر زاهي","indigo":"نيلي","snow":"أبيض ثلجي","darkorchid":"أرجواني داكن","turquoise":"تركواز","chocolate":"بني غامق","springgreen":"أخضر ربيعي","moccasin":"نحاسي أحمر","navy":"أزرق داكن","lemonchiffon":"أصفر شفاف","teal":"بترولي","floralwhite":"أبيض زهري","cornflowerblue":"أزرق عنبري","paleturquoise":"تركواز شاحب","purple":"ارجواني","gainsboro":"رمادي مائل للأزرق فاتح","plum":"أرجواني داكن","red":"أحمر","blue":"أزرق","forestgreen":"أخضر بلون أشجار الغابات","darkgreen":"أخضر داكن","honeydew":"أبيض مائل للأخضر","darkseagreen":"أخضر مائل للأزرق داكن","lightcoral":"مرجاني فاتح","palevioletred":"أحمر-بنفسجي شاحب","mediumpurple":"قرمزي متوسط","saddlebrown":"بني فاتح","darkmagenta":"قرمزي داكن","thistle":"ارجواني شاحب","whitesmoke":"دخان أبيض","wheat":"أخضر قمحي","violet":"بنفسجي","lightskyblue":"أزرق سماوي فاتح","goldenrod":"أصفر ذهبي","mediumblue":"أزرق متوسط","skyblue":"أزرق سماوي","crimson":"قرمزي","darksalmon":"فضي داكن","darkred":"أحمر داكن","darkslategrey":"رمادي اردوازي داكن","peru":"بني جملي","lightgrey":"رمادي فاتح","lightgoldenrodyellow":"أصفر ذهبي فاتح","blanchedalmond":"أخضر مائل للبياض","aliceblue":"أزرق فاتح","bisque":"أصفر برتقالي الى رمادي مصفر","slategray":"رمادي اردوازي","palegoldenrod":"أصفر ذهبي شاحب","darkorange":"برتقالي داكن","aquamarine":"أزرق مائل للأخضر (زبرجد)","lightgreen":"أخضر فاتح","burlywood":"خشبي","dodgerblue":"أزرق عنبري","darkgray":"رمادي داكن","lightcyan":"سماوي فاتح","powderblue":"أزرق مائل للأصفر","blueviolet":"أزرق-بنفسجي","orchid":"أرجواني فاتح","dimgray":"رمادي شاحب","beige":"بيج","fuchsia":"فوشيا","lavenderblush":"أحمر أرجواني","hotpink":"أحمر وردي زاهي","steelblue":"أزرق معدني","tomato":"أحمر مائل للأصفر","lightpink":"وردي فاتح","limegreen":"أخضر ليموني","indianred":"أحمر هندي","papayawhip":"خوخي فاتح","lightslategray":"رمادي اردوازي فاتح","gray":"رمادي","mediumorchid":"أرجواني متوسط","cornsilk":"حريري","black":"أسود","seagreen":"أخضر مائل للأزرق","darkslateblue":"أزرق اردوازي داكن","khaki":"كاكي","lightblue":"أزرق فاتح","palegreen":"أخضر شاحب","azure":"أزرق سماوي","peachpuff":"خوخي مائل للأصفر","darkolivegreen":"أخضر زيتوني داكن","yellowgreen":"أخضر مائل للأصفر"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/ar/colors",({aliceblue:"أزرق فاتح",antiquewhite:"أبيض عتيق",aqua:"أزرق مائي",aquamarine:"أزرق مائل للأخضر (زبرجد)",azure:"أزرق سماوي",beige:"بيج",bisque:"أصفر برتقالي الى رمادي مصفر",black:"أسود",blanchedalmond:"أخضر مائل للبياض",blue:"أزرق",blueviolet:"أزرق-بنفسجي",brown:"بني",burlywood:"خشبي",cadetblue:"أزرق ملون بالرمادي",chartreuse:"أخضر مائل للصفرة",chocolate:"بني غامق",coral:"مرجاني",cornflowerblue:"أزرق عنبري",cornsilk:"حريري",crimson:"قرمزي",cyan:"أزرق سماوي",darkblue:"أزرق داكن",darkcyan:"أزرق سماوي داكن",darkgoldenrod:"أصفر ذهبي داكن",darkgray:"رمادي داكن",darkgreen:"أخضر داكن",darkgrey:"رمادي داكن",darkkhaki:"كاكي داكن",darkmagenta:"قرمزي داكن",darkolivegreen:"أخضر زيتوني داكن",darkorange:"برتقالي داكن",darkorchid:"أرجواني داكن",darkred:"أحمر داكن",darksalmon:"فضي داكن",darkseagreen:"أخضر مائل للأزرق داكن",darkslateblue:"أزرق اردوازي داكن",darkslategray:"رمادي اردوازي داكن",darkslategrey:"رمادي اردوازي داكن",darkturquoise:"تركواز داكن",darkviolet:"بنفسجي داكن",deeppink:"أحمر وردي غامق",deepskyblue:"أزرق سماوي غامق",dimgray:"رمادي شاحب",dimgrey:"رمادي شاحب",dodgerblue:"أزرق عنبري",firebrick:"أصفر زاهي",floralwhite:"أبيض زهري",forestgreen:"أخضر بلون أشجار الغابات",fuchsia:"فوشيا",gainsboro:"رمادي مائل للأزرق فاتح",ghostwhite:"أبيض شفاف",gold:"ذهبي",goldenrod:"أصفر ذهبي",gray:"رمادي",green:"أخضر",greenyellow:"أخضر مائل للأصفر",grey:"رمادي",honeydew:"أبيض مائل للأخضر",hotpink:"أحمر وردي زاهي",indianred:"أحمر هندي",indigo:"نيلي",ivory:"عاجي",khaki:"كاكي",lavender:"أرجواني شاحب",lavenderblush:"أحمر أرجواني",lawngreen:"أخضر بلون العشب",lemonchiffon:"أصفر شفاف",lightblue:"أزرق فاتح",lightcoral:"مرجاني فاتح",lightcyan:"سماوي فاتح",lightgoldenrodyellow:"أصفر ذهبي فاتح",lightgray:"رمادي فاتح",lightgreen:"أخضر فاتح",lightgrey:"رمادي فاتح",lightpink:"وردي فاتح",lightsalmon:"فضي فاتح",lightseagreen:"أخضر مائل للأزرق فاتح",lightskyblue:"أزرق سماوي فاتح",lightslategray:"رمادي اردوازي فاتح",lightslategrey:"رمادي اردوازي فاتح",lightsteelblue:"أزرق معدني فاتح",lightyellow:"أصفر فاتح",lime:"ليموني",limegreen:"أخضر ليموني",linen:"كتاني",magenta:"أحمر قرمزي",maroon:"أحمر داكن",mediumaquamarine:"أزرق مائل للأخضر (زبرجد) متوسط",mediumblue:"أزرق متوسط",mediumorchid:"أرجواني متوسط",mediumpurple:"قرمزي متوسط",mediumseagreen:"أخضر مائل للأزرق متوسط",mediumslateblue:"أزرق اردوازي متوسط",mediumspringgreen:"أخضر ربيعي متوسط",mediumturquoise:"تركواز متوسط",mediumvioletred:"أحمر-بنفسجي متوسط",midnightblue:"أزرق بحري",mintcream:"أصفر شاحب مائل للأخضر الزرعي",mistyrose:"وردي",moccasin:"نحاسي أحمر",navajowhite:"أبيض ملاحي",navy:"أزرق داكن",oldlace:"برتقالي مائل للأصفر شاحب",olive:"أخضر زيتوني داكن",olivedrab:"أسود فاتح",orange:"برتقالي",orangered:"أحمر مائل للبرتقالي",orchid:"أرجواني فاتح",palegoldenrod:"أصفر ذهبي شاحب",palegreen:"أخضر شاحب",paleturquoise:"تركواز شاحب",palevioletred:"أحمر-بنفسجي شاحب",papayawhip:"خوخي فاتح",peachpuff:"خوخي مائل للأصفر",peru:"بني جملي",pink:"وردي",plum:"أرجواني داكن",powderblue:"أزرق مائل للأصفر",purple:"ارجواني",red:"أحمر",rosybrown:"بني وردي",royalblue:"أزرق ملكي",saddlebrown:"بني فاتح",salmon:"برتقالي وردي شاحب",sandybrown:"بني مائل للصفرة",seagreen:"أخضر مائل للأزرق",seashell:"أبيض مائل للأصفر فاتح",sienna:"بني محروق",silver:"فضي",skyblue:"أزرق سماوي",slateblue:"أزرق اردوازي",slategray:"رمادي اردوازي",slategrey:"رمادي اردوازي",snow:"أبيض ثلجي",springgreen:"أخضر ربيعي",steelblue:"أزرق معدني",tan:"خمري",teal:"بترولي",thistle:"ارجواني شاحب",tomato:"أحمر مائل للأصفر",transparent:"شفاف",turquoise:"تركواز",violet:"بنفسجي",wheat:"أخضر قمحي",white:"أبيض",whitesmoke:"دخان أبيض",yellow:"أصفر",yellowgreen:"أخضر مائل للأصفر"})); \ No newline at end of file diff --git a/lib/dojo/nls/ar/colors.js.uncompressed.js b/lib/dojo/nls/ar/colors.js.uncompressed.js new file mode 100644 index 00000000..0b7fa59d --- /dev/null +++ b/lib/dojo/nls/ar/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/ar/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "أزرق فاتح", + antiquewhite: "أبيض عتيق", + aqua: "أزرق مائي", + aquamarine: "أزرق مائل للأخضر (زبرجد)", + azure: "أزرق سماوي", + beige: "بيج", + bisque: "أصفر برتقالي الى رمادي مصفر", + black: "أسود", + blanchedalmond: "أخضر مائل للبياض", + blue: "أزرق", + blueviolet: "أزرق-بنفسجي", + brown: "بني", + burlywood: "خشبي", + cadetblue: "أزرق ملون بالرمادي", + chartreuse: "أخضر مائل للصفرة", + chocolate: "بني غامق", + coral: "مرجاني", + cornflowerblue: "أزرق عنبري", + cornsilk: "حريري", + crimson: "قرمزي", + cyan: "أزرق سماوي", + darkblue: "أزرق داكن", + darkcyan: "أزرق سماوي داكن", + darkgoldenrod: "أصفر ذهبي داكن", + darkgray: "رمادي داكن", + darkgreen: "أخضر داكن", + darkgrey: "رمادي داكن", // same as darkgray + darkkhaki: "كاكي داكن", + darkmagenta: "قرمزي داكن", + darkolivegreen: "أخضر زيتوني داكن", + darkorange: "برتقالي داكن", + darkorchid: "أرجواني داكن", + darkred: "أحمر داكن", + darksalmon: "فضي داكن", + darkseagreen: "أخضر مائل للأزرق داكن", + darkslateblue: "أزرق اردوازي داكن", + darkslategray: "رمادي اردوازي داكن", + darkslategrey: "رمادي اردوازي داكن", // same as darkslategray + darkturquoise: "تركواز داكن", + darkviolet: "بنفسجي داكن", + deeppink: "أحمر وردي غامق", + deepskyblue: "أزرق سماوي غامق", + dimgray: "رمادي شاحب", + dimgrey: "رمادي شاحب", // same as dimgray + dodgerblue: "أزرق عنبري", + firebrick: "أصفر زاهي", + floralwhite: "أبيض زهري", + forestgreen: "أخضر بلون أشجار الغابات", + fuchsia: "فوشيا", + gainsboro: "رمادي مائل للأزرق فاتح", + ghostwhite: "أبيض شفاف", + gold: "ذهبي", + goldenrod: "أصفر ذهبي", + gray: "رمادي", + green: "أخضر", + greenyellow: "أخضر مائل للأصفر", + grey: "رمادي", // same as gray + honeydew: "أبيض مائل للأخضر", + hotpink: "أحمر وردي زاهي", + indianred: "أحمر هندي", + indigo: "نيلي", + ivory: "عاجي", + khaki: "كاكي", + lavender: "أرجواني شاحب", + lavenderblush: "أحمر أرجواني", + lawngreen: "أخضر بلون العشب", + lemonchiffon: "أصفر شفاف", + lightblue: "أزرق فاتح", + lightcoral: "مرجاني فاتح", + lightcyan: "سماوي فاتح", + lightgoldenrodyellow: "أصفر ذهبي فاتح", + lightgray: "رمادي فاتح", + lightgreen: "أخضر فاتح", + lightgrey: "رمادي فاتح", // same as lightgray + lightpink: "وردي فاتح", + lightsalmon: "فضي فاتح", + lightseagreen: "أخضر مائل للأزرق فاتح", + lightskyblue: "أزرق سماوي فاتح", + lightslategray: "رمادي اردوازي فاتح", + lightslategrey: "رمادي اردوازي فاتح", // same as lightslategray + lightsteelblue: "أزرق معدني فاتح", + lightyellow: "أصفر فاتح", + lime: "ليموني", + limegreen: "أخضر ليموني", + linen: "كتاني", + magenta: "أحمر قرمزي", + maroon: "أحمر داكن", + mediumaquamarine: "أزرق مائل للأخضر (زبرجد) متوسط", + mediumblue: "أزرق متوسط", + mediumorchid: "أرجواني متوسط", + mediumpurple: "قرمزي متوسط", + mediumseagreen: "أخضر مائل للأزرق متوسط", + mediumslateblue: "أزرق اردوازي متوسط", + mediumspringgreen: "أخضر ربيعي متوسط", + mediumturquoise: "تركواز متوسط", + mediumvioletred: "أحمر-بنفسجي متوسط", + midnightblue: "أزرق بحري", + mintcream: "أصفر شاحب مائل للأخضر الزرعي", + mistyrose: "وردي", + moccasin: "نحاسي أحمر", + navajowhite: "أبيض ملاحي", + navy: "أزرق داكن", + oldlace: "برتقالي مائل للأصفر شاحب", + olive: "أخضر زيتوني داكن", + olivedrab: "أسود فاتح", + orange: "برتقالي", + orangered: "أحمر مائل للبرتقالي", + orchid: "أرجواني فاتح", + palegoldenrod: "أصفر ذهبي شاحب", + palegreen: "أخضر شاحب", + paleturquoise: "تركواز شاحب", + palevioletred: "أحمر-بنفسجي شاحب", + papayawhip: "خوخي فاتح", + peachpuff: "خوخي مائل للأصفر", + peru: "بني جملي", + pink: "وردي", + plum: "أرجواني داكن", + powderblue: "أزرق مائل للأصفر", + purple: "ارجواني", + red: "أحمر", + rosybrown: "بني وردي", + royalblue: "أزرق ملكي", + saddlebrown: "بني فاتح", + salmon: "برتقالي وردي شاحب", + sandybrown: "بني مائل للصفرة", + seagreen: "أخضر مائل للأزرق", + seashell: "أبيض مائل للأصفر فاتح", + sienna: "بني محروق", + silver: "فضي", + skyblue: "أزرق سماوي", + slateblue: "أزرق اردوازي", + slategray: "رمادي اردوازي", + slategrey: "رمادي اردوازي", // same as slategray + snow: "أبيض ثلجي", + springgreen: "أخضر ربيعي", + steelblue: "أزرق معدني", + tan: "خمري", + teal: "بترولي", + thistle: "ارجواني شاحب", + tomato: "أحمر مائل للأصفر", + transparent: "شفاف", + turquoise: "تركواز", + violet: "بنفسجي", + wheat: "أخضر قمحي", + white: "أبيض", + whitesmoke: "دخان أبيض", + yellow: "أصفر", + yellowgreen: "أخضر مائل للأصفر" +}) +); diff --git a/lib/dojo/nls/az/colors.js b/lib/dojo/nls/az/colors.js new file mode 100644 index 00000000..592accdf --- /dev/null +++ b/lib/dojo/nls/az/colors.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/az/colors",({"lightsteelblue":"açıq metal mavi","orangered":"narıncı qırmızı","midnightblue":"gecə mavisi","cadetblue":"dəniz mavisi","seashell":"dəniz səthi","slategrey":"boz şifer rəngi","coral":"mərcan","darkturquoise":"tünd firuzəyi","antiquewhite":"antik ağ","mediumspringgreen":"orta bahar yaşılı","salmon":"somon","darkgrey":"tünd boz","ivory":"fil dişi","greenyellow":"yaşıl-sarı","mistyrose":"gül qurusu","lightsalmon":"açıq somon","silver":"gümüşü","dimgrey":"açıq boz","orange":"narıncı","white":"ağ","navajowhite":"navajo ağı","royalblue":"parlaq tünd mavi","deeppink":"tünd çəhrayı","lime":"lomon yaşılı","oldlace":"köhnə krujeva","chartreuse":"chartreuse","darkcyan":"tünd firuzəyi","yellow":"sarı","linen":"kətan","olive":"zeytun","gold":"qızıl","lawngreen":"çəmən yaşılı","lightyellow":"açıq sarı","tan":"günəş yanığı","darkviolet":"tünd bənövşəyi","lightslategrey":"tünd şifer bozu","grey":"boz","darkkhaki":"tünd haki","green":"yaşıl","deepskyblue":"tünd səma mavisi","aqua":"dəniz mavisi","sienna":"tünd qəhvəyi","mintcream":"nanəli krem","rosybrown":"çəhrayımsı qəhvəyi","mediumslateblue":"orta şıfer bozu","magenta":"magenta","lightseagreen":"açıq dəniz yaşılı","cyan":"firuzəyi","olivedrab":"əsgər yaşılı","darkgoldenrod":"tünd sarı","slateblue":"şifer mavisi","mediumaquamarine":"orta akvamarin","lavender":"lavanta","mediumseagreen":"orta dəniz yaşılı","maroon":"tünd qırmızı","darkslategray":"tünd şifer bozu","mediumturquoise":"orta firuzəyi","ghostwhite":"ala","darkblue":"tünd mavi","mediumvioletred":"orta bənövşəyi-qırmızı","brown":"qəhvəyi","lightgray":"açıq boz","sandybrown":"qum rəngi","pink":"çəhrayı","firebrick":"yanmış kərpic rəngi","indigo":"indigo","snow":"qar","darkorchid":"tünd orkide","turquoise":"firuzəyi","chocolate":"şokolad","springgreen":"bahar yaşılı","moccasin":"mokosen","navy":"tünd göy","lemonchiffon":"limon rəngi","teal":"teal mavi","floralwhite":"çiçək ağı","cornflowerblue":"peyğəmbər çiçək mavisi","paleturquoise":"solğun firuzəyi","purple":"tünd qırmızı","gainsboro":"gainsboro","plum":"gavalı","red":"qırmızı","blue":"göy","forestgreen":"tünd dəniz yaşılı","darkgreen":"tünd yaşıl","honeydew":"bal saqqızı","darkseagreen":"tünd dəniz yaşılı","lightcoral":"açıq mərcan","palevioletred":"solğun bənövşəyi-qırmızı","mediumpurple":"orta tünd qırmızı","saddlebrown":"açıq qəhvəyi","darkmagenta":"tünd magenta","thistle":"dəvə tikanı","whitesmoke":"ağ duman","wheat":"buğdayı","violet":"bənövşəyi","lightskyblue":"açıq səma mavisi","goldenrod":"sapsarı","mediumblue":"orta göy","skyblue":"göy mavisi","crimson":"crimson","darksalmon":"tünd somon","darkred":"tünd qırmızı","darkslategrey":"tünd şifer bozu","peru":"peru","lightgrey":"açıq boz","lightgoldenrodyellow":"açıq qızılı","blanchedalmond":"solğun badamı","aliceblue":"alice mavisi","bisque":"biskvit","slategray":"şifer bozu","palegoldenrod":"açıq qızılı","darkorange":"tünd narıncı","aquamarine":"akvamarin","lightgreen":"açıq yaşıl","burlywood":"sarımsı qəhvə rəngi","dodgerblue":"toz mavisi","darkgray":"tünd boz","lightcyan":"açıq firuzəyi","powderblue":"pudra mavisi","blueviolet":"mavi-bənövşəyi","orchid":"orkide","dimgray":"solğun boz","beige":"bej","fuchsia":"fuşya","lavenderblush":"lavanta tünd qırmızısı","hotpink":"tünd çəhrayı","steelblue":"metal mavisi","tomato":"pomidor","lightpink":"açıq çəhrayı","limegreen":"əhəng yaşılı","indianred":"qızıldərili qırmızısı","papayawhip":"papaya qamçısı","lightslategray":"açıq şifer bozu","gray":"boz","mediumorchid":"orta orkide","cornsilk":"qarğıdalı rəngi","black":"qara","seagreen":"dəniz yaşılı","darkslateblue":"tünd şifer bozu","khaki":"haki","lightblue":"açıq mavi","palegreen":"solğun yaşıl","azure":"azur mavisi","peachpuff":"açıq şaftalı","darkolivegreen":"tünd zeytun yaşılı","yellowgreen":"sarı-yaşıl"})); \ No newline at end of file diff --git a/lib/dojo/nls/az/colors.js.uncompressed.js b/lib/dojo/nls/az/colors.js.uncompressed.js new file mode 100644 index 00000000..2e435f99 --- /dev/null +++ b/lib/dojo/nls/az/colors.js.uncompressed.js @@ -0,0 +1,153 @@ +define( +"dojo/nls/az/colors", //begin v1.x content +({ + "lightsteelblue":"açıq metal mavi", + "orangered" :"narıncı qırmızı", + "midnightblue" :"gecə mavisi", + "cadetblue" :"dəniz mavisi" , + "seashell" :"dəniz səthi", + "slategrey" :"boz şifer rəngi", + "coral" :"mərcan", + "darkturquoise" :"tünd firuzəyi", + "antiquewhite" :"antik ağ", + "mediumspringgreen" :"orta bahar yaşılı", + "salmon" :"somon", + "darkgrey" :"tünd boz", + "ivory" :"fil dişi", + "greenyellow" :"yaşıl-sarı", + "mistyrose" :"gül qurusu", + "lightsalmon" :"açıq somon", + "silver" :"gümüşü", + "dimgrey" :"açıq boz", + "orange" :"narıncı", + "white" :"ağ", + "navajowhite" :"navajo ağı", + "royalblue" :"parlaq tünd mavi" , + "deeppink" :"tünd çəhrayı", + "lime" :"lomon yaşılı", + "oldlace" :"köhnə krujeva", + "chartreuse" :"chartreuse", + "darkcyan" :"tünd firuzəyi", + "yellow" :"sarı", + "linen" :"kətan", + "olive" :"zeytun", + "gold" :"qızıl", + "lawngreen" :"çəmən yaşılı", + "lightyellow" :"açıq sarı", + "tan" :"günəş yanığı", + "darkviolet" :"tünd bənövşəyi", + "lightslategrey" :"tünd şifer bozu", + "grey" :"boz", + "darkkhaki" :"tünd haki", + "green" :"yaşıl", + "deepskyblue" :"tünd səma mavisi", + "aqua" :"dəniz mavisi", + "sienna" :"tünd qəhvəyi", + "mintcream" :"nanəli krem", + "rosybrown" :"çəhrayımsı qəhvəyi", + "mediumslateblue" :"orta şıfer bozu", + "magenta" :"magenta", + "lightseagreen" :"açıq dəniz yaşılı", + "cyan" :"firuzəyi", + "olivedrab" :"əsgər yaşılı", + "darkgoldenrod" :"tünd sarı", + "slateblue" :"şifer mavisi", + "mediumaquamarine" :"orta akvamarin", + "lavender" :"lavanta", + "mediumseagreen" :"orta dəniz yaşılı", + "maroon" :"tünd qırmızı", + "darkslategray" :"tünd şifer bozu", + "mediumturquoise" :"orta firuzəyi", + "ghostwhite" :"ala", + "darkblue" :"tünd mavi", + "mediumvioletred" :"orta bənövşəyi-qırmızı", + "brown" :"qəhvəyi", + "lightgray" :"açıq boz", + "sandybrown" :"qum rəngi", + "pink" :"çəhrayı", + "firebrick" :"yanmış kərpic rəngi", + "indigo" :"indigo", + "snow" :"qar", + "darkorchid" :"tünd orkide", + "turquoise" :"firuzəyi", + "chocolate" :"şokolad", + "springgreen" :"bahar yaşılı", + "moccasin" :"mokosen", + "navy" :"tünd göy", + "lemonchiffon" :"limon rəngi", + "teal" :"teal mavi", + "floralwhite" :"çiçək ağı", + "cornflowerblue" :"peyğəmbər çiçək mavisi", + "paleturquoise" :"solğun firuzəyi", + "purple" :"tünd qırmızı", + "gainsboro" :"gainsboro", + "plum" :"gavalı", + "red" :"qırmızı", + "blue" :"göy", + "forestgreen" :"tünd dəniz yaşılı", + "darkgreen" :"tünd yaşıl", + "honeydew" :"bal saqqızı", + "darkseagreen" :"tünd dəniz yaşılı", + "lightcoral" :"açıq mərcan", + "palevioletred" :"solğun bənövşəyi-qırmızı", + "mediumpurple" :"orta tünd qırmızı", + "saddlebrown" :"açıq qəhvəyi", + "darkmagenta" :"tünd magenta", + "thistle" :"dəvə tikanı", + "whitesmoke" :"ağ duman", + "wheat" :"buğdayı", + "violet" :"bənövşəyi", + "lightskyblue" :"açıq səma mavisi" , + "goldenrod" :"sapsarı", + "mediumblue" :"orta göy", + "skyblue" :"göy mavisi", + "crimson" :"crimson", + "darksalmon" :"tünd somon", + "darkred" :"tünd qırmızı", + "darkslategrey" :"tünd şifer bozu", + "peru" :"peru", + "lightgrey" :"açıq boz", + "lightgoldenrodyellow" :"açıq qızılı", + "blanchedalmond" :"solğun badamı", + "aliceblue" :"alice mavisi", + "bisque" :"biskvit", + "slategray" :"şifer bozu", + "palegoldenrod" :"açıq qızılı", + "darkorange" :"tünd narıncı", + "aquamarine" :"akvamarin", + "lightgreen" :"açıq yaşıl", + "burlywood" :"sarımsı qəhvə rəngi", + "dodgerblue" :"toz mavisi", + "darkgray" :"tünd boz", + "lightcyan" :"açıq firuzəyi", + "powderblue" :"pudra mavisi", + "blueviolet" :"mavi-bənövşəyi", + "orchid" :"orkide", + "dimgray" :"solğun boz", + "beige" :"bej", + "fuchsia" :"fuşya", + "lavenderblush" :"lavanta tünd qırmızısı", + "hotpink" :"tünd çəhrayı", + "steelblue" :"metal mavisi", + "tomato" :"pomidor", + "lightpink" :"açıq çəhrayı", + "limegreen" :"əhəng yaşılı", + "indianred" :"qızıldərili qırmızısı", + "papayawhip" :"papaya qamçısı", + "lightslategray" :"açıq şifer bozu", + "gray" :"boz", + "mediumorchid" :"orta orkide", + "cornsilk" :"qarğıdalı rəngi", + "black" :"qara", + "seagreen" :"dəniz yaşılı", + "darkslateblue" :"tünd şifer bozu", + "khaki" :"haki", + "lightblue" :"açıq mavi", + "palegreen" :"solğun yaşıl", + "azure" :"azur mavisi", + "peachpuff" :"açıq şaftalı", + "darkolivegreen" :"tünd zeytun yaşılı", + "yellowgreen" :"sarı-yaşıl" +}) +//end v1.x content +); \ No newline at end of file diff --git a/lib/dojo/nls/ca/colors.js b/lib/dojo/nls/ca/colors.js index 0f1461a8..0fafe55e 100644 --- a/lib/dojo/nls/ca/colors.js +++ b/lib/dojo/nls/ca/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"blau acer clar","orangered":"taronja vermellós","midnightblue":"blau mitjanit","cadetblue":"blau marí","seashell":"petxina marina","slategrey":"gris pissarra","coral":"corall","darkturquoise":"turquesa fosc","antiquewhite":"blanc antic","mediumspringgreen":"verd primavera mitjà","salmon":"salmó","darkgrey":"gris fosc","ivory":"marbre","greenyellow":"verd grogós","mistyrose":"rosa dens","lightsalmon":"salmó clar","silver":"argent","dimgrey":"gris fosc","orange":"taronja","white":"blanc","navajowhite":"blanc Navajo","royalblue":"blau marí intens","deeppink":"rosa profund","lime":"verd llimona","oldlace":"rosa cremós","chartreuse":"Llimona pàl·lid","darkcyan":"cian fosc","yellow":"groc","linen":"lli","olive":"oliva","gold":"daurat","lawngreen":"verd gespa","lightyellow":"groc clar","tan":"tan","darkviolet":"violeta fosc","lightslategrey":"gris pissarra clar","grey":"gris","darkkhaki":"caqui fosc","green":"verd","deepskyblue":"blau cel profund","aqua":"aigua","sienna":"siena","mintcream":"menta pàl·lid","rosybrown":"marró rosat","mediumslateblue":"blau pissarra mitjà","magenta":"magenta","lightseagreen":"verd marí clar","cyan":"cian","olivedrab":"gris oliva","darkgoldenrod":"ocre fosc","slateblue":"blau pissarra","mediumaquamarine":"aiguamarina mitjana","lavender":"lavanda","mediumseagreen":"verd marí mitjà","maroon":"marró vermellós","darkslategray":"gris pissarra fosc","mediumturquoise":"turquesa mitjana","ghostwhite":"blanc fantasma","darkblue":"blau fosc","mediumvioletred":"vermell violeta mitjà","brown":"marró","lightgray":"gris clar","sandybrown":"marró arenós","pink":"rosa","firebrick":"maó refractari","indigo":"índigo","snow":"neu","darkorchid":"orquídia fosc","turquoise":"turquesa","chocolate":"xocolata","springgreen":"verd de primavera","moccasin":"mocassí","navy":"blau marí","lemonchiffon":"groc brisa","teal":"verd blavós","floralwhite":"blanc floral","cornflowerblue":"blau blauet","paleturquoise":"turquesa pàl·lid","purple":"porpra","gainsboro":"gainsboro","plum":"pruna","red":"vermell","blue":"blau","forestgreen":"verd bosc","darkgreen":"verd fosc","honeydew":"rosada de mel","darkseagreen":"verd marí fosc","lightcoral":"corall clar","palevioletred":"vermell porpra pàl·lid","mediumpurple":"porpra mitjana","saddlebrown":"marró mitjà","darkmagenta":"magenta fosc","thistle":"card","whitesmoke":"blanc fumat","wheat":"blat","violet":"violeta","lightskyblue":"blau cel clar","goldenrod":"ocre","mediumblue":"blau mitjà","skyblue":"blau cel","crimson":"carmesí","darksalmon":"salmó fosc","darkred":"vermell fosc","darkslategrey":"gris pissarra fosc","peru":"Perú","lightgrey":"gris clar","lightgoldenrodyellow":"groc ocre clar","blanchedalmond":"ametlla pàl·lid","aliceblue":"blau cian clar","bisque":"crema","slategray":"gris pissarra","palegoldenrod":"ocre pàl·lid","darkorange":"taronja fosc","aquamarine":"aiguamarina","lightgreen":"verd clar","burlywood":"marró arenós","dodgerblue":"blau Dodger","darkgray":"gris fosc","lightcyan":"cian clar","powderblue":"blau grisós","blueviolet":"blau violeta","orchid":"orquídia","dimgray":"gris fosc","beige":"beix","fuchsia":"fúcsia","lavenderblush":"lavanda vermellosa","hotpink":"rosa fúcsia","steelblue":"blau acer","tomato":"tomàquet","lightpink":"rosa clar","limegreen":"verd llimona verda","indianred":"vermell indi","papayawhip":"préssec pastel","lightslategray":"gris pissarra clar","gray":"gris","mediumorchid":"orquídia mitjana","cornsilk":"cru","black":"negre","seagreen":"verd marí","darkslateblue":"blau pissarra fosc","khaki":"caqui","lightblue":"blau clar","palegreen":"verd pàl·lid","azure":"atzur","peachpuff":"préssec","darkolivegreen":"verd oliva fosc","yellowgreen":"verd grogós"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/ca/colors",({aliceblue:"blau cian clar",antiquewhite:"blanc antic",aqua:"aigua",aquamarine:"aiguamarina",azure:"atzur",beige:"beix",bisque:"crema",black:"negre",blanchedalmond:"ametlla pàl·lid",blue:"blau",blueviolet:"blau violeta",brown:"marró",burlywood:"marró arenós",cadetblue:"blau marí",chartreuse:"Llimona pàl·lid",chocolate:"xocolata",coral:"corall",cornflowerblue:"blau blauet",cornsilk:"cru",crimson:"carmesí",cyan:"cian",darkblue:"blau fosc",darkcyan:"cian fosc",darkgoldenrod:"ocre fosc",darkgray:"gris fosc",darkgreen:"verd fosc",darkgrey:"gris fosc",darkkhaki:"caqui fosc",darkmagenta:"magenta fosc",darkolivegreen:"verd oliva fosc",darkorange:"taronja fosc",darkorchid:"orquídia fosc",darkred:"vermell fosc",darksalmon:"salmó fosc",darkseagreen:"verd marí fosc",darkslateblue:"blau pissarra fosc",darkslategray:"gris pissarra fosc",darkslategrey:"gris pissarra fosc",darkturquoise:"turquesa fosc",darkviolet:"violeta fosc",deeppink:"rosa profund",deepskyblue:"blau cel profund",dimgray:"gris fosc",dimgrey:"gris fosc",dodgerblue:"blau Dodger",firebrick:"maó refractari",floralwhite:"blanc floral",forestgreen:"verd bosc",fuchsia:"fúcsia",gainsboro:"gainsboro",ghostwhite:"blanc fantasma",gold:"daurat",goldenrod:"ocre",gray:"gris",green:"verd",greenyellow:"verd grogós",grey:"gris",honeydew:"rosada de mel",hotpink:"rosa fúcsia",indianred:"vermell indi",indigo:"índigo",ivory:"marbre",khaki:"caqui",lavender:"lavanda",lavenderblush:"lavanda vermellosa",lawngreen:"verd gespa",lemonchiffon:"groc brisa",lightblue:"blau clar",lightcoral:"corall clar",lightcyan:"cian clar",lightgoldenrodyellow:"groc ocre clar",lightgray:"gris clar",lightgreen:"verd clar",lightgrey:"gris clar",lightpink:"rosa clar",lightsalmon:"salmó clar",lightseagreen:"verd marí clar",lightskyblue:"blau cel clar",lightslategray:"gris pissarra clar",lightslategrey:"gris pissarra clar",lightsteelblue:"blau acer clar",lightyellow:"groc clar",lime:"verd llimona",limegreen:"verd llimona verda",linen:"lli",magenta:"magenta",maroon:"marró vermellós",mediumaquamarine:"aiguamarina mitjana",mediumblue:"blau mitjà",mediumorchid:"orquídia mitjana",mediumpurple:"porpra mitjana",mediumseagreen:"verd marí mitjà",mediumslateblue:"blau pissarra mitjà",mediumspringgreen:"verd primavera mitjà",mediumturquoise:"turquesa mitjana",mediumvioletred:"vermell violeta mitjà",midnightblue:"blau mitjanit",mintcream:"menta pàl·lid",mistyrose:"rosa dens",moccasin:"mocassí",navajowhite:"blanc Navajo",navy:"blau marí",oldlace:"rosa cremós",olive:"oliva",olivedrab:"gris oliva",orange:"taronja",orangered:"taronja vermellós",orchid:"orquídia",palegoldenrod:"ocre pàl·lid",palegreen:"verd pàl·lid",paleturquoise:"turquesa pàl·lid",palevioletred:"vermell porpra pàl·lid",papayawhip:"préssec pastel",peachpuff:"préssec",peru:"Perú",pink:"rosa",plum:"pruna",powderblue:"blau grisós",purple:"porpra",red:"vermell",rosybrown:"marró rosat",royalblue:"blau marí intens",saddlebrown:"marró mitjà",salmon:"salmó",sandybrown:"marró arenós",seagreen:"verd marí",seashell:"petxina marina",sienna:"siena",silver:"argent",skyblue:"blau cel",slateblue:"blau pissarra",slategray:"gris pissarra",slategrey:"gris pissarra",snow:"neu",springgreen:"verd de primavera",steelblue:"blau acer",tan:"tan",teal:"verd blavós",thistle:"card",tomato:"tomàquet",transparent:"transparent",turquoise:"turquesa",violet:"violeta",wheat:"blat",white:"blanc",whitesmoke:"blanc fumat",yellow:"groc",yellowgreen:"verd grogós"})); \ No newline at end of file diff --git a/lib/dojo/nls/ca/colors.js.uncompressed.js b/lib/dojo/nls/ca/colors.js.uncompressed.js new file mode 100644 index 00000000..520654d9 --- /dev/null +++ b/lib/dojo/nls/ca/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/ca/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "blau cian clar", + antiquewhite: "blanc antic", + aqua: "aigua", + aquamarine: "aiguamarina", + azure: "atzur", + beige: "beix", + bisque: "crema", + black: "negre", + blanchedalmond: "ametlla pàl·lid", + blue: "blau", + blueviolet: "blau violeta", + brown: "marró", + burlywood: "marró arenós", + cadetblue: "blau marí", + chartreuse: "Llimona pàl·lid", + chocolate: "xocolata", + coral: "corall", + cornflowerblue: "blau blauet", + cornsilk: "cru", + crimson: "carmesí", + cyan: "cian", + darkblue: "blau fosc", + darkcyan: "cian fosc", + darkgoldenrod: "ocre fosc", + darkgray: "gris fosc", + darkgreen: "verd fosc", + darkgrey: "gris fosc", // same as darkgray + darkkhaki: "caqui fosc", + darkmagenta: "magenta fosc", + darkolivegreen: "verd oliva fosc", + darkorange: "taronja fosc", + darkorchid: "orquídia fosc", + darkred: "vermell fosc", + darksalmon: "salmó fosc", + darkseagreen: "verd marí fosc", + darkslateblue: "blau pissarra fosc", + darkslategray: "gris pissarra fosc", + darkslategrey: "gris pissarra fosc", // same as darkslategray + darkturquoise: "turquesa fosc", + darkviolet: "violeta fosc", + deeppink: "rosa profund", + deepskyblue: "blau cel profund", + dimgray: "gris fosc", + dimgrey: "gris fosc", // same as dimgray + dodgerblue: "blau Dodger", + firebrick: "maó refractari", + floralwhite: "blanc floral", + forestgreen: "verd bosc", + fuchsia: "fúcsia", + gainsboro: "gainsboro", + ghostwhite: "blanc fantasma", + gold: "daurat", + goldenrod: "ocre", + gray: "gris", + green: "verd", + greenyellow: "verd grogós", + grey: "gris", // same as gray + honeydew: "rosada de mel", + hotpink: "rosa fúcsia", + indianred: "vermell indi", + indigo: "índigo", + ivory: "marbre", + khaki: "caqui", + lavender: "lavanda", + lavenderblush: "lavanda vermellosa", + lawngreen: "verd gespa", + lemonchiffon: "groc brisa", + lightblue: "blau clar", + lightcoral: "corall clar", + lightcyan: "cian clar", + lightgoldenrodyellow: "groc ocre clar", + lightgray: "gris clar", + lightgreen: "verd clar", + lightgrey: "gris clar", // same as lightgray + lightpink: "rosa clar", + lightsalmon: "salmó clar", + lightseagreen: "verd marí clar", + lightskyblue: "blau cel clar", + lightslategray: "gris pissarra clar", + lightslategrey: "gris pissarra clar", // same as lightslategray + lightsteelblue: "blau acer clar", + lightyellow: "groc clar", + lime: "verd llimona", + limegreen: "verd llimona verda", + linen: "lli", + magenta: "magenta", + maroon: "marró vermellós", + mediumaquamarine: "aiguamarina mitjana", + mediumblue: "blau mitjà", + mediumorchid: "orquídia mitjana", + mediumpurple: "porpra mitjana", + mediumseagreen: "verd marí mitjà", + mediumslateblue: "blau pissarra mitjà", + mediumspringgreen: "verd primavera mitjà", + mediumturquoise: "turquesa mitjana", + mediumvioletred: "vermell violeta mitjà", + midnightblue: "blau mitjanit", + mintcream: "menta pàl·lid", + mistyrose: "rosa dens", + moccasin: "mocassí", + navajowhite: "blanc Navajo", + navy: "blau marí", + oldlace: "rosa cremós", + olive: "oliva", + olivedrab: "gris oliva", + orange: "taronja", + orangered: "taronja vermellós", + orchid: "orquídia", + palegoldenrod: "ocre pàl·lid", + palegreen: "verd pàl·lid", + paleturquoise: "turquesa pàl·lid", + palevioletred: "vermell porpra pàl·lid", + papayawhip: "préssec pastel", + peachpuff: "préssec", + peru: "Perú", + pink: "rosa", + plum: "pruna", + powderblue: "blau grisós", + purple: "porpra", + red: "vermell", + rosybrown: "marró rosat", + royalblue: "blau marí intens", + saddlebrown: "marró mitjà", + salmon: "salmó", + sandybrown: "marró arenós", + seagreen: "verd marí", + seashell: "petxina marina", + sienna: "siena", + silver: "argent", + skyblue: "blau cel", + slateblue: "blau pissarra", + slategray: "gris pissarra", + slategrey: "gris pissarra", // same as slategray + snow: "neu", + springgreen: "verd de primavera", + steelblue: "blau acer", + tan: "tan", + teal: "verd blavós", + thistle: "card", + tomato: "tomàquet", + transparent: "transparent", + turquoise: "turquesa", + violet: "violeta", + wheat: "blat", + white: "blanc", + whitesmoke: "blanc fumat", + yellow: "groc", + yellowgreen: "verd grogós" +}) +); diff --git a/lib/dojo/nls/colors.js b/lib/dojo/nls/colors.js index 454e644e..2d78bab1 100644 --- a/lib/dojo/nls/colors.js +++ b/lib/dojo/nls/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/colors",{root:({aliceblue:"alice blue",antiquewhite:"antique white",aqua:"aqua",aquamarine:"aquamarine",azure:"azure",beige:"beige",bisque:"bisque",black:"black",blanchedalmond:"blanched almond",blue:"blue",blueviolet:"blue-violet",brown:"brown",burlywood:"burlywood",cadetblue:"cadet blue",chartreuse:"chartreuse",chocolate:"chocolate",coral:"coral",cornflowerblue:"cornflower blue",cornsilk:"cornsilk",crimson:"crimson",cyan:"cyan",darkblue:"dark blue",darkcyan:"dark cyan",darkgoldenrod:"dark goldenrod",darkgray:"dark gray",darkgreen:"dark green",darkgrey:"dark gray",darkkhaki:"dark khaki",darkmagenta:"dark magenta",darkolivegreen:"dark olive green",darkorange:"dark orange",darkorchid:"dark orchid",darkred:"dark red",darksalmon:"dark salmon",darkseagreen:"dark sea green",darkslateblue:"dark slate blue",darkslategray:"dark slate gray",darkslategrey:"dark slate gray",darkturquoise:"dark turquoise",darkviolet:"dark violet",deeppink:"deep pink",deepskyblue:"deep sky blue",dimgray:"dim gray",dimgrey:"dim gray",dodgerblue:"dodger blue",firebrick:"fire brick",floralwhite:"floral white",forestgreen:"forest green",fuchsia:"fuchsia",gainsboro:"gainsboro",ghostwhite:"ghost white",gold:"gold",goldenrod:"goldenrod",gray:"gray",green:"green",greenyellow:"green-yellow",grey:"gray",honeydew:"honeydew",hotpink:"hot pink",indianred:"indian red",indigo:"indigo",ivory:"ivory",khaki:"khaki",lavender:"lavender",lavenderblush:"lavender blush",lawngreen:"lawn green",lemonchiffon:"lemon chiffon",lightblue:"light blue",lightcoral:"light coral",lightcyan:"light cyan",lightgoldenrodyellow:"light goldenrod yellow",lightgray:"light gray",lightgreen:"light green",lightgrey:"light gray",lightpink:"light pink",lightsalmon:"light salmon",lightseagreen:"light sea green",lightskyblue:"light sky blue",lightslategray:"light slate gray",lightslategrey:"light slate gray",lightsteelblue:"light steel blue",lightyellow:"light yellow",lime:"lime",limegreen:"lime green",linen:"linen",magenta:"magenta",maroon:"maroon",mediumaquamarine:"medium aquamarine",mediumblue:"medium blue",mediumorchid:"medium orchid",mediumpurple:"medium purple",mediumseagreen:"medium sea green",mediumslateblue:"medium slate blue",mediumspringgreen:"medium spring green",mediumturquoise:"medium turquoise",mediumvioletred:"medium violet-red",midnightblue:"midnight blue",mintcream:"mint cream",mistyrose:"misty rose",moccasin:"moccasin",navajowhite:"navajo white",navy:"navy",oldlace:"old lace",olive:"olive",olivedrab:"olive drab",orange:"orange",orangered:"orange red",orchid:"orchid",palegoldenrod:"pale goldenrod",palegreen:"pale green",paleturquoise:"pale turquoise",palevioletred:"pale violet-red",papayawhip:"papaya whip",peachpuff:"peach puff",peru:"peru",pink:"pink",plum:"plum",powderblue:"powder blue",purple:"purple",red:"red",rosybrown:"rosy brown",royalblue:"royal blue",saddlebrown:"saddle brown",salmon:"salmon",sandybrown:"sandy brown",seagreen:"sea green",seashell:"seashell",sienna:"sienna",silver:"silver",skyblue:"sky blue",slateblue:"slate blue",slategray:"slate gray",slategrey:"slate gray",snow:"snow",springgreen:"spring green",steelblue:"steel blue",tan:"tan",teal:"teal",thistle:"thistle",tomato:"tomato",transparent:"transparent",turquoise:"turquoise",violet:"violet",wheat:"wheat",white:"white",whitesmoke:"white smoke",yellow:"yellow",yellowgreen:"yellow green"}),"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}); \ No newline at end of file diff --git a/lib/dojo/nls/colors.js.uncompressed.js b/lib/dojo/nls/colors.js.uncompressed.js new file mode 100644 index 00000000..ee619d0d --- /dev/null +++ b/lib/dojo/nls/colors.js.uncompressed.js @@ -0,0 +1,191 @@ +define("dojo/nls/colors", { root: +//begin v1.x content +({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + +//Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color e.g. gray vs. gray. +//TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? +aliceblue: "alice blue", +antiquewhite: "antique white", +aqua: "aqua", +aquamarine: "aquamarine", +azure: "azure", +beige: "beige", +bisque: "bisque", +black: "black", +blanchedalmond: "blanched almond", +blue: "blue", +blueviolet: "blue-violet", +brown: "brown", +burlywood: "burlywood", +cadetblue: "cadet blue", +chartreuse: "chartreuse", +chocolate: "chocolate", +coral: "coral", +cornflowerblue: "cornflower blue", +cornsilk: "cornsilk", +crimson: "crimson", +cyan: "cyan", +darkblue: "dark blue", +darkcyan: "dark cyan", +darkgoldenrod: "dark goldenrod", +darkgray: "dark gray", +darkgreen: "dark green", +darkgrey: "dark gray", // same as darkgray +darkkhaki: "dark khaki", +darkmagenta: "dark magenta", +darkolivegreen: "dark olive green", +darkorange: "dark orange", +darkorchid: "dark orchid", +darkred: "dark red", +darksalmon: "dark salmon", +darkseagreen: "dark sea green", +darkslateblue: "dark slate blue", +darkslategray: "dark slate gray", +darkslategrey: "dark slate gray", // same as darkslategray +darkturquoise: "dark turquoise", +darkviolet: "dark violet", +deeppink: "deep pink", +deepskyblue: "deep sky blue", +dimgray: "dim gray", +dimgrey: "dim gray", // same as dimgray +dodgerblue: "dodger blue", +firebrick: "fire brick", +floralwhite: "floral white", +forestgreen: "forest green", +fuchsia: "fuchsia", +gainsboro: "gainsboro", +ghostwhite: "ghost white", +gold: "gold", +goldenrod: "goldenrod", +gray: "gray", +green: "green", +greenyellow: "green-yellow", +grey: "gray", // same as gray +honeydew: "honeydew", +hotpink: "hot pink", +indianred: "indian red", +indigo: "indigo", +ivory: "ivory", +khaki: "khaki", +lavender: "lavender", +lavenderblush: "lavender blush", +lawngreen: "lawn green", +lemonchiffon: "lemon chiffon", +lightblue: "light blue", +lightcoral: "light coral", +lightcyan: "light cyan", +lightgoldenrodyellow: "light goldenrod yellow", +lightgray: "light gray", +lightgreen: "light green", +lightgrey: "light gray", // same as lightgray +lightpink: "light pink", +lightsalmon: "light salmon", +lightseagreen: "light sea green", +lightskyblue: "light sky blue", +lightslategray: "light slate gray", +lightslategrey: "light slate gray", // same as lightslategray +lightsteelblue: "light steel blue", +lightyellow: "light yellow", +lime: "lime", +limegreen: "lime green", +linen: "linen", +magenta: "magenta", +maroon: "maroon", +mediumaquamarine: "medium aquamarine", +mediumblue: "medium blue", +mediumorchid: "medium orchid", +mediumpurple: "medium purple", +mediumseagreen: "medium sea green", +mediumslateblue: "medium slate blue", +mediumspringgreen: "medium spring green", +mediumturquoise: "medium turquoise", +mediumvioletred: "medium violet-red", +midnightblue: "midnight blue", +mintcream: "mint cream", +mistyrose: "misty rose", +moccasin: "moccasin", +navajowhite: "navajo white", +navy: "navy", +oldlace: "old lace", +olive: "olive", +olivedrab: "olive drab", +orange: "orange", +orangered: "orange red", +orchid: "orchid", +palegoldenrod: "pale goldenrod", +palegreen: "pale green", +paleturquoise: "pale turquoise", +palevioletred: "pale violet-red", +papayawhip: "papaya whip", +peachpuff: "peach puff", +peru: "peru", +pink: "pink", +plum: "plum", +powderblue: "powder blue", +purple: "purple", +red: "red", +rosybrown: "rosy brown", +royalblue: "royal blue", +saddlebrown: "saddle brown", +salmon: "salmon", +sandybrown: "sandy brown", +seagreen: "sea green", +seashell: "seashell", +sienna: "sienna", +silver: "silver", +skyblue: "sky blue", +slateblue: "slate blue", +slategray: "slate gray", +slategrey: "slate gray", // same as slategray +snow: "snow", +springgreen: "spring green", +steelblue: "steel blue", +tan: "tan", +teal: "teal", +thistle: "thistle", +tomato: "tomato", +transparent: "transparent", +turquoise: "turquoise", +violet: "violet", +wheat: "wheat", +white: "white", +whitesmoke: "white smoke", +yellow: "yellow", +yellowgreen: "yellow green" +}) +//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/dojo/nls/cs/colors.js b/lib/dojo/nls/cs/colors.js index 7ae5d308..1d93db9a 100644 --- a/lib/dojo/nls/cs/colors.js +++ b/lib/dojo/nls/cs/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"světlá ocelová modrá","orangered":"oranžovočervená","midnightblue":"temně modrá","cadetblue":"šedomodrá","seashell":"lasturová","slategrey":"břidlicová šedá","coral":"korálová červená","darkturquoise":"tmavě tyrkysová","antiquewhite":"krémově bílá","mediumspringgreen":"střední jarní zelená","salmon":"lososová","darkgrey":"tmavě šedá","ivory":"slonovinová","greenyellow":"zelenožlutá","mistyrose":"růžovobílá","lightsalmon":"světle lososová","silver":"stříbrná","dimgrey":"kouřově šedá","orange":"oranžová","white":"bílá","navajowhite":"světle krémová","royalblue":"královská modrá","deeppink":"sytě růžová","lime":"limetková","oldlace":"světle béžová","chartreuse":"chartreuska","darkcyan":"tmavě azurová","yellow":"žlutá","linen":"bledě šedobéžová","olive":"olivová","gold":"zlatá","lawngreen":"jasně zelená","lightyellow":"bledě žlutá","tan":"šedobéžová","darkviolet":"tmavě fialová","lightslategrey":"světlá břidlicová šedá","grey":"šedá","darkkhaki":"pískově hnědá","green":"zelená","deepskyblue":"sytá nebeská modrá","aqua":"azurová","sienna":"siena","mintcream":"mentolová","rosybrown":"růžovohnědá","mediumslateblue":"střední břidlicová modrá","magenta":"purpurová","lightseagreen":"světlá mořská zelená","cyan":"azurová","olivedrab":"khaki","darkgoldenrod":"tmavě béžová","slateblue":"břidlicová modrá","mediumaquamarine":"střední akvamarínová","lavender":"levandulová","mediumseagreen":"střední mořská zelená","maroon":"kaštanová","darkslategray":"tmavá břidlicová šedá","mediumturquoise":"středně tyrkysová","ghostwhite":"modravě bílá","darkblue":"tmavě modrá","mediumvioletred":"středně fialovočervená","brown":"červenohnědá","lightgray":"světle šedá","sandybrown":"oranžovohnědá","pink":"růžová","firebrick":"cihlová","indigo":"indigově modrá","snow":"sněhobílá","darkorchid":"tmavě orchidejová","turquoise":"tyrkysová","chocolate":"hnědobéžová","springgreen":"jarní zelená","moccasin":"bledě krémová","navy":"námořnická modrá","lemonchiffon":"světle citrónová","teal":"šedozelená","floralwhite":"květinově bílá","cornflowerblue":"chrpově modrá","paleturquoise":"bledě tyrkysová","purple":"nachová","gainsboro":"bledě šedá","plum":"švestková","red":"červená","blue":"modrá","forestgreen":"lesní zelená","darkgreen":"tmavě zelená","honeydew":"nazelenalá","darkseagreen":"tmavá mořská zelená","lightcoral":"světle korálová","palevioletred":"bledě fialovočervená","mediumpurple":"středně nachová","saddlebrown":"hnědá","darkmagenta":"tmavě purpurová","thistle":"bodláková","whitesmoke":"kouřově bílá","wheat":"zlatohnědá","violet":"fialová","lightskyblue":"světlá nebeská modrá","goldenrod":"béžová","mediumblue":"středně modrá","skyblue":"nebeská modrá","crimson":"karmínová","darksalmon":"tmavě lososová","darkred":"tmavě červená","darkslategrey":"tmavá břidlicová šedá","peru":"karamelová","lightgrey":"světle šedá","lightgoldenrodyellow":"světle žlutá","blanchedalmond":"mandlová","aliceblue":"modravá","bisque":"bledě oranžová","slategray":"břidlicová šedá","palegoldenrod":"bledě písková","darkorange":"tmavě oranžová","aquamarine":"akvamarínová","lightgreen":"světle zelená","burlywood":"krémová","dodgerblue":"jasně modrá","darkgray":"tmavě šedá","lightcyan":"světle azurová","powderblue":"bledě modrá","blueviolet":"modrofialová","orchid":"orchidejová","dimgray":"kouřově šedá","beige":"bledě béžová","fuchsia":"fuchsiová","lavenderblush":"levandulová růžová","hotpink":"jasně růžová","steelblue":"ocelová modrá","tomato":"tomatová","lightpink":"světle růžová","limegreen":"limetkově zelená","indianred":"indiánská červená","papayawhip":"papájová","lightslategray":"světlá břidlicová šedá","gray":"šedá","mediumorchid":"středně orchidejová","cornsilk":"režná","black":"černá","seagreen":"mořská zelená","darkslateblue":"tmavá břidlicová modrá","khaki":"písková","lightblue":"světle modrá","palegreen":"bledě zelená","azure":"bledě azurová","peachpuff":"broskvová","darkolivegreen":"tmavě olivová","yellowgreen":"žlutozelená"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/cs/colors",({aliceblue:"modravá",antiquewhite:"krémově bílá",aqua:"azurová",aquamarine:"akvamarínová",azure:"bledě azurová",beige:"bledě béžová",bisque:"bledě oranžová",black:"černá",blanchedalmond:"mandlová",blue:"modrá",blueviolet:"modrofialová",brown:"červenohnědá",burlywood:"krémová",cadetblue:"šedomodrá",chartreuse:"chartreuska",chocolate:"hnědobéžová",coral:"korálová červená",cornflowerblue:"chrpově modrá",cornsilk:"režná",crimson:"karmínová",cyan:"azurová",darkblue:"tmavě modrá",darkcyan:"tmavě azurová",darkgoldenrod:"tmavě béžová",darkgray:"tmavě šedá",darkgreen:"tmavě zelená",darkgrey:"tmavě šedá",darkkhaki:"pískově hnědá",darkmagenta:"tmavě purpurová",darkolivegreen:"tmavě olivová",darkorange:"tmavě oranžová",darkorchid:"tmavě orchidejová",darkred:"tmavě červená",darksalmon:"tmavě lososová",darkseagreen:"tmavá mořská zelená",darkslateblue:"tmavá břidlicová modrá",darkslategray:"tmavá břidlicová šedá",darkslategrey:"tmavá břidlicová šedá",darkturquoise:"tmavě tyrkysová",darkviolet:"tmavě fialová",deeppink:"sytě růžová",deepskyblue:"sytá nebeská modrá",dimgray:"kouřově šedá",dimgrey:"kouřově šedá",dodgerblue:"jasně modrá",firebrick:"cihlová",floralwhite:"květinově bílá",forestgreen:"lesní zelená",fuchsia:"fuchsiová",gainsboro:"bledě šedá",ghostwhite:"modravě bílá",gold:"zlatá",goldenrod:"béžová",gray:"šedá",green:"zelená",greenyellow:"zelenožlutá",grey:"šedá",honeydew:"nazelenalá",hotpink:"jasně růžová",indianred:"indiánská červená",indigo:"indigově modrá",ivory:"slonovinová",khaki:"písková",lavender:"levandulová",lavenderblush:"levandulová růžová",lawngreen:"jasně zelená",lemonchiffon:"světle citrónová",lightblue:"světle modrá",lightcoral:"světle korálová",lightcyan:"světle azurová",lightgoldenrodyellow:"světle žlutá",lightgray:"světle šedá",lightgreen:"světle zelená",lightgrey:"světle šedá",lightpink:"světle růžová",lightsalmon:"světle lososová",lightseagreen:"světlá mořská zelená",lightskyblue:"světlá nebeská modrá",lightslategray:"světlá břidlicová šedá",lightslategrey:"světlá břidlicová šedá",lightsteelblue:"světlá ocelová modrá",lightyellow:"bledě žlutá",lime:"limetková",limegreen:"limetkově zelená",linen:"bledě šedobéžová",magenta:"purpurová",maroon:"kaštanová",mediumaquamarine:"střední akvamarínová",mediumblue:"středně modrá",mediumorchid:"středně orchidejová",mediumpurple:"středně nachová",mediumseagreen:"střední mořská zelená",mediumslateblue:"střední břidlicová modrá",mediumspringgreen:"střední jarní zelená",mediumturquoise:"středně tyrkysová",mediumvioletred:"středně fialovočervená",midnightblue:"temně modrá",mintcream:"mentolová",mistyrose:"růžovobílá",moccasin:"bledě krémová",navajowhite:"světle krémová",navy:"námořnická modrá",oldlace:"světle béžová",olive:"olivová",olivedrab:"khaki",orange:"oranžová",orangered:"oranžovočervená",orchid:"orchidejová",palegoldenrod:"bledě písková",palegreen:"bledě zelená",paleturquoise:"bledě tyrkysová",palevioletred:"bledě fialovočervená",papayawhip:"papájová",peachpuff:"broskvová",peru:"karamelová",pink:"růžová",plum:"švestková",powderblue:"bledě modrá",purple:"nachová",red:"červená",rosybrown:"růžovohnědá",royalblue:"královská modrá",saddlebrown:"hnědá",salmon:"lososová",sandybrown:"oranžovohnědá",seagreen:"mořská zelená",seashell:"lasturová",sienna:"siena",silver:"stříbrná",skyblue:"nebeská modrá",slateblue:"břidlicová modrá",slategray:"břidlicová šedá",slategrey:"břidlicová šedá",snow:"sněhobílá",springgreen:"jarní zelená",steelblue:"ocelová modrá",tan:"šedobéžová",teal:"šedozelená",thistle:"bodláková",tomato:"tomatová",transparent:"průhledná",turquoise:"tyrkysová",violet:"fialová",wheat:"zlatohnědá",white:"bílá",whitesmoke:"kouřově bílá",yellow:"žlutá",yellowgreen:"žlutozelená"})); \ No newline at end of file diff --git a/lib/dojo/nls/cs/colors.js.uncompressed.js b/lib/dojo/nls/cs/colors.js.uncompressed.js new file mode 100644 index 00000000..c625f216 --- /dev/null +++ b/lib/dojo/nls/cs/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/cs/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "modravá", + antiquewhite: "krémově bílá", + aqua: "azurová", + aquamarine: "akvamarínová", + azure: "bledě azurová", + beige: "bledě béžová", + bisque: "bledě oranžová", + black: "černá", + blanchedalmond: "mandlová", + blue: "modrá", + blueviolet: "modrofialová", + brown: "červenohnědá", + burlywood: "krémová", + cadetblue: "šedomodrá", + chartreuse: "chartreuska", + chocolate: "hnědobéžová", + coral: "korálová červená", + cornflowerblue: "chrpově modrá", + cornsilk: "režná", + crimson: "karmínová", + cyan: "azurová", + darkblue: "tmavě modrá", + darkcyan: "tmavě azurová", + darkgoldenrod: "tmavě béžová", + darkgray: "tmavě šedá", + darkgreen: "tmavě zelená", + darkgrey: "tmavě šedá", // same as darkgray + darkkhaki: "pískově hnědá", + darkmagenta: "tmavě purpurová", + darkolivegreen: "tmavě olivová", + darkorange: "tmavě oranžová", + darkorchid: "tmavě orchidejová", + darkred: "tmavě červená", + darksalmon: "tmavě lososová", + darkseagreen: "tmavá mořská zelená", + darkslateblue: "tmavá břidlicová modrá", + darkslategray: "tmavá břidlicová šedá", + darkslategrey: "tmavá břidlicová šedá", // same as darkslategray + darkturquoise: "tmavě tyrkysová", + darkviolet: "tmavě fialová", + deeppink: "sytě růžová", + deepskyblue: "sytá nebeská modrá", + dimgray: "kouřově šedá", + dimgrey: "kouřově šedá", // same as dimgray + dodgerblue: "jasně modrá", + firebrick: "cihlová", + floralwhite: "květinově bílá", + forestgreen: "lesní zelená", + fuchsia: "fuchsiová", + gainsboro: "bledě šedá", + ghostwhite: "modravě bílá", + gold: "zlatá", + goldenrod: "béžová", + gray: "šedá", + green: "zelená", + greenyellow: "zelenožlutá", + grey: "šedá", // same as gray + honeydew: "nazelenalá", + hotpink: "jasně růžová", + indianred: "indiánská červená", + indigo: "indigově modrá", + ivory: "slonovinová", + khaki: "písková", + lavender: "levandulová", + lavenderblush: "levandulová růžová", + lawngreen: "jasně zelená", + lemonchiffon: "světle citrónová", + lightblue: "světle modrá", + lightcoral: "světle korálová", + lightcyan: "světle azurová", + lightgoldenrodyellow: "světle žlutá", + lightgray: "světle šedá", + lightgreen: "světle zelená", + lightgrey: "světle šedá", // same as lightgray + lightpink: "světle růžová", + lightsalmon: "světle lososová", + lightseagreen: "světlá mořská zelená", + lightskyblue: "světlá nebeská modrá", + lightslategray: "světlá břidlicová šedá", + lightslategrey: "světlá břidlicová šedá", // same as lightslategray + lightsteelblue: "světlá ocelová modrá", + lightyellow: "bledě žlutá", + lime: "limetková", + limegreen: "limetkově zelená", + linen: "bledě šedobéžová", + magenta: "purpurová", + maroon: "kaštanová", + mediumaquamarine: "střední akvamarínová", + mediumblue: "středně modrá", + mediumorchid: "středně orchidejová", + mediumpurple: "středně nachová", + mediumseagreen: "střední mořská zelená", + mediumslateblue: "střední břidlicová modrá", + mediumspringgreen: "střední jarní zelená", + mediumturquoise: "středně tyrkysová", + mediumvioletred: "středně fialovočervená", + midnightblue: "temně modrá", + mintcream: "mentolová", + mistyrose: "růžovobílá", + moccasin: "bledě krémová", + navajowhite: "světle krémová", + navy: "námořnická modrá", + oldlace: "světle béžová", + olive: "olivová", + olivedrab: "khaki", + orange: "oranžová", + orangered: "oranžovočervená", + orchid: "orchidejová", + palegoldenrod: "bledě písková", + palegreen: "bledě zelená", + paleturquoise: "bledě tyrkysová", + palevioletred: "bledě fialovočervená", + papayawhip: "papájová", + peachpuff: "broskvová", + peru: "karamelová", + pink: "růžová", + plum: "švestková", + powderblue: "bledě modrá", + purple: "nachová", + red: "červená", + rosybrown: "růžovohnědá", + royalblue: "královská modrá", + saddlebrown: "hnědá", + salmon: "lososová", + sandybrown: "oranžovohnědá", + seagreen: "mořská zelená", + seashell: "lasturová", + sienna: "siena", + silver: "stříbrná", + skyblue: "nebeská modrá", + slateblue: "břidlicová modrá", + slategray: "břidlicová šedá", + slategrey: "břidlicová šedá", // same as slategray + snow: "sněhobílá", + springgreen: "jarní zelená", + steelblue: "ocelová modrá", + tan: "šedobéžová", + teal: "šedozelená", + thistle: "bodláková", + tomato: "tomatová", + transparent: "průhledná", + turquoise: "tyrkysová", + violet: "fialová", + wheat: "zlatohnědá", + white: "bílá", + whitesmoke: "kouřově bílá", + yellow: "žlutá", + yellowgreen: "žlutozelená" +}) +); diff --git a/lib/dojo/nls/da/colors.js b/lib/dojo/nls/da/colors.js index 322154f4..da3d11a2 100644 --- a/lib/dojo/nls/da/colors.js +++ b/lib/dojo/nls/da/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"lys stålblå","orangered":"orangerød","midnightblue":"midnatsblå","cadetblue":"kadetblå","seashell":"muslingeskal","slategrey":"skifergrå","coral":"koralrød","darkturquoise":"mørk turkis","antiquewhite":"antikhvid","mediumspringgreen":"mellemforårsgrøn","salmon":"laksefarvet","darkgrey":"mørkegrå","ivory":"elfenben","greenyellow":"grøngul","mistyrose":"blegrosa","lightsalmon":"lys laksefarvet","silver":"sølv","dimgrey":"svag grå","orange":"orange","white":"hvid","navajowhite":"navajo-hvid","royalblue":"kongeblå","deeppink":"dyb pink","lime":"lime","oldlace":"kniplingshvid","chartreuse":"chartreuse","darkcyan":"mørk cyan","yellow":"gul","linen":"lærred","olive":"olivengrøn","gold":"guld","lawngreen":"græsgrøn","lightyellow":"lysegul","tan":"tan","darkviolet":"mørkelilla","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grøn","deepskyblue":"dyb himmelblå","aqua":"akvablå","sienna":"sienna","mintcream":"pebermyntecreme","rosybrown":"rosabrun","mediumslateblue":"mellemskiferblå","magenta":"magenta","lightseagreen":"lys havgrøn","cyan":"cyan","olivedrab":"brungrøn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"mellem akvamarin","lavender":"lysviolet","mediumseagreen":"mellemhavgrøn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"mellemturkis","ghostwhite":"spøgelseshvid","darkblue":"mørkeblå","mediumvioletred":"mellemviolet","brown":"brun","lightgray":"lysegrå","sandybrown":"sandbrun","pink":"pink","firebrick":"chamottesten","indigo":"indigo","snow":"sne","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"rust","springgreen":"forårsgrøn","moccasin":"fruesko","navy":"marineblå","lemonchiffon":"citronfromage","teal":"blågrøn","floralwhite":"blomsterhvid","cornflowerblue":"kornblomstblå","paleturquoise":"bleg turkis","purple":"lilla","gainsboro":"gainsboro","plum":"blomme","red":"rød","blue":"blå","forestgreen":"skovgrøn","darkgreen":"mørkegrøn","honeydew":"honningdug","darkseagreen":"mørk havgrøn","lightcoral":"lys koralrød","palevioletred":"blegviolet","mediumpurple":"mellemlilla","saddlebrown":"saddelbrun","darkmagenta":"mørk magenta","thistle":"tidsel","whitesmoke":"hvid røg","wheat":"korngul","violet":"lilla","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellemblå","skyblue":"himmelblå","crimson":"blodrød","darksalmon":"mørk laksefarvet","darkred":"mørkerød","darkslategrey":"mørk skifergrå","peru":"peru","lightgrey":"lysegrå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"blanceret mandel","aliceblue":"babyblå","bisque":"gulgrå","slategray":"skifergrå","palegoldenrod":"bleg gyldenris","darkorange":"mørk orange","aquamarine":"akvamarin","lightgreen":"lysegrøn","burlywood":"tobak","dodgerblue":"dodgerblå","darkgray":"mørkegrå","lightcyan":"lys cyan","powderblue":"pudderblå","blueviolet":"blåviolet","orchid":"orkide","dimgray":"svag grå","beige":"beige","fuchsia":"lyslilla","lavenderblush":"lavendelrød","hotpink":"mørk rosa","steelblue":"metalblå","tomato":"tomat","lightpink":"lys pink","limegreen":"limegrøn","indianred":"lys rødbrun","papayawhip":"papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"mellem orkide","cornsilk":"majs","black":"sort","seagreen":"havgrøn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lyseblå","palegreen":"bleggrøn","azure":"azurblå","peachpuff":"fersken","darkolivegreen":"mørk olivengrøn","yellowgreen":"gulgrøn"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/da/colors",({aliceblue:"babyblå",antiquewhite:"antikhvid",aqua:"akvablå",aquamarine:"akvamarin",azure:"azurblå",beige:"beige",bisque:"gulgrå",black:"sort",blanchedalmond:"blanceret mandel",blue:"blå",blueviolet:"blåviolet",brown:"brun",burlywood:"tobak",cadetblue:"kadetblå",chartreuse:"chartreuse",chocolate:"rust",coral:"koralrød",cornflowerblue:"kornblomstblå",cornsilk:"majs",crimson:"blodrød",cyan:"cyan",darkblue:"mørkeblå",darkcyan:"mørk cyan",darkgoldenrod:"mørk gyldenris",darkgray:"mørkegrå",darkgreen:"mørkegrøn",darkgrey:"mørkegrå",darkkhaki:"mørk khaki",darkmagenta:"mørk magenta",darkolivegreen:"mørk olivengrøn",darkorange:"mørk orange",darkorchid:"mørk orkide",darkred:"mørkerød",darksalmon:"mørk laksefarvet",darkseagreen:"mørk havgrøn",darkslateblue:"mørk skiferblå",darkslategray:"mørk skifergrå",darkslategrey:"mørk skifergrå",darkturquoise:"mørk turkis",darkviolet:"mørkelilla",deeppink:"dyb pink",deepskyblue:"dyb himmelblå",dimgray:"svag grå",dimgrey:"svag grå",dodgerblue:"dodgerblå",firebrick:"chamottesten",floralwhite:"blomsterhvid",forestgreen:"skovgrøn",fuchsia:"lyslilla",gainsboro:"gainsboro",ghostwhite:"spøgelseshvid",gold:"guld",goldenrod:"gyldenris",gray:"grå",green:"grøn",greenyellow:"grøngul",grey:"grå",honeydew:"honningdug",hotpink:"mørk rosa",indianred:"lys rødbrun",indigo:"indigo",ivory:"elfenben",khaki:"khaki",lavender:"lysviolet",lavenderblush:"lavendelrød",lawngreen:"græsgrøn",lemonchiffon:"citronfromage",lightblue:"lyseblå",lightcoral:"lys koralrød",lightcyan:"lys cyan",lightgoldenrodyellow:"lys gyldenrisgul",lightgray:"lysegrå",lightgreen:"lysegrøn",lightgrey:"lysegrå",lightpink:"lys pink",lightsalmon:"lys laksefarvet",lightseagreen:"lys havgrøn",lightskyblue:"lys himmelblå",lightslategray:"lys skifergrå",lightslategrey:"lys skifergrå",lightsteelblue:"lys stålblå",lightyellow:"lysegul",lime:"lime",limegreen:"limegrøn",linen:"lærred",magenta:"magenta",maroon:"rødbrun",mediumaquamarine:"mellem akvamarin",mediumblue:"mellemblå",mediumorchid:"mellem orkide",mediumpurple:"mellemlilla",mediumseagreen:"mellemhavgrøn",mediumslateblue:"mellemskiferblå",mediumspringgreen:"mellemforårsgrøn",mediumturquoise:"mellemturkis",mediumvioletred:"mellemviolet",midnightblue:"midnatsblå",mintcream:"pebermyntecreme",mistyrose:"blegrosa",moccasin:"fruesko",navajowhite:"navajo-hvid",navy:"marineblå",oldlace:"kniplingshvid",olive:"olivengrøn",olivedrab:"brungrøn",orange:"orange",orangered:"orangerød",orchid:"orkide",palegoldenrod:"bleg gyldenris",palegreen:"bleggrøn",paleturquoise:"bleg turkis",palevioletred:"blegviolet",papayawhip:"papaya",peachpuff:"fersken",peru:"peru",pink:"pink",plum:"blomme",powderblue:"pudderblå",purple:"lilla",red:"rød",rosybrown:"rosabrun",royalblue:"kongeblå",saddlebrown:"saddelbrun",salmon:"laksefarvet",sandybrown:"sandbrun",seagreen:"havgrøn",seashell:"muslingeskal",sienna:"sienna",silver:"sølv",skyblue:"himmelblå",slateblue:"skiferblå",slategray:"skifergrå",slategrey:"skifergrå",snow:"sne",springgreen:"forårsgrøn",steelblue:"metalblå",tan:"tan",teal:"blågrøn",thistle:"tidsel",tomato:"tomat",transparent:"transparent",turquoise:"turkis",violet:"lilla",wheat:"korngul",white:"hvid",whitesmoke:"hvid røg",yellow:"gul",yellowgreen:"gulgrøn"})); \ No newline at end of file diff --git a/lib/dojo/nls/da/colors.js.uncompressed.js b/lib/dojo/nls/da/colors.js.uncompressed.js new file mode 100644 index 00000000..4b40f483 --- /dev/null +++ b/lib/dojo/nls/da/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/da/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "babyblå", + antiquewhite: "antikhvid", + aqua: "akvablå", + aquamarine: "akvamarin", + azure: "azurblå", + beige: "beige", + bisque: "gulgrå", + black: "sort", + blanchedalmond: "blanceret mandel", + blue: "blå", + blueviolet: "blåviolet", + brown: "brun", + burlywood: "tobak", + cadetblue: "kadetblå", + chartreuse: "chartreuse", + chocolate: "rust", + coral: "koralrød", + cornflowerblue: "kornblomstblå", + cornsilk: "majs", + crimson: "blodrød", + cyan: "cyan", + darkblue: "mørkeblå", + darkcyan: "mørk cyan", + darkgoldenrod: "mørk gyldenris", + darkgray: "mørkegrå", + darkgreen: "mørkegrøn", + darkgrey: "mørkegrå", // same as darkgray + darkkhaki: "mørk khaki", + darkmagenta: "mørk magenta", + darkolivegreen: "mørk olivengrøn", + darkorange: "mørk orange", + darkorchid: "mørk orkide", + darkred: "mørkerød", + darksalmon: "mørk laksefarvet", + darkseagreen: "mørk havgrøn", + darkslateblue: "mørk skiferblå", + darkslategray: "mørk skifergrå", + darkslategrey: "mørk skifergrå", // same as darkslategray + darkturquoise: "mørk turkis", + darkviolet: "mørkelilla", + deeppink: "dyb pink", + deepskyblue: "dyb himmelblå", + dimgray: "svag grå", + dimgrey: "svag grå", // same as dimgray + dodgerblue: "dodgerblå", + firebrick: "chamottesten", + floralwhite: "blomsterhvid", + forestgreen: "skovgrøn", + fuchsia: "lyslilla", + gainsboro: "gainsboro", + ghostwhite: "spøgelseshvid", + gold: "guld", + goldenrod: "gyldenris", + gray: "grå", + green: "grøn", + greenyellow: "grøngul", + grey: "grå", // same as gray + honeydew: "honningdug", + hotpink: "mørk rosa", + indianred: "lys rødbrun", + indigo: "indigo", + ivory: "elfenben", + khaki: "khaki", + lavender: "lysviolet", + lavenderblush: "lavendelrød", + lawngreen: "græsgrøn", + lemonchiffon: "citronfromage", + lightblue: "lyseblå", + lightcoral: "lys koralrød", + lightcyan: "lys cyan", + lightgoldenrodyellow: "lys gyldenrisgul", + lightgray: "lysegrå", + lightgreen: "lysegrøn", + lightgrey: "lysegrå", // same as lightgray + lightpink: "lys pink", + lightsalmon: "lys laksefarvet", + lightseagreen: "lys havgrøn", + lightskyblue: "lys himmelblå", + lightslategray: "lys skifergrå", + lightslategrey: "lys skifergrå", // same as lightslategray + lightsteelblue: "lys stålblå", + lightyellow: "lysegul", + lime: "lime", + limegreen: "limegrøn", + linen: "lærred", + magenta: "magenta", + maroon: "rødbrun", + mediumaquamarine: "mellem akvamarin", + mediumblue: "mellemblå", + mediumorchid: "mellem orkide", + mediumpurple: "mellemlilla", + mediumseagreen: "mellemhavgrøn", + mediumslateblue: "mellemskiferblå", + mediumspringgreen: "mellemforårsgrøn", + mediumturquoise: "mellemturkis", + mediumvioletred: "mellemviolet", + midnightblue: "midnatsblå", + mintcream: "pebermyntecreme", + mistyrose: "blegrosa", + moccasin: "fruesko", + navajowhite: "navajo-hvid", + navy: "marineblå", + oldlace: "kniplingshvid", + olive: "olivengrøn", + olivedrab: "brungrøn", + orange: "orange", + orangered: "orangerød", + orchid: "orkide", + palegoldenrod: "bleg gyldenris", + palegreen: "bleggrøn", + paleturquoise: "bleg turkis", + palevioletred: "blegviolet", + papayawhip: "papaya", + peachpuff: "fersken", + peru: "peru", + pink: "pink", + plum: "blomme", + powderblue: "pudderblå", + purple: "lilla", + red: "rød", + rosybrown: "rosabrun", + royalblue: "kongeblå", + saddlebrown: "saddelbrun", + salmon: "laksefarvet", + sandybrown: "sandbrun", + seagreen: "havgrøn", + seashell: "muslingeskal", + sienna: "sienna", + silver: "sølv", + skyblue: "himmelblå", + slateblue: "skiferblå", + slategray: "skifergrå", + slategrey: "skifergrå", // same as slategray + snow: "sne", + springgreen: "forårsgrøn", + steelblue: "metalblå", + tan: "tan", + teal: "blågrøn", + thistle: "tidsel", + tomato: "tomat", + transparent: "transparent", + turquoise: "turkis", + violet: "lilla", + wheat: "korngul", + white: "hvid", + whitesmoke: "hvid røg", + yellow: "gul", + yellowgreen: "gulgrøn" +}) +); diff --git a/lib/dojo/nls/de/colors.js b/lib/dojo/nls/de/colors.js index 7ae21bf4..ea7fc089 100644 --- a/lib/dojo/nls/de/colors.js +++ b/lib/dojo/nls/de/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"Helles Stahlblau","orangered":"Orangerot","midnightblue":"Mitternachtblau","cadetblue":"Kadettenblau","seashell":"Muschelweiß","slategrey":"Schiefergrau","coral":"Koralle","darkturquoise":"Dunkeltürkis","antiquewhite":"Antikweiß","mediumspringgreen":"Mittelfrühlingsgrün","salmon":"Lachs","darkgrey":"Dunkelgrau","ivory":"Elfenbein","greenyellow":"Grüngelb","mistyrose":"Blassrose","lightsalmon":"Helllachs","silver":"Silbergrau","dimgrey":"Blassgrau","orange":"Orange","white":"Weiß","navajowhite":"Navajo-weiß","royalblue":"Königsblau","deeppink":"Tiefrosa","lime":"Limone","oldlace":"Alte Spitze","chartreuse":"Helles Gelbgrün","darkcyan":"Dunkelzyan","yellow":"Gelb","linen":"Leinen","olive":"Oliv","gold":"Gold","lawngreen":"Grasgrün","lightyellow":"Hellgelb","tan":"Hautfarben","darkviolet":"Dunkelviolett","lightslategrey":"Helles Schiefergrau","grey":"Grau","darkkhaki":"Dunkelkhaki","green":"Grün","deepskyblue":"Dunkles Himmelblau","aqua":"Wasserblau","sienna":"Sienna","mintcream":"Mintcreme","rosybrown":"Rosigbraun","mediumslateblue":"Mittelschieferblau ","magenta":"Magenta","lightseagreen":"Helles Meergrün","cyan":"Zyan","olivedrab":"Olivgrau","darkgoldenrod":"Dunkelgoldgelb","slateblue":"Schieferblau","mediumaquamarine":"Mittelaquamarin","lavender":"Lavendelblau","mediumseagreen":"Mittelmeeresgrün","maroon":"Kastanienbraun","darkslategray":"Dunkelschiefergrau","mediumturquoise":"Mitteltürkis ","ghostwhite":"Geisterweiß","darkblue":"Dunkelblau","mediumvioletred":"Mittelviolettrot ","brown":"Braun","lightgray":"Hellgrau","sandybrown":"Sandbraun","pink":"Rosa","firebrick":"Schamottestein","indigo":"Indigoblau","snow":"Schneeweiß","darkorchid":"Dunkelorchidee","turquoise":"Türkis","chocolate":"Schokoladenbraun","springgreen":"Frühlingsgrün","moccasin":"Mokassin","navy":"Marineblau","lemonchiffon":"Zitronenchiffon","teal":"Smaragdgrün","floralwhite":"Blütenweiß","cornflowerblue":"Kornblumenblau","paleturquoise":"Blasstürkis","purple":"Purpurrot","gainsboro":"Gainsboro","plum":"Pflaume","red":"Rot","blue":"Blau","forestgreen":"Forstgrün","darkgreen":"Dunkelgrün","honeydew":"Honigtau","darkseagreen":"Dunkles Meergrün","lightcoral":"Hellkoralle","palevioletred":"Blassviolettrot ","mediumpurple":"Mittelpurpur","saddlebrown":"Sattelbraun","darkmagenta":"Dunkelmagenta","thistle":"Distel","whitesmoke":"Rauchweiß","wheat":"Weizen","violet":"Violett","lightskyblue":"Helles Himmelblau","goldenrod":"Goldgelb","mediumblue":"Mittelblau","skyblue":"Himmelblau","crimson":"Karmesinrot","darksalmon":"Dunkellachs","darkred":"Dunkelrot","darkslategrey":"Dunkelschiefergrau","peru":"Peru","lightgrey":"Hellgrau","lightgoldenrodyellow":"Hellgoldgelb","blanchedalmond":"Mandelweiß","aliceblue":"Alice-blau","bisque":"Bisquit","slategray":"Schiefergrau","palegoldenrod":"Blassgoldgelb","darkorange":"Dunkelorange","aquamarine":"Aquamarin","lightgreen":"Hellgrün","burlywood":"Burlywood","dodgerblue":"Dodger-blau","darkgray":"Dunkelgrau","lightcyan":"Hellzyan","powderblue":"Pulverblau","blueviolet":"Blauviolett","orchid":"Orchidee","dimgray":"Blassgrau","beige":"Beige","fuchsia":"Fuchsia","lavenderblush":"Lavendelhauch","hotpink":"Knallrosa","steelblue":"Stahlblau","tomato":"Tomatenrot","lightpink":"Hellrosa","limegreen":"Limonengrün","indianred":"Indischrot","papayawhip":"Papayacreme","lightslategray":"Helles Schiefergrau","gray":"Grau","mediumorchid":"Mittelorchidee","cornsilk":"Kornseide","black":"Schwarz","seagreen":"Meeresgrün","darkslateblue":"Dunkelschieferblau","khaki":"Khaki","lightblue":"Hellblau","palegreen":"Blassgrün","azure":"Azur","peachpuff":"Pfirsich","darkolivegreen":"Dunkelolivgrün","yellowgreen":"Gelbgrün"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/de/colors",({aliceblue:"Alice-blau",antiquewhite:"Antikweiß",aqua:"Wasserblau",aquamarine:"Aquamarin",azure:"Azur",beige:"Beige",bisque:"Bisquit",black:"Schwarz",blanchedalmond:"Mandelweiß",blue:"Blau",blueviolet:"Blauviolett",brown:"Braun",burlywood:"Burlywood",cadetblue:"Kadettenblau",chartreuse:"Helles Gelbgrün",chocolate:"Schokoladenbraun",coral:"Koralle",cornflowerblue:"Kornblumenblau",cornsilk:"Kornseide",crimson:"Karmesinrot",cyan:"Zyan",darkblue:"Dunkelblau",darkcyan:"Dunkelzyan",darkgoldenrod:"Dunkelgoldgelb",darkgray:"Dunkelgrau",darkgreen:"Dunkelgrün",darkgrey:"Dunkelgrau",darkkhaki:"Dunkelkhaki",darkmagenta:"Dunkelmagenta",darkolivegreen:"Dunkelolivgrün",darkorange:"Dunkelorange",darkorchid:"Dunkelorchidee",darkred:"Dunkelrot",darksalmon:"Dunkellachs",darkseagreen:"Dunkles Meergrün",darkslateblue:"Dunkelschieferblau",darkslategray:"Dunkelschiefergrau",darkslategrey:"Dunkelschiefergrau",darkturquoise:"Dunkeltürkis",darkviolet:"Dunkelviolett",deeppink:"Tiefrosa",deepskyblue:"Dunkles Himmelblau",dimgray:"Blassgrau",dimgrey:"Blassgrau",dodgerblue:"Dodger-blau",firebrick:"Schamottestein",floralwhite:"Blütenweiß",forestgreen:"Forstgrün",fuchsia:"Fuchsia",gainsboro:"Gainsboro",ghostwhite:"Geisterweiß",gold:"Gold",goldenrod:"Goldgelb",gray:"Grau",green:"Grün",greenyellow:"Grüngelb",grey:"Grau",honeydew:"Honigtau",hotpink:"Knallrosa",indianred:"Indischrot",indigo:"Indigoblau",ivory:"Elfenbein",khaki:"Khaki",lavender:"Lavendelblau",lavenderblush:"Lavendelhauch",lawngreen:"Grasgrün",lemonchiffon:"Zitronenchiffon",lightblue:"Hellblau",lightcoral:"Hellkoralle",lightcyan:"Hellzyan",lightgoldenrodyellow:"Hellgoldgelb",lightgray:"Hellgrau",lightgreen:"Hellgrün",lightgrey:"Hellgrau",lightpink:"Hellrosa",lightsalmon:"Helllachs",lightseagreen:"Helles Meergrün",lightskyblue:"Helles Himmelblau",lightslategray:"Helles Schiefergrau",lightslategrey:"Helles Schiefergrau",lightsteelblue:"Helles Stahlblau",lightyellow:"Hellgelb",lime:"Limone",limegreen:"Limonengrün",linen:"Leinen",magenta:"Magenta",maroon:"Kastanienbraun",mediumaquamarine:"Mittelaquamarin",mediumblue:"Mittelblau",mediumorchid:"Mittelorchidee",mediumpurple:"Mittelpurpur",mediumseagreen:"Mittelmeeresgrün",mediumslateblue:"Mittelschieferblau ",mediumspringgreen:"Mittelfrühlingsgrün",mediumturquoise:"Mitteltürkis ",mediumvioletred:"Mittelviolettrot ",midnightblue:"Mitternachtblau",mintcream:"Mintcreme",mistyrose:"Blassrose",moccasin:"Mokassin",navajowhite:"Navajo-weiß",navy:"Marineblau",oldlace:"Alte Spitze",olive:"Oliv",olivedrab:"Olivgrau",orange:"Orange",orangered:"Orangerot",orchid:"Orchidee",palegoldenrod:"Blassgoldgelb",palegreen:"Blassgrün",paleturquoise:"Blasstürkis",palevioletred:"Blassviolettrot ",papayawhip:"Papayacreme",peachpuff:"Pfirsich",peru:"Peru",pink:"Rosa",plum:"Pflaume",powderblue:"Pulverblau",purple:"Purpurrot",red:"Rot",rosybrown:"Rosigbraun",royalblue:"Königsblau",saddlebrown:"Sattelbraun",salmon:"Lachs",sandybrown:"Sandbraun",seagreen:"Meeresgrün",seashell:"Muschelweiß",sienna:"Sienna",silver:"Silbergrau",skyblue:"Himmelblau",slateblue:"Schieferblau",slategray:"Schiefergrau",slategrey:"Schiefergrau",snow:"Schneeweiß",springgreen:"Frühlingsgrün",steelblue:"Stahlblau",tan:"Hautfarben",teal:"Smaragdgrün",thistle:"Distel",tomato:"Tomatenrot",transparent:"Transparent",turquoise:"Türkis",violet:"Violett",wheat:"Weizen",white:"Weiß",whitesmoke:"Rauchweiß",yellow:"Gelb",yellowgreen:"Gelbgrün"})); \ No newline at end of file diff --git a/lib/dojo/nls/de/colors.js.uncompressed.js b/lib/dojo/nls/de/colors.js.uncompressed.js new file mode 100644 index 00000000..8d376c49 --- /dev/null +++ b/lib/dojo/nls/de/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/de/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "Alice-blau", + antiquewhite: "Antikweiß", + aqua: "Wasserblau", + aquamarine: "Aquamarin", + azure: "Azur", + beige: "Beige", + bisque: "Bisquit", + black: "Schwarz", + blanchedalmond: "Mandelweiß", + blue: "Blau", + blueviolet: "Blauviolett", + brown: "Braun", + burlywood: "Burlywood", + cadetblue: "Kadettenblau", + chartreuse: "Helles Gelbgrün", + chocolate: "Schokoladenbraun", + coral: "Koralle", + cornflowerblue: "Kornblumenblau", + cornsilk: "Kornseide", + crimson: "Karmesinrot", + cyan: "Zyan", + darkblue: "Dunkelblau", + darkcyan: "Dunkelzyan", + darkgoldenrod: "Dunkelgoldgelb", + darkgray: "Dunkelgrau", + darkgreen: "Dunkelgrün", + darkgrey: "Dunkelgrau", // same as darkgray + darkkhaki: "Dunkelkhaki", + darkmagenta: "Dunkelmagenta", + darkolivegreen: "Dunkelolivgrün", + darkorange: "Dunkelorange", + darkorchid: "Dunkelorchidee", + darkred: "Dunkelrot", + darksalmon: "Dunkellachs", + darkseagreen: "Dunkles Meergrün", + darkslateblue: "Dunkelschieferblau", + darkslategray: "Dunkelschiefergrau", + darkslategrey: "Dunkelschiefergrau", // same as darkslategray + darkturquoise: "Dunkeltürkis", + darkviolet: "Dunkelviolett", + deeppink: "Tiefrosa", + deepskyblue: "Dunkles Himmelblau", + dimgray: "Blassgrau", + dimgrey: "Blassgrau", // same as dimgray + dodgerblue: "Dodger-blau", + firebrick: "Schamottestein", + floralwhite: "Blütenweiß", + forestgreen: "Forstgrün", + fuchsia: "Fuchsia", + gainsboro: "Gainsboro", + ghostwhite: "Geisterweiß", + gold: "Gold", + goldenrod: "Goldgelb", + gray: "Grau", + green: "Grün", + greenyellow: "Grüngelb", + grey: "Grau", // same as gray + honeydew: "Honigtau", + hotpink: "Knallrosa", + indianred: "Indischrot", + indigo: "Indigoblau", + ivory: "Elfenbein", + khaki: "Khaki", + lavender: "Lavendelblau", + lavenderblush: "Lavendelhauch", + lawngreen: "Grasgrün", + lemonchiffon: "Zitronenchiffon", + lightblue: "Hellblau", + lightcoral: "Hellkoralle", + lightcyan: "Hellzyan", + lightgoldenrodyellow: "Hellgoldgelb", + lightgray: "Hellgrau", + lightgreen: "Hellgrün", + lightgrey: "Hellgrau", // same as lightgray + lightpink: "Hellrosa", + lightsalmon: "Helllachs", + lightseagreen: "Helles Meergrün", + lightskyblue: "Helles Himmelblau", + lightslategray: "Helles Schiefergrau", + lightslategrey: "Helles Schiefergrau", // same as lightslategray + lightsteelblue: "Helles Stahlblau", + lightyellow: "Hellgelb", + lime: "Limone", + limegreen: "Limonengrün", + linen: "Leinen", + magenta: "Magenta", + maroon: "Kastanienbraun", + mediumaquamarine: "Mittelaquamarin", + mediumblue: "Mittelblau", + mediumorchid: "Mittelorchidee", + mediumpurple: "Mittelpurpur", + mediumseagreen: "Mittelmeeresgrün", + mediumslateblue: "Mittelschieferblau ", + mediumspringgreen: "Mittelfrühlingsgrün", + mediumturquoise: "Mitteltürkis ", + mediumvioletred: "Mittelviolettrot ", + midnightblue: "Mitternachtblau", + mintcream: "Mintcreme", + mistyrose: "Blassrose", + moccasin: "Mokassin", + navajowhite: "Navajo-weiß", + navy: "Marineblau", + oldlace: "Alte Spitze", + olive: "Oliv", + olivedrab: "Olivgrau", + orange: "Orange", + orangered: "Orangerot", + orchid: "Orchidee", + palegoldenrod: "Blassgoldgelb", + palegreen: "Blassgrün", + paleturquoise: "Blasstürkis", + palevioletred: "Blassviolettrot ", + papayawhip: "Papayacreme", + peachpuff: "Pfirsich", + peru: "Peru", + pink: "Rosa", + plum: "Pflaume", + powderblue: "Pulverblau", + purple: "Purpurrot", + red: "Rot", + rosybrown: "Rosigbraun", + royalblue: "Königsblau", + saddlebrown: "Sattelbraun", + salmon: "Lachs", + sandybrown: "Sandbraun", + seagreen: "Meeresgrün", + seashell: "Muschelweiß", + sienna: "Sienna", + silver: "Silbergrau", + skyblue: "Himmelblau", + slateblue: "Schieferblau", + slategray: "Schiefergrau", + slategrey: "Schiefergrau", // same as slategray + snow: "Schneeweiß", + springgreen: "Frühlingsgrün", + steelblue: "Stahlblau", + tan: "Hautfarben", + teal: "Smaragdgrün", + thistle: "Distel", + tomato: "Tomatenrot", + transparent: "Transparent", + turquoise: "Türkis", + violet: "Violett", + wheat: "Weizen", + white: "Weiß", + whitesmoke: "Rauchweiß", + yellow: "Gelb", + yellowgreen: "Gelbgrün" +}) +); diff --git a/lib/dojo/nls/el/colors.js b/lib/dojo/nls/el/colors.js index a80df97b..4f398ca9 100644 --- a/lib/dojo/nls/el/colors.js +++ b/lib/dojo/nls/el/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"ανοιχτό μπλε ατσαλιού","orangered":"πορτοκαλοκόκκινο","midnightblue":"πολύ σκούρο μπλε","cadetblue":"μπλε του στρατού","seashell":"κοχύλι","slategrey":"μεταλλικό γκρι","coral":"κοραλί","darkturquoise":"σκούρο τυρκουάζ","antiquewhite":"ξεθωριασμένο λευκό","mediumspringgreen":"μεσαίο πράσινο της άνοιξης","salmon":"σομόν","darkgrey":"σκούρο γκρι","ivory":"ιβουάρ","greenyellow":"πρασινοκίτρινο","mistyrose":"τριανταφυλλί","lightsalmon":"ανοιχτό σομόν","silver":"ασημί","dimgrey":"αχνό γκρι","orange":"πορτοκαλί","white":"λευκό","navajowhite":"άσπρο Ναβάχο","royalblue":"έντονο μπλε","deeppink":"βαθύ ροζ","lime":"λαχανί","oldlace":"εκρού","chartreuse":"φωτεινό κιτρινοπράσινο","darkcyan":"σκούρο κυανό","yellow":"κίτρινο","linen":"σπαγγί","olive":"πράσινο λαδί","gold":"χρυσαφί","lawngreen":"σκούρο πράσινο","lightyellow":"ανοιχτό κίτρινο","tan":"ώχρα","darkviolet":"σκούρο βιολετί","lightslategrey":"ανοιχτό μεταλλικό γκρι","grey":"γκρι","darkkhaki":"σκούρο χακί","green":"πράσινο","deepskyblue":"βαθύ μπλε το ουρανού","aqua":"γαλάζιο","sienna":"καφεκίτρινο","mintcream":"βεραμάν","rosybrown":"καστανό","mediumslateblue":"μεσαίο μεταλλικό μπλε","magenta":"ματζέντα","lightseagreen":"ανοιχτό πράσινο της θάλασσας","cyan":"κυανό","olivedrab":"λαδί","darkgoldenrod":"σκούρο χρυσοκίτρινο","slateblue":"μεταλλικό μπλε","mediumaquamarine":"μεσαίο γαλαζοπράσινο","lavender":"λίλα","mediumseagreen":"μεσαίο πράσινο της θάλασσας","maroon":"βυσσινί","darkslategray":"σκούρο μεταλλικό γκρι","mediumturquoise":"μεσαίο τυρκουάζ","ghostwhite":"άσπρο","darkblue":"σκούρο μπλε","mediumvioletred":"μεσαίο κόκκινο βιολετί","brown":"καφέ","lightgray":"ανοιχτό γκρι","sandybrown":"μπεζ της άμμου","pink":"ροζ","firebrick":"κεραμιδί","indigo":"λουλακί","snow":"χιονί","darkorchid":"σκούρα ορχιδέα","turquoise":"τυρκουάζ","chocolate":"σοκολατί","springgreen":"πράσινο της άνοιξης","moccasin":"μόκα","navy":"μπλε του ναυτικού","lemonchiffon":"λεμονί","teal":"πετρόλ","floralwhite":"λευκό των ανθών","cornflowerblue":"μεσαίο μπλε","paleturquoise":"αχνό τυρκουάζ","purple":"μωβ","gainsboro":"γκρι σιέλ","plum":"δαμασκηνί","red":"κόκκινο","blue":"μπλε","forestgreen":"πράσινο του δάσους","darkgreen":"σκούρο πράσινο","honeydew":"μελί","darkseagreen":"σκούρο πράσινο της θάλασσας","lightcoral":"ανοιχτό κοραλί","palevioletred":"αχνό κόκκινο βιολετί","mediumpurple":"μεσαίο μωβ","saddlebrown":"βαθύ καφέ","darkmagenta":"σκούρο ματζέντα","thistle":"μωβ βιολετί","whitesmoke":"λευκός καπνός","wheat":"σταρένιο","violet":"βιολετί","lightskyblue":"ανοιχτό μπλε το ουρανού","goldenrod":"χρυσοκίτρινο","mediumblue":"μεσαίο μπλε","skyblue":"μπλε του ουρανού","crimson":"βαθύ κόκκινο","darksalmon":"σκούρο σομόν","darkred":"σκούρο κόκκινο","darkslategrey":"σκούρο μεταλλικό γκρι","peru":"περού","lightgrey":"ανοιχτό γκρι","lightgoldenrodyellow":"ανοιχτό χρυσοκίτρινο","blanchedalmond":"ζαχαρί","aliceblue":"σιέλ","bisque":"σκούρο κρεμ","slategray":"μεταλλικό γκρι","palegoldenrod":"αχνό χρυσοκίτρινο","darkorange":"σκούρο πορτοκαλί","aquamarine":"γαλαζοπράσινο","lightgreen":"ανοιχτό πράσινο","burlywood":"καφέ του ξύλου","dodgerblue":"σκούρο ελεκτρίκ","darkgray":"σκούρο γκρι","lightcyan":"ανοιχτό κυανό","powderblue":"αχνό μπλε","blueviolet":"βιολετί","orchid":"ορχιδέα","dimgray":"αχνό γκρι","beige":"μπεζ","fuchsia":"φούξια","lavenderblush":"μωβ λεβάντας","hotpink":"έντονο ροζ","steelblue":"μπλε ατσαλιού","tomato":"κόκκινο της ντομάτας","lightpink":"ανοιχτό ροζ","limegreen":"πράσινο λαχανί","indianred":"ινδικό κόκκινο","papayawhip":"αχνό ροζ","lightslategray":"ανοιχτό μεταλλικό γκρι","gray":"γκρι","mediumorchid":"μεσαία ορχιδέα","cornsilk":"ασημί του καλαμποκιού","black":"μαύρο","seagreen":"πράσινο της θάλασσας","darkslateblue":"σκούρο μεταλλικό μπλε","khaki":"χακί","lightblue":"ανοιχτό μπλε","palegreen":"αχνό πράσινο","azure":"μπλε του ουρανού","peachpuff":"ροδακινί","darkolivegreen":"σκούρο πράσινο λαδί","yellowgreen":"κιτρινοπράσινο"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/el/colors",({aliceblue:"σιέλ",antiquewhite:"ξεθωριασμένο λευκό",aqua:"γαλάζιο",aquamarine:"γαλαζοπράσινο",azure:"μπλε του ουρανού",beige:"μπεζ",bisque:"σκούρο κρεμ",black:"μαύρο",blanchedalmond:"ζαχαρί",blue:"μπλε",blueviolet:"βιολετί",brown:"καφέ",burlywood:"καφέ του ξύλου",cadetblue:"μπλε του στρατού",chartreuse:"φωτεινό κιτρινοπράσινο",chocolate:"σοκολατί",coral:"κοραλί",cornflowerblue:"μεσαίο μπλε",cornsilk:"ασημί του καλαμποκιού",crimson:"βαθύ κόκκινο",cyan:"κυανό",darkblue:"σκούρο μπλε",darkcyan:"σκούρο κυανό",darkgoldenrod:"σκούρο χρυσοκίτρινο",darkgray:"σκούρο γκρι",darkgreen:"σκούρο πράσινο",darkgrey:"σκούρο γκρι",darkkhaki:"σκούρο χακί",darkmagenta:"σκούρο ματζέντα",darkolivegreen:"σκούρο πράσινο λαδί",darkorange:"σκούρο πορτοκαλί",darkorchid:"σκούρα ορχιδέα",darkred:"σκούρο κόκκινο",darksalmon:"σκούρο σομόν",darkseagreen:"σκούρο πράσινο της θάλασσας",darkslateblue:"σκούρο μεταλλικό μπλε",darkslategray:"σκούρο μεταλλικό γκρι",darkslategrey:"σκούρο μεταλλικό γκρι",darkturquoise:"σκούρο τυρκουάζ",darkviolet:"σκούρο βιολετί",deeppink:"βαθύ ροζ",deepskyblue:"βαθύ μπλε το ουρανού",dimgray:"αχνό γκρι",dimgrey:"αχνό γκρι",dodgerblue:"σκούρο ελεκτρίκ",firebrick:"κεραμιδί",floralwhite:"λευκό των ανθών",forestgreen:"πράσινο του δάσους",fuchsia:"φούξια",gainsboro:"γκρι σιέλ",ghostwhite:"άσπρο",gold:"χρυσαφί",goldenrod:"χρυσοκίτρινο",gray:"γκρι",green:"πράσινο",greenyellow:"πρασινοκίτρινο",grey:"γκρι",honeydew:"μελί",hotpink:"έντονο ροζ",indianred:"ινδικό κόκκινο",indigo:"λουλακί",ivory:"ιβουάρ",khaki:"χακί",lavender:"λίλα",lavenderblush:"μωβ λεβάντας",lawngreen:"σκούρο πράσινο",lemonchiffon:"λεμονί",lightblue:"ανοιχτό μπλε",lightcoral:"ανοιχτό κοραλί",lightcyan:"ανοιχτό κυανό",lightgoldenrodyellow:"ανοιχτό χρυσοκίτρινο",lightgray:"ανοιχτό γκρι",lightgreen:"ανοιχτό πράσινο",lightgrey:"ανοιχτό γκρι",lightpink:"ανοιχτό ροζ",lightsalmon:"ανοιχτό σομόν",lightseagreen:"ανοιχτό πράσινο της θάλασσας",lightskyblue:"ανοιχτό μπλε το ουρανού",lightslategray:"ανοιχτό μεταλλικό γκρι",lightslategrey:"ανοιχτό μεταλλικό γκρι",lightsteelblue:"ανοιχτό μπλε ατσαλιού",lightyellow:"ανοιχτό κίτρινο",lime:"λαχανί",limegreen:"πράσινο λαχανί",linen:"σπαγγί",magenta:"ματζέντα",maroon:"βυσσινί",mediumaquamarine:"μεσαίο γαλαζοπράσινο",mediumblue:"μεσαίο μπλε",mediumorchid:"μεσαία ορχιδέα",mediumpurple:"μεσαίο μωβ",mediumseagreen:"μεσαίο πράσινο της θάλασσας",mediumslateblue:"μεσαίο μεταλλικό μπλε",mediumspringgreen:"μεσαίο πράσινο της άνοιξης",mediumturquoise:"μεσαίο τυρκουάζ",mediumvioletred:"μεσαίο κόκκινο βιολετί",midnightblue:"πολύ σκούρο μπλε",mintcream:"βεραμάν",mistyrose:"τριανταφυλλί",moccasin:"μόκα",navajowhite:"άσπρο Ναβάχο",navy:"μπλε του ναυτικού",oldlace:"εκρού",olive:"πράσινο λαδί",olivedrab:"λαδί",orange:"πορτοκαλί",orangered:"πορτοκαλοκόκκινο",orchid:"ορχιδέα",palegoldenrod:"αχνό χρυσοκίτρινο",palegreen:"αχνό πράσινο",paleturquoise:"αχνό τυρκουάζ",palevioletred:"αχνό κόκκινο βιολετί",papayawhip:"αχνό ροζ",peachpuff:"ροδακινί",peru:"περού",pink:"ροζ",plum:"δαμασκηνί",powderblue:"αχνό μπλε",purple:"μωβ",red:"κόκκινο",rosybrown:"καστανό",royalblue:"έντονο μπλε",saddlebrown:"βαθύ καφέ",salmon:"σομόν",sandybrown:"μπεζ της άμμου",seagreen:"πράσινο της θάλασσας",seashell:"κοχύλι",sienna:"καφεκίτρινο",silver:"ασημί",skyblue:"μπλε του ουρανού",slateblue:"μεταλλικό μπλε",slategray:"μεταλλικό γκρι",slategrey:"μεταλλικό γκρι",snow:"χιονί",springgreen:"πράσινο της άνοιξης",steelblue:"μπλε ατσαλιού",tan:"ώχρα",teal:"πετρόλ",thistle:"μωβ βιολετί",tomato:"κόκκινο της ντομάτας",transparent:"διαφανές",turquoise:"τυρκουάζ",violet:"βιολετί",wheat:"σταρένιο",white:"λευκό",whitesmoke:"λευκός καπνός",yellow:"κίτρινο",yellowgreen:"κιτρινοπράσινο"})); \ No newline at end of file diff --git a/lib/dojo/nls/el/colors.js.uncompressed.js b/lib/dojo/nls/el/colors.js.uncompressed.js new file mode 100644 index 00000000..8f4bc0ec --- /dev/null +++ b/lib/dojo/nls/el/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/el/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "σιέλ", + antiquewhite: "ξεθωριασμένο λευκό", + aqua: "γαλάζιο", + aquamarine: "γαλαζοπράσινο", + azure: "μπλε του ουρανού", + beige: "μπεζ", + bisque: "σκούρο κρεμ", + black: "μαύρο", + blanchedalmond: "ζαχαρί", + blue: "μπλε", + blueviolet: "βιολετί", + brown: "καφέ", + burlywood: "καφέ του ξύλου", + cadetblue: "μπλε του στρατού", + chartreuse: "φωτεινό κιτρινοπράσινο", + chocolate: "σοκολατί", + coral: "κοραλί", + cornflowerblue: "μεσαίο μπλε", + cornsilk: "ασημί του καλαμποκιού", + crimson: "βαθύ κόκκινο", + cyan: "κυανό", + darkblue: "σκούρο μπλε", + darkcyan: "σκούρο κυανό", + darkgoldenrod: "σκούρο χρυσοκίτρινο", + darkgray: "σκούρο γκρι", + darkgreen: "σκούρο πράσινο", + darkgrey: "σκούρο γκρι", // same as darkgray + darkkhaki: "σκούρο χακί", + darkmagenta: "σκούρο ματζέντα", + darkolivegreen: "σκούρο πράσινο λαδί", + darkorange: "σκούρο πορτοκαλί", + darkorchid: "σκούρα ορχιδέα", + darkred: "σκούρο κόκκινο", + darksalmon: "σκούρο σομόν", + darkseagreen: "σκούρο πράσινο της θάλασσας", + darkslateblue: "σκούρο μεταλλικό μπλε", + darkslategray: "σκούρο μεταλλικό γκρι", + darkslategrey: "σκούρο μεταλλικό γκρι", // same as darkslategray + darkturquoise: "σκούρο τυρκουάζ", + darkviolet: "σκούρο βιολετί", + deeppink: "βαθύ ροζ", + deepskyblue: "βαθύ μπλε το ουρανού", + dimgray: "αχνό γκρι", + dimgrey: "αχνό γκρι", // same as dimgray + dodgerblue: "σκούρο ελεκτρίκ", + firebrick: "κεραμιδί", + floralwhite: "λευκό των ανθών", + forestgreen: "πράσινο του δάσους", + fuchsia: "φούξια", + gainsboro: "γκρι σιέλ", + ghostwhite: "άσπρο", + gold: "χρυσαφί", + goldenrod: "χρυσοκίτρινο", + gray: "γκρι", + green: "πράσινο", + greenyellow: "πρασινοκίτρινο", + grey: "γκρι", // same as gray + honeydew: "μελί", + hotpink: "έντονο ροζ", + indianred: "ινδικό κόκκινο", + indigo: "λουλακί", + ivory: "ιβουάρ", + khaki: "χακί", + lavender: "λίλα", + lavenderblush: "μωβ λεβάντας", + lawngreen: "σκούρο πράσινο", + lemonchiffon: "λεμονί", + lightblue: "ανοιχτό μπλε", + lightcoral: "ανοιχτό κοραλί", + lightcyan: "ανοιχτό κυανό", + lightgoldenrodyellow: "ανοιχτό χρυσοκίτρινο", + lightgray: "ανοιχτό γκρι", + lightgreen: "ανοιχτό πράσινο", + lightgrey: "ανοιχτό γκρι", // same as lightgray + lightpink: "ανοιχτό ροζ", + lightsalmon: "ανοιχτό σομόν", + lightseagreen: "ανοιχτό πράσινο της θάλασσας", + lightskyblue: "ανοιχτό μπλε το ουρανού", + lightslategray: "ανοιχτό μεταλλικό γκρι", + lightslategrey: "ανοιχτό μεταλλικό γκρι", // same as lightslategray + lightsteelblue: "ανοιχτό μπλε ατσαλιού", + lightyellow: "ανοιχτό κίτρινο", + lime: "λαχανί", + limegreen: "πράσινο λαχανί", + linen: "σπαγγί", + magenta: "ματζέντα", + maroon: "βυσσινί", + mediumaquamarine: "μεσαίο γαλαζοπράσινο", + mediumblue: "μεσαίο μπλε", + mediumorchid: "μεσαία ορχιδέα", + mediumpurple: "μεσαίο μωβ", + mediumseagreen: "μεσαίο πράσινο της θάλασσας", + mediumslateblue: "μεσαίο μεταλλικό μπλε", + mediumspringgreen: "μεσαίο πράσινο της άνοιξης", + mediumturquoise: "μεσαίο τυρκουάζ", + mediumvioletred: "μεσαίο κόκκινο βιολετί", + midnightblue: "πολύ σκούρο μπλε", + mintcream: "βεραμάν", + mistyrose: "τριανταφυλλί", + moccasin: "μόκα", + navajowhite: "άσπρο Ναβάχο", + navy: "μπλε του ναυτικού", + oldlace: "εκρού", + olive: "πράσινο λαδί", + olivedrab: "λαδί", + orange: "πορτοκαλί", + orangered: "πορτοκαλοκόκκινο", + orchid: "ορχιδέα", + palegoldenrod: "αχνό χρυσοκίτρινο", + palegreen: "αχνό πράσινο", + paleturquoise: "αχνό τυρκουάζ", + palevioletred: "αχνό κόκκινο βιολετί", + papayawhip: "αχνό ροζ", + peachpuff: "ροδακινί", + peru: "περού", + pink: "ροζ", + plum: "δαμασκηνί", + powderblue: "αχνό μπλε", + purple: "μωβ", + red: "κόκκινο", + rosybrown: "καστανό", + royalblue: "έντονο μπλε", + saddlebrown: "βαθύ καφέ", + salmon: "σομόν", + sandybrown: "μπεζ της άμμου", + seagreen: "πράσινο της θάλασσας", + seashell: "κοχύλι", + sienna: "καφεκίτρινο", + silver: "ασημί", + skyblue: "μπλε του ουρανού", + slateblue: "μεταλλικό μπλε", + slategray: "μεταλλικό γκρι", + slategrey: "μεταλλικό γκρι", // same as slategray + snow: "χιονί", + springgreen: "πράσινο της άνοιξης", + steelblue: "μπλε ατσαλιού", + tan: "ώχρα", + teal: "πετρόλ", + thistle: "μωβ βιολετί", + tomato: "κόκκινο της ντομάτας", + transparent: "διαφανές", + turquoise: "τυρκουάζ", + violet: "βιολετί", + wheat: "σταρένιο", + white: "λευκό", + whitesmoke: "λευκός καπνός", + yellow: "κίτρινο", + yellowgreen: "κιτρινοπράσινο" +}) +); diff --git a/lib/dojo/nls/es/colors.js b/lib/dojo/nls/es/colors.js index 95bb23e8..63338948 100644 --- a/lib/dojo/nls/es/colors.js +++ b/lib/dojo/nls/es/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"azul acero claro","orangered":"rojo anaranjado","midnightblue":"azul medianoche","cadetblue":"azul cadete","seashell":"blanco marfil","slategrey":"gris pizarra","coral":"coral","darkturquoise":"turquesa oscuro","antiquewhite":"blanco antiguo","mediumspringgreen":"verde primavera medio","salmon":"salmón","darkgrey":"gris oscuro","ivory":"marfil","greenyellow":"amarillo verdoso","mistyrose":"rosa difuminado","lightsalmon":"salmón claro","silver":"plateado","dimgrey":"gris marengo","orange":"naranja","white":"blanco","navajowhite":"blanco navajo","royalblue":"azul real","deeppink":"rosa fuerte","lime":"lima","oldlace":"encaje antiguo","chartreuse":"verde pálido 2","darkcyan":"cian oscuro","yellow":"amarillo","linen":"blanco arena","olive":"verde oliva","gold":"oro","lawngreen":"verde césped","lightyellow":"amarillo claro","tan":"canela","darkviolet":"violeta oscuro","lightslategrey":"gris pizarra claro","grey":"gris","darkkhaki":"caqui oscuro","green":"verde","deepskyblue":"azul cielo fuerte","aqua":"aguamarina","sienna":"siena","mintcream":"crema menta","rosybrown":"marrón rosáceo","mediumslateblue":"azul pizarra medio","magenta":"magenta","lightseagreen":"verde mar claro","cyan":"cian","olivedrab":"verde oliva pardusco","darkgoldenrod":"ocre oscuro","slateblue":"azul pizarra","mediumaquamarine":"aguamarina medio","lavender":"lavanda","mediumseagreen":"verde mar medio","maroon":"granate","darkslategray":"gris pizarra oscuro","mediumturquoise":"turquesa medio","ghostwhite":"blanco ligero","darkblue":"azul oscuro","mediumvioletred":"rojo violáceo medio","brown":"marrón","lightgray":"gris claro","sandybrown":"marrón arcilla","pink":"rosa","firebrick":"teja","indigo":"añil","snow":"nieve","darkorchid":"orquídea oscuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde fuerte","moccasin":"arena","navy":"azul marino","lemonchiffon":"amarillo pastel","teal":"verde azulado","floralwhite":"blanco manteca","cornflowerblue":"azul aciano","paleturquoise":"turquesa pálido","purple":"púrpura","gainsboro":"azul gainsboro","plum":"ciruela","red":"rojo","blue":"azul","forestgreen":"verde pino","darkgreen":"verde oscuro","honeydew":"flor de rocío","darkseagreen":"verde mar oscuro","lightcoral":"coral claro","palevioletred":"rojo violáceo pálido","mediumpurple":"púrpura medio","saddlebrown":"cuero","darkmagenta":"magenta oscuro","thistle":"cardo","whitesmoke":"blanco ahumado","wheat":"trigo","violet":"violeta","lightskyblue":"azul cielo claro","goldenrod":"ocre","mediumblue":"azul medio","skyblue":"azul cielo","crimson":"carmesí","darksalmon":"salmón oscuro","darkred":"rojo oscuro","darkslategrey":"gris pizarra oscuro","peru":"perú","lightgrey":"gris claro","lightgoldenrodyellow":"ocre claro","blanchedalmond":"almendra pálido","aliceblue":"blanco azulado","bisque":"miel","slategray":"gris pizarra","palegoldenrod":"ocre pálido","darkorange":"naranja oscuro","aquamarine":"aguamarina 2","lightgreen":"verde claro","burlywood":"madera","dodgerblue":"azul fuerte","darkgray":"gris oscuro","lightcyan":"cian claro","powderblue":"azul suave","blueviolet":"azul violáceo","orchid":"orquídea","dimgray":"gris marengo","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosácea","hotpink":"rosa oscuro","steelblue":"azul acero","tomato":"tomate","lightpink":"rosa claro","limegreen":"lima limón","indianred":"rojo teja","papayawhip":"papaya claro","lightslategray":"gris pizarra claro","gray":"gris","mediumorchid":"orquídea medio","cornsilk":"crudo","black":"negro","seagreen":"verde mar","darkslateblue":"azul pizarra oscuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"blanco cielo","peachpuff":"melocotón","darkolivegreen":"verde oliva oscuro","yellowgreen":"verde amarillento"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/es/colors",({aliceblue:"blanco azulado",antiquewhite:"blanco antiguo",aqua:"aguamarina",aquamarine:"aguamarina 2",azure:"blanco cielo",beige:"beige",bisque:"miel",black:"negro",blanchedalmond:"almendra pálido",blue:"azul",blueviolet:"azul violáceo",brown:"marrón",burlywood:"madera",cadetblue:"azul cadete",chartreuse:"verde pálido 2",chocolate:"chocolate",coral:"coral",cornflowerblue:"azul aciano",cornsilk:"crudo",crimson:"carmesí",cyan:"cian",darkblue:"azul oscuro",darkcyan:"cian oscuro",darkgoldenrod:"ocre oscuro",darkgray:"gris oscuro",darkgreen:"verde oscuro",darkgrey:"gris oscuro",darkkhaki:"caqui oscuro",darkmagenta:"magenta oscuro",darkolivegreen:"verde oliva oscuro",darkorange:"naranja oscuro",darkorchid:"orquídea oscuro",darkred:"rojo oscuro",darksalmon:"salmón oscuro",darkseagreen:"verde mar oscuro",darkslateblue:"azul pizarra oscuro",darkslategray:"gris pizarra oscuro",darkslategrey:"gris pizarra oscuro",darkturquoise:"turquesa oscuro",darkviolet:"violeta oscuro",deeppink:"rosa fuerte",deepskyblue:"azul cielo fuerte",dimgray:"gris marengo",dimgrey:"gris marengo",dodgerblue:"azul fuerte",firebrick:"teja",floralwhite:"blanco manteca",forestgreen:"verde pino",fuchsia:"fucsia",gainsboro:"azul gainsboro",ghostwhite:"blanco ligero",gold:"oro",goldenrod:"ocre",gray:"gris",green:"verde",greenyellow:"amarillo verdoso",grey:"gris",honeydew:"flor de rocío",hotpink:"rosa oscuro",indianred:"rojo teja",indigo:"añil",ivory:"marfil",khaki:"caqui",lavender:"lavanda",lavenderblush:"lavanda rosácea",lawngreen:"verde césped",lemonchiffon:"amarillo pastel",lightblue:"azul claro",lightcoral:"coral claro",lightcyan:"cian claro",lightgoldenrodyellow:"ocre claro",lightgray:"gris claro",lightgreen:"verde claro",lightgrey:"gris claro",lightpink:"rosa claro",lightsalmon:"salmón claro",lightseagreen:"verde mar claro",lightskyblue:"azul cielo claro",lightslategray:"gris pizarra claro",lightslategrey:"gris pizarra claro",lightsteelblue:"azul acero claro",lightyellow:"amarillo claro",lime:"lima",limegreen:"lima limón",linen:"blanco arena",magenta:"magenta",maroon:"granate",mediumaquamarine:"aguamarina medio",mediumblue:"azul medio",mediumorchid:"orquídea medio",mediumpurple:"púrpura medio",mediumseagreen:"verde mar medio",mediumslateblue:"azul pizarra medio",mediumspringgreen:"verde primavera medio",mediumturquoise:"turquesa medio",mediumvioletred:"rojo violáceo medio",midnightblue:"azul medianoche",mintcream:"crema menta",mistyrose:"rosa difuminado",moccasin:"arena",navajowhite:"blanco navajo",navy:"azul marino",oldlace:"encaje antiguo",olive:"verde oliva",olivedrab:"verde oliva pardusco",orange:"naranja",orangered:"rojo anaranjado",orchid:"orquídea",palegoldenrod:"ocre pálido",palegreen:"verde pálido",paleturquoise:"turquesa pálido",palevioletred:"rojo violáceo pálido",papayawhip:"papaya claro",peachpuff:"melocotón",peru:"perú",pink:"rosa",plum:"ciruela",powderblue:"azul suave",purple:"púrpura",red:"rojo",rosybrown:"marrón rosáceo",royalblue:"azul real",saddlebrown:"cuero",salmon:"salmón",sandybrown:"marrón arcilla",seagreen:"verde mar",seashell:"blanco marfil",sienna:"siena",silver:"plateado",skyblue:"azul cielo",slateblue:"azul pizarra",slategray:"gris pizarra",slategrey:"gris pizarra",snow:"nieve",springgreen:"verde fuerte",steelblue:"azul acero",tan:"canela",teal:"verde azulado",thistle:"cardo",tomato:"tomate",transparent:"transparente",turquoise:"turquesa",violet:"violeta",wheat:"trigo",white:"blanco",whitesmoke:"blanco ahumado",yellow:"amarillo",yellowgreen:"verde amarillento"})); \ No newline at end of file diff --git a/lib/dojo/nls/es/colors.js.uncompressed.js b/lib/dojo/nls/es/colors.js.uncompressed.js new file mode 100644 index 00000000..121f3510 --- /dev/null +++ b/lib/dojo/nls/es/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/es/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "blanco azulado", + antiquewhite: "blanco antiguo", + aqua: "aguamarina", + aquamarine: "aguamarina 2", + azure: "blanco cielo", + beige: "beige", + bisque: "miel", + black: "negro", + blanchedalmond: "almendra pálido", + blue: "azul", + blueviolet: "azul violáceo", + brown: "marrón", + burlywood: "madera", + cadetblue: "azul cadete", + chartreuse: "verde pálido 2", + chocolate: "chocolate", + coral: "coral", + cornflowerblue: "azul aciano", + cornsilk: "crudo", + crimson: "carmesí", + cyan: "cian", + darkblue: "azul oscuro", + darkcyan: "cian oscuro", + darkgoldenrod: "ocre oscuro", + darkgray: "gris oscuro", + darkgreen: "verde oscuro", + darkgrey: "gris oscuro", // same as darkgray + darkkhaki: "caqui oscuro", + darkmagenta: "magenta oscuro", + darkolivegreen: "verde oliva oscuro", + darkorange: "naranja oscuro", + darkorchid: "orquídea oscuro", + darkred: "rojo oscuro", + darksalmon: "salmón oscuro", + darkseagreen: "verde mar oscuro", + darkslateblue: "azul pizarra oscuro", + darkslategray: "gris pizarra oscuro", + darkslategrey: "gris pizarra oscuro", // same as darkslategray + darkturquoise: "turquesa oscuro", + darkviolet: "violeta oscuro", + deeppink: "rosa fuerte", + deepskyblue: "azul cielo fuerte", + dimgray: "gris marengo", + dimgrey: "gris marengo", // same as dimgray + dodgerblue: "azul fuerte", + firebrick: "teja", + floralwhite: "blanco manteca", + forestgreen: "verde pino", + fuchsia: "fucsia", + gainsboro: "azul gainsboro", + ghostwhite: "blanco ligero", + gold: "oro", + goldenrod: "ocre", + gray: "gris", + green: "verde", + greenyellow: "amarillo verdoso", + grey: "gris", // same as gray + honeydew: "flor de rocío", + hotpink: "rosa oscuro", + indianred: "rojo teja", + indigo: "añil", + ivory: "marfil", + khaki: "caqui", + lavender: "lavanda", + lavenderblush: "lavanda rosácea", + lawngreen: "verde césped", + lemonchiffon: "amarillo pastel", + lightblue: "azul claro", + lightcoral: "coral claro", + lightcyan: "cian claro", + lightgoldenrodyellow: "ocre claro", + lightgray: "gris claro", + lightgreen: "verde claro", + lightgrey: "gris claro", // same as lightgray + lightpink: "rosa claro", + lightsalmon: "salmón claro", + lightseagreen: "verde mar claro", + lightskyblue: "azul cielo claro", + lightslategray: "gris pizarra claro", + lightslategrey: "gris pizarra claro", // same as lightslategray + lightsteelblue: "azul acero claro", + lightyellow: "amarillo claro", + lime: "lima", + limegreen: "lima limón", + linen: "blanco arena", + magenta: "magenta", + maroon: "granate", + mediumaquamarine: "aguamarina medio", + mediumblue: "azul medio", + mediumorchid: "orquídea medio", + mediumpurple: "púrpura medio", + mediumseagreen: "verde mar medio", + mediumslateblue: "azul pizarra medio", + mediumspringgreen: "verde primavera medio", + mediumturquoise: "turquesa medio", + mediumvioletred: "rojo violáceo medio", + midnightblue: "azul medianoche", + mintcream: "crema menta", + mistyrose: "rosa difuminado", + moccasin: "arena", + navajowhite: "blanco navajo", + navy: "azul marino", + oldlace: "encaje antiguo", + olive: "verde oliva", + olivedrab: "verde oliva pardusco", + orange: "naranja", + orangered: "rojo anaranjado", + orchid: "orquídea", + palegoldenrod: "ocre pálido", + palegreen: "verde pálido", + paleturquoise: "turquesa pálido", + palevioletred: "rojo violáceo pálido", + papayawhip: "papaya claro", + peachpuff: "melocotón", + peru: "perú", + pink: "rosa", + plum: "ciruela", + powderblue: "azul suave", + purple: "púrpura", + red: "rojo", + rosybrown: "marrón rosáceo", + royalblue: "azul real", + saddlebrown: "cuero", + salmon: "salmón", + sandybrown: "marrón arcilla", + seagreen: "verde mar", + seashell: "blanco marfil", + sienna: "siena", + silver: "plateado", + skyblue: "azul cielo", + slateblue: "azul pizarra", + slategray: "gris pizarra", + slategrey: "gris pizarra", // same as slategray + snow: "nieve", + springgreen: "verde fuerte", + steelblue: "azul acero", + tan: "canela", + teal: "verde azulado", + thistle: "cardo", + tomato: "tomate", + transparent: "transparente", + turquoise: "turquesa", + violet: "violeta", + wheat: "trigo", + white: "blanco", + whitesmoke: "blanco ahumado", + yellow: "amarillo", + yellowgreen: "verde amarillento" +}) +); diff --git a/lib/dojo/nls/fi/colors.js b/lib/dojo/nls/fi/colors.js index 17cdf168..93383f46 100644 --- a/lib/dojo/nls/fi/colors.js +++ b/lib/dojo/nls/fi/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"vaalea teräksensininen","orangered":"oranssinpunainen","midnightblue":"yönsininen","cadetblue":"meren vihreä","seashell":"simpukankuori","slategrey":"savenharmaa","coral":"koralli","darkturquoise":"tumma turkoosi","antiquewhite":"antiikinvalkoinen","mediumspringgreen":"keskivaalea keväänvihreä","salmon":"lohenpunainen","darkgrey":"tummanharmaa","ivory":"norsunluu","greenyellow":"vihreänkeltainen","mistyrose":"utuinen ruusu","lightsalmon":"vaalea lohenpunainen","silver":"hopea","dimgrey":"himmeänharmaa","orange":"oranssi","white":"valkoinen","navajowhite":"navajonvalkoinen","royalblue":"syvänsininen","deeppink":"syvä vaaleanpunainen","lime":"vaaleanvihreä","oldlace":"vanha pitsi","chartreuse":"kellanvihreä","darkcyan":"tumma turkoosi","yellow":"keltainen","linen":"pellavanvaalea","olive":"oliivinvihreä","gold":"kulta","lawngreen":"ruohonvihreä","lightyellow":"vaaleankeltainen","tan":"kellanruskea","darkviolet":"tummanvioletti","lightslategrey":"vaaleanharmaa","grey":"harmaa","darkkhaki":"tumma khaki","green":"vihreä","deepskyblue":"tumma taivaansininen","aqua":"sinivihreä","sienna":"siena","mintcream":"minttukreemi","rosybrown":"punertavanruskea","mediumslateblue":"keskivaalea siniharmaa","magenta":"magenta","lightseagreen":"vaalea merenvihreä","cyan":"syaani","olivedrab":"oliivinruskea","darkgoldenrod":"tumma kultapiisku","slateblue":"savensininen","mediumaquamarine":"keskivaalea vedenvihreä","lavender":"laventeli","mediumseagreen":"keskivaalea merenvihreä","maroon":"kastanjanruskea","darkslategray":"tummanharmaa","mediumturquoise":"keskivaalea turkoosi","ghostwhite":"lakananvalkoinen","darkblue":"tummansininen","mediumvioletred":"keskivaalea lila","brown":"ruskea","lightgray":"vaaleanharmaa","sandybrown":"hiekanruskea","pink":"vaaleanpunainen","firebrick":"poltetun tiilen punainen","indigo":"indigo","snow":"lumivalkoinen","darkorchid":"tumma orkidea","turquoise":"turkoosi","chocolate":"suklaanruskea","springgreen":"keväänvihreä","moccasin":"nahanruskea","navy":"laivastonsininen","lemonchiffon":"sitruunankeltainen","teal":"sinivihreä","floralwhite":"kukanvalkoinen","cornflowerblue":"syvänsininen","paleturquoise":"haalea turkoosi","purple":"violetti","gainsboro":"gainsboro","plum":"luumunpunainen","red":"punainen","blue":"sininen","forestgreen":"metsänvihreä","darkgreen":"tummanvihreä","honeydew":"hunajameloninvihreä","darkseagreen":"tumma merenvihreä","lightcoral":"vaalea koralli","palevioletred":"haalea lila","mediumpurple":"keskivaalea violetti","saddlebrown":"satulanruskea","darkmagenta":"tumma magenta","thistle":"ohdake","whitesmoke":"savunvalkea","wheat":"vehnänkeltainen","violet":"violetti","lightskyblue":"vaalea taivaansininen","goldenrod":"kullanruskea","mediumblue":"keskisininen","skyblue":"taivaansininen","crimson":"karmiininpunainen","darksalmon":"tumma lohenpunainen","darkred":"tummanpunainen","darkslategrey":"tummanharmaa","peru":"peru","lightgrey":"vaaleanharmaa","lightgoldenrodyellow":"vaalea kultapiiskunkeltainen","blanchedalmond":"kuorittu manteli","aliceblue":"vaaleanharmaansininen","bisque":"vaaleanruskea","slategray":"savenharmaa","palegoldenrod":"haalea kultapiisku","darkorange":"tummanoranssi","aquamarine":"vedenvihreä","lightgreen":"vaaleanvihreä","burlywood":"puunruskea","dodgerblue":"Dodger-sininen","darkgray":"tummanharmaa","lightcyan":"vaalea syaani","powderblue":"harmaansininen","blueviolet":"sinivioletti","orchid":"orkidea","dimgray":"himmeänharmaa","beige":"vaaleanruskea","fuchsia":"purppura","lavenderblush":"laventelinpunainen","hotpink":"pinkki","steelblue":"teräksensininen","tomato":"tomaatinpunainen","lightpink":"vaaleanpunainen","limegreen":"limetinvihreä","indianred":"kirkkaanpunainen","papayawhip":"papaijavaahto","lightslategray":"vaaleanharmaa","gray":"harmaa","mediumorchid":"keskivaalea orkidea","cornsilk":"maissinkeltainen","black":"musta","seagreen":"merenvihreä","darkslateblue":"tumma siniharmaa","khaki":"khaki","lightblue":"vaaleansininen","palegreen":"haalea vihreä","azure":"taivaansininen","peachpuff":"persikka","darkolivegreen":"tummanoliivinvihreä","yellowgreen":"kellanvihreä"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/fi/colors",({aliceblue:"vaaleanharmaansininen",antiquewhite:"antiikinvalkoinen",aqua:"sinivihreä",aquamarine:"vedenvihreä",azure:"taivaansininen",beige:"vaaleanruskea",bisque:"vaaleanruskea",black:"musta",blanchedalmond:"kuorittu manteli",blue:"sininen",blueviolet:"sinivioletti",brown:"ruskea",burlywood:"puunruskea",cadetblue:"meren vihreä",chartreuse:"kellanvihreä",chocolate:"suklaanruskea",coral:"koralli",cornflowerblue:"syvänsininen",cornsilk:"maissinkeltainen",crimson:"karmiininpunainen",cyan:"syaani",darkblue:"tummansininen",darkcyan:"tumma turkoosi",darkgoldenrod:"tumma kultapiisku",darkgray:"tummanharmaa",darkgreen:"tummanvihreä",darkgrey:"tummanharmaa",darkkhaki:"tumma khaki",darkmagenta:"tumma magenta",darkolivegreen:"tummanoliivinvihreä",darkorange:"tummanoranssi",darkorchid:"tumma orkidea",darkred:"tummanpunainen",darksalmon:"tumma lohenpunainen",darkseagreen:"tumma merenvihreä",darkslateblue:"tumma siniharmaa",darkslategray:"tummanharmaa",darkslategrey:"tummanharmaa",darkturquoise:"tumma turkoosi",darkviolet:"tummanvioletti",deeppink:"syvä vaaleanpunainen",deepskyblue:"tumma taivaansininen",dimgray:"himmeänharmaa",dimgrey:"himmeänharmaa",dodgerblue:"Dodger-sininen",firebrick:"poltetun tiilen punainen",floralwhite:"kukanvalkoinen",forestgreen:"metsänvihreä",fuchsia:"purppura",gainsboro:"gainsboro",ghostwhite:"lakananvalkoinen",gold:"kulta",goldenrod:"kullanruskea",gray:"harmaa",green:"vihreä",greenyellow:"vihreänkeltainen",grey:"harmaa",honeydew:"hunajameloninvihreä",hotpink:"pinkki",indianred:"kirkkaanpunainen",indigo:"indigo",ivory:"norsunluu",khaki:"khaki",lavender:"laventeli",lavenderblush:"laventelinpunainen",lawngreen:"ruohonvihreä",lemonchiffon:"sitruunankeltainen",lightblue:"vaaleansininen",lightcoral:"vaalea koralli",lightcyan:"vaalea syaani",lightgoldenrodyellow:"vaalea kultapiiskunkeltainen",lightgray:"vaaleanharmaa",lightgreen:"vaaleanvihreä",lightgrey:"vaaleanharmaa",lightpink:"vaaleanpunainen",lightsalmon:"vaalea lohenpunainen",lightseagreen:"vaalea merenvihreä",lightskyblue:"vaalea taivaansininen",lightslategray:"vaaleanharmaa",lightslategrey:"vaaleanharmaa",lightsteelblue:"vaalea teräksensininen",lightyellow:"vaaleankeltainen",lime:"vaaleanvihreä",limegreen:"limetinvihreä",linen:"pellavanvaalea",magenta:"magenta",maroon:"kastanjanruskea",mediumaquamarine:"keskivaalea vedenvihreä",mediumblue:"keskisininen",mediumorchid:"keskivaalea orkidea",mediumpurple:"keskivaalea violetti",mediumseagreen:"keskivaalea merenvihreä",mediumslateblue:"keskivaalea siniharmaa",mediumspringgreen:"keskivaalea keväänvihreä",mediumturquoise:"keskivaalea turkoosi",mediumvioletred:"keskivaalea lila",midnightblue:"yönsininen",mintcream:"minttukreemi",mistyrose:"utuinen ruusu",moccasin:"nahanruskea",navajowhite:"navajonvalkoinen",navy:"laivastonsininen",oldlace:"vanha pitsi",olive:"oliivinvihreä",olivedrab:"oliivinruskea",orange:"oranssi",orangered:"oranssinpunainen",orchid:"orkidea",palegoldenrod:"haalea kultapiisku",palegreen:"haalea vihreä",paleturquoise:"haalea turkoosi",palevioletred:"haalea lila",papayawhip:"papaijavaahto",peachpuff:"persikka",peru:"peru",pink:"vaaleanpunainen",plum:"luumunpunainen",powderblue:"harmaansininen",purple:"violetti",red:"punainen",rosybrown:"punertavanruskea",royalblue:"syvänsininen",saddlebrown:"satulanruskea",salmon:"lohenpunainen",sandybrown:"hiekanruskea",seagreen:"merenvihreä",seashell:"simpukankuori",sienna:"siena",silver:"hopea",skyblue:"taivaansininen",slateblue:"savensininen",slategray:"savenharmaa",slategrey:"savenharmaa",snow:"lumivalkoinen",springgreen:"keväänvihreä",steelblue:"teräksensininen",tan:"kellanruskea",teal:"sinivihreä",thistle:"ohdake",tomato:"tomaatinpunainen",transparent:"läpinäkyvä",turquoise:"turkoosi",violet:"violetti",wheat:"vehnänkeltainen",white:"valkoinen",whitesmoke:"savunvalkea",yellow:"keltainen",yellowgreen:"kellanvihreä"})); \ No newline at end of file diff --git a/lib/dojo/nls/fi/colors.js.uncompressed.js b/lib/dojo/nls/fi/colors.js.uncompressed.js new file mode 100644 index 00000000..935c23b3 --- /dev/null +++ b/lib/dojo/nls/fi/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/fi/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "vaaleanharmaansininen", + antiquewhite: "antiikinvalkoinen", + aqua: "sinivihreä", + aquamarine: "vedenvihreä", + azure: "taivaansininen", + beige: "vaaleanruskea", + bisque: "vaaleanruskea", + black: "musta", + blanchedalmond: "kuorittu manteli", + blue: "sininen", + blueviolet: "sinivioletti", + brown: "ruskea", + burlywood: "puunruskea", + cadetblue: "meren vihreä", + chartreuse: "kellanvihreä", + chocolate: "suklaanruskea", + coral: "koralli", + cornflowerblue: "syvänsininen", + cornsilk: "maissinkeltainen", + crimson: "karmiininpunainen", + cyan: "syaani", + darkblue: "tummansininen", + darkcyan: "tumma turkoosi", + darkgoldenrod: "tumma kultapiisku", + darkgray: "tummanharmaa", + darkgreen: "tummanvihreä", + darkgrey: "tummanharmaa", // same as darkgray + darkkhaki: "tumma khaki", + darkmagenta: "tumma magenta", + darkolivegreen: "tummanoliivinvihreä", + darkorange: "tummanoranssi", + darkorchid: "tumma orkidea", + darkred: "tummanpunainen", + darksalmon: "tumma lohenpunainen", + darkseagreen: "tumma merenvihreä", + darkslateblue: "tumma siniharmaa", + darkslategray: "tummanharmaa", + darkslategrey: "tummanharmaa", // same as darkslategray + darkturquoise: "tumma turkoosi", + darkviolet: "tummanvioletti", + deeppink: "syvä vaaleanpunainen", + deepskyblue: "tumma taivaansininen", + dimgray: "himmeänharmaa", + dimgrey: "himmeänharmaa", // same as dimgray + dodgerblue: "Dodger-sininen", + firebrick: "poltetun tiilen punainen", + floralwhite: "kukanvalkoinen", + forestgreen: "metsänvihreä", + fuchsia: "purppura", + gainsboro: "gainsboro", + ghostwhite: "lakananvalkoinen", + gold: "kulta", + goldenrod: "kullanruskea", + gray: "harmaa", + green: "vihreä", + greenyellow: "vihreänkeltainen", + grey: "harmaa", // same as gray + honeydew: "hunajameloninvihreä", + hotpink: "pinkki", + indianred: "kirkkaanpunainen", + indigo: "indigo", + ivory: "norsunluu", + khaki: "khaki", + lavender: "laventeli", + lavenderblush: "laventelinpunainen", + lawngreen: "ruohonvihreä", + lemonchiffon: "sitruunankeltainen", + lightblue: "vaaleansininen", + lightcoral: "vaalea koralli", + lightcyan: "vaalea syaani", + lightgoldenrodyellow: "vaalea kultapiiskunkeltainen", + lightgray: "vaaleanharmaa", + lightgreen: "vaaleanvihreä", + lightgrey: "vaaleanharmaa", // same as lightgray + lightpink: "vaaleanpunainen", + lightsalmon: "vaalea lohenpunainen", + lightseagreen: "vaalea merenvihreä", + lightskyblue: "vaalea taivaansininen", + lightslategray: "vaaleanharmaa", + lightslategrey: "vaaleanharmaa", // same as lightslategray + lightsteelblue: "vaalea teräksensininen", + lightyellow: "vaaleankeltainen", + lime: "vaaleanvihreä", + limegreen: "limetinvihreä", + linen: "pellavanvaalea", + magenta: "magenta", + maroon: "kastanjanruskea", + mediumaquamarine: "keskivaalea vedenvihreä", + mediumblue: "keskisininen", + mediumorchid: "keskivaalea orkidea", + mediumpurple: "keskivaalea violetti", + mediumseagreen: "keskivaalea merenvihreä", + mediumslateblue: "keskivaalea siniharmaa", + mediumspringgreen: "keskivaalea keväänvihreä", + mediumturquoise: "keskivaalea turkoosi", + mediumvioletred: "keskivaalea lila", + midnightblue: "yönsininen", + mintcream: "minttukreemi", + mistyrose: "utuinen ruusu", + moccasin: "nahanruskea", + navajowhite: "navajonvalkoinen", + navy: "laivastonsininen", + oldlace: "vanha pitsi", + olive: "oliivinvihreä", + olivedrab: "oliivinruskea", + orange: "oranssi", + orangered: "oranssinpunainen", + orchid: "orkidea", + palegoldenrod: "haalea kultapiisku", + palegreen: "haalea vihreä", + paleturquoise: "haalea turkoosi", + palevioletred: "haalea lila", + papayawhip: "papaijavaahto", + peachpuff: "persikka", + peru: "peru", + pink: "vaaleanpunainen", + plum: "luumunpunainen", + powderblue: "harmaansininen", + purple: "violetti", + red: "punainen", + rosybrown: "punertavanruskea", + royalblue: "syvänsininen", + saddlebrown: "satulanruskea", + salmon: "lohenpunainen", + sandybrown: "hiekanruskea", + seagreen: "merenvihreä", + seashell: "simpukankuori", + sienna: "siena", + silver: "hopea", + skyblue: "taivaansininen", + slateblue: "savensininen", + slategray: "savenharmaa", + slategrey: "savenharmaa", // same as slategray + snow: "lumivalkoinen", + springgreen: "keväänvihreä", + steelblue: "teräksensininen", + tan: "kellanruskea", + teal: "sinivihreä", + thistle: "ohdake", + tomato: "tomaatinpunainen", + transparent: "läpinäkyvä", + turquoise: "turkoosi", + violet: "violetti", + wheat: "vehnänkeltainen", + white: "valkoinen", + whitesmoke: "savunvalkea", + yellow: "keltainen", + yellowgreen: "kellanvihreä" +}) +); diff --git a/lib/dojo/nls/fr/colors.js b/lib/dojo/nls/fr/colors.js index cf1e7e90..2ff1710e 100644 --- a/lib/dojo/nls/fr/colors.js +++ b/lib/dojo/nls/fr/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"bleu acier clair","orangered":"rouge orangé","midnightblue":"bleu nuit","cadetblue":"bleu pétrole","seashell":"coquillage","slategrey":"gris ardoise","coral":"corail","darkturquoise":"turquoise foncé","antiquewhite":"blanc antique","mediumspringgreen":"vert printemps moyen","salmon":"saumon","darkgrey":"gris foncé","ivory":"ivoire","greenyellow":"vert-jaune","mistyrose":"rose pâle","lightsalmon":"saumon clair","silver":"argent","dimgrey":"gris soutenu","orange":"orange","white":"blanc","navajowhite":"chair","royalblue":"bleu roi","deeppink":"rose soutenu","lime":"vert citron","oldlace":"blanc cassé","chartreuse":"vert vif","darkcyan":"cyan foncé","yellow":"jaune","linen":"écru","olive":"olive","gold":"or","lawngreen":"vert prairie","lightyellow":"jaune clair","tan":"grège","darkviolet":"violet foncé","lightslategrey":"gris ardoise clair","grey":"gris","darkkhaki":"kaki foncé","green":"vert","deepskyblue":"bleu ciel soutenu","aqua":"bleu-vert","sienna":"terre de sienne","mintcream":"crème de menthe","rosybrown":"vieux rose","mediumslateblue":"bleu ardoise moyen","magenta":"magenta","lightseagreen":"vert d'eau clair","cyan":"cyan","olivedrab":"brun verdâtre","darkgoldenrod":"jaune paille foncé","slateblue":"bleu ardoise","mediumaquamarine":"aigue-marine moyen","lavender":"lavande","mediumseagreen":"vert d'eau moyen","maroon":"marron","darkslategray":"gris ardoise foncé","mediumturquoise":"turquoise moyen","ghostwhite":"blanc laiteux","darkblue":"bleu foncé","mediumvioletred":"rouge violacé moyen","brown":"brun","lightgray":"gris clair","sandybrown":"sable","pink":"rose","firebrick":"rouge brique","indigo":"indigo","snow":"neige","darkorchid":"lilas foncé","turquoise":"turquoise","chocolate":"chocolat","springgreen":"vert printemps","moccasin":"chamois","navy":"bleu marine","lemonchiffon":"mousse de citron","teal":"sarcelle","floralwhite":"lys","cornflowerblue":"bleuet","paleturquoise":"turquoise pâle","purple":"pourpre","gainsboro":"gris souris","plum":"prune","red":"rouge","blue":"bleu","forestgreen":"vert sapin","darkgreen":"vert foncé","honeydew":"opalin","darkseagreen":"vert d'eau foncé","lightcoral":"corail clair","palevioletred":"rouge violacé pâle","mediumpurple":"pourpre moyen","saddlebrown":"brun cuir","darkmagenta":"magenta foncé","thistle":"chardon","whitesmoke":"blanc cendré","wheat":"blé","violet":"violet","lightskyblue":"bleu ciel clair","goldenrod":"jaune paille","mediumblue":"bleu moyen","skyblue":"bleu ciel","crimson":"cramoisi","darksalmon":"saumon foncé","darkred":"rouge foncé","darkslategrey":"gris ardoise foncé","peru":"caramel","lightgrey":"gris clair","lightgoldenrodyellow":"jaune paille clair","blanchedalmond":"coquille d'oeuf","aliceblue":"bleu gris","bisque":"beige rosé","slategray":"gris ardoise","palegoldenrod":"jaune paille pâle","darkorange":"orange foncé","aquamarine":"aigue-marine","lightgreen":"vert clair","burlywood":"bois précieux","dodgerblue":"bleu France","darkgray":"gris foncé","lightcyan":"cyan clair","powderblue":"bleu de smalt","blueviolet":"bleu-violet","orchid":"lilas","dimgray":"gris soutenu","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavandin","hotpink":"rose intense","steelblue":"bleu acier","tomato":"tomate","lightpink":"rose clair","limegreen":"citron vert","indianred":"rose indien","papayawhip":"crème de papaye","lightslategray":"gris ardoise clair","gray":"gris","mediumorchid":"lilas moyen","cornsilk":"vanille","black":"noir","seagreen":"vert d'eau","darkslateblue":"bleu ardoise foncé","khaki":"kaki","lightblue":"bleu clair","palegreen":"vert pâle","azure":"bleu azur","peachpuff":"pêche","darkolivegreen":"olive foncé","yellowgreen":"vert jaunâtre"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/fr/colors",({aliceblue:"bleu gris",antiquewhite:"blanc antique",aqua:"bleu-vert",aquamarine:"aigue-marine",azure:"bleu azur",beige:"beige",bisque:"beige rosé",black:"noir",blanchedalmond:"coquille d'œuf",blue:"bleu",blueviolet:"bleu-violet",brown:"brun",burlywood:"bois précieux",cadetblue:"bleu pétrole",chartreuse:"vert vif",chocolate:"chocolat",coral:"corail",cornflowerblue:"bleuet",cornsilk:"vanille",crimson:"cramoisi",cyan:"cyan",darkblue:"bleu foncé",darkcyan:"cyan foncé",darkgoldenrod:"jaune paille foncé",darkgray:"gris foncé",darkgreen:"vert foncé",darkgrey:"gris foncé",darkkhaki:"kaki foncé",darkmagenta:"magenta foncé",darkolivegreen:"olive foncé",darkorange:"orange foncé",darkorchid:"lilas foncé",darkred:"rouge foncé",darksalmon:"saumon foncé",darkseagreen:"vert d'eau foncé",darkslateblue:"bleu ardoise foncé",darkslategray:"gris ardoise foncé",darkslategrey:"gris ardoise foncé",darkturquoise:"turquoise foncé",darkviolet:"violet foncé",deeppink:"rose soutenu",deepskyblue:"bleu ciel soutenu",dimgray:"gris soutenu",dimgrey:"gris soutenu",dodgerblue:"bleu France",firebrick:"rouge brique",floralwhite:"lys",forestgreen:"vert sapin",fuchsia:"fuchsia",gainsboro:"gris souris",ghostwhite:"blanc laiteux",gold:"or",goldenrod:"jaune paille",gray:"gris",green:"vert",greenyellow:"vert-jaune",grey:"gris",honeydew:"opalin",hotpink:"rose intense",indianred:"rose indien",indigo:"indigo",ivory:"ivoire",khaki:"kaki",lavender:"lavande",lavenderblush:"lavandin",lawngreen:"vert prairie",lemonchiffon:"mousse de citron",lightblue:"bleu clair",lightcoral:"corail clair",lightcyan:"cyan clair",lightgoldenrodyellow:"jaune paille clair",lightgray:"gris clair",lightgreen:"vert clair",lightgrey:"gris clair",lightpink:"rose clair",lightsalmon:"saumon clair",lightseagreen:"vert d'eau clair",lightskyblue:"bleu ciel clair",lightslategray:"gris ardoise clair",lightslategrey:"gris ardoise clair",lightsteelblue:"bleu acier clair",lightyellow:"jaune clair",lime:"vert citron",limegreen:"citron vert",linen:"écru",magenta:"magenta",maroon:"marron",mediumaquamarine:"aigue-marine moyen",mediumblue:"bleu moyen",mediumorchid:"lilas moyen",mediumpurple:"pourpre moyen",mediumseagreen:"vert d'eau moyen",mediumslateblue:"bleu ardoise moyen",mediumspringgreen:"vert printemps moyen",mediumturquoise:"turquoise moyen",mediumvioletred:"rouge violacé moyen",midnightblue:"bleu nuit",mintcream:"crème de menthe",mistyrose:"rose pâle",moccasin:"chamois",navajowhite:"chair",navy:"bleu marine",oldlace:"blanc cassé",olive:"olive",olivedrab:"brun verdâtre",orange:"orange",orangered:"rouge orangé",orchid:"lilas",palegoldenrod:"jaune paille pâle",palegreen:"vert pâle",paleturquoise:"turquoise pâle",palevioletred:"rouge violacé pâle",papayawhip:"crème de papaye",peachpuff:"pêche",peru:"caramel",pink:"rose",plum:"prune",powderblue:"bleu de smalt",purple:"pourpre",red:"rouge",rosybrown:"vieux rose",royalblue:"bleu roi",saddlebrown:"brun cuir",salmon:"saumon",sandybrown:"sable",seagreen:"vert d'eau",seashell:"coquillage",sienna:"terre de sienne",silver:"argent",skyblue:"bleu ciel",slateblue:"bleu ardoise",slategray:"gris ardoise",slategrey:"gris ardoise",snow:"neige",springgreen:"vert printemps",steelblue:"bleu acier",tan:"grège",teal:"sarcelle",thistle:"chardon",tomato:"tomate",transparent:"transparent",turquoise:"turquoise",violet:"violet",wheat:"blé",white:"blanc",whitesmoke:"blanc cendré",yellow:"jaune",yellowgreen:"vert jaunâtre"})); \ No newline at end of file diff --git a/lib/dojo/nls/fr/colors.js.uncompressed.js b/lib/dojo/nls/fr/colors.js.uncompressed.js new file mode 100644 index 00000000..e04b5127 --- /dev/null +++ b/lib/dojo/nls/fr/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/fr/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "bleu gris", + antiquewhite: "blanc antique", + aqua: "bleu-vert", + aquamarine: "aigue-marine", + azure: "bleu azur", + beige: "beige", + bisque: "beige rosé", + black: "noir", + blanchedalmond: "coquille d'œuf", + blue: "bleu", + blueviolet: "bleu-violet", + brown: "brun", + burlywood: "bois précieux", + cadetblue: "bleu pétrole", + chartreuse: "vert vif", + chocolate: "chocolat", + coral: "corail", + cornflowerblue: "bleuet", + cornsilk: "vanille", + crimson: "cramoisi", + cyan: "cyan", + darkblue: "bleu foncé", + darkcyan: "cyan foncé", + darkgoldenrod: "jaune paille foncé", + darkgray: "gris foncé", + darkgreen: "vert foncé", + darkgrey: "gris foncé", // same as darkgray + darkkhaki: "kaki foncé", + darkmagenta: "magenta foncé", + darkolivegreen: "olive foncé", + darkorange: "orange foncé", + darkorchid: "lilas foncé", + darkred: "rouge foncé", + darksalmon: "saumon foncé", + darkseagreen: "vert d'eau foncé", + darkslateblue: "bleu ardoise foncé", + darkslategray: "gris ardoise foncé", + darkslategrey: "gris ardoise foncé", // same as darkslategray + darkturquoise: "turquoise foncé", + darkviolet: "violet foncé", + deeppink: "rose soutenu", + deepskyblue: "bleu ciel soutenu", + dimgray: "gris soutenu", + dimgrey: "gris soutenu", // same as dimgray + dodgerblue: "bleu France", + firebrick: "rouge brique", + floralwhite: "lys", + forestgreen: "vert sapin", + fuchsia: "fuchsia", + gainsboro: "gris souris", + ghostwhite: "blanc laiteux", + gold: "or", + goldenrod: "jaune paille", + gray: "gris", + green: "vert", + greenyellow: "vert-jaune", + grey: "gris", // same as gray + honeydew: "opalin", + hotpink: "rose intense", + indianred: "rose indien", + indigo: "indigo", + ivory: "ivoire", + khaki: "kaki", + lavender: "lavande", + lavenderblush: "lavandin", + lawngreen: "vert prairie", + lemonchiffon: "mousse de citron", + lightblue: "bleu clair", + lightcoral: "corail clair", + lightcyan: "cyan clair", + lightgoldenrodyellow: "jaune paille clair", + lightgray: "gris clair", + lightgreen: "vert clair", + lightgrey: "gris clair", // same as lightgray + lightpink: "rose clair", + lightsalmon: "saumon clair", + lightseagreen: "vert d'eau clair", + lightskyblue: "bleu ciel clair", + lightslategray: "gris ardoise clair", + lightslategrey: "gris ardoise clair", // same as lightslategray + lightsteelblue: "bleu acier clair", + lightyellow: "jaune clair", + lime: "vert citron", + limegreen: "citron vert", + linen: "écru", + magenta: "magenta", + maroon: "marron", + mediumaquamarine: "aigue-marine moyen", + mediumblue: "bleu moyen", + mediumorchid: "lilas moyen", + mediumpurple: "pourpre moyen", + mediumseagreen: "vert d'eau moyen", + mediumslateblue: "bleu ardoise moyen", + mediumspringgreen: "vert printemps moyen", + mediumturquoise: "turquoise moyen", + mediumvioletred: "rouge violacé moyen", + midnightblue: "bleu nuit", + mintcream: "crème de menthe", + mistyrose: "rose pâle", + moccasin: "chamois", + navajowhite: "chair", + navy: "bleu marine", + oldlace: "blanc cassé", + olive: "olive", + olivedrab: "brun verdâtre", + orange: "orange", + orangered: "rouge orangé", + orchid: "lilas", + palegoldenrod: "jaune paille pâle", + palegreen: "vert pâle", + paleturquoise: "turquoise pâle", + palevioletred: "rouge violacé pâle", + papayawhip: "crème de papaye", + peachpuff: "pêche", + peru: "caramel", + pink: "rose", + plum: "prune", + powderblue: "bleu de smalt", + purple: "pourpre", + red: "rouge", + rosybrown: "vieux rose", + royalblue: "bleu roi", + saddlebrown: "brun cuir", + salmon: "saumon", + sandybrown: "sable", + seagreen: "vert d'eau", + seashell: "coquillage", + sienna: "terre de sienne", + silver: "argent", + skyblue: "bleu ciel", + slateblue: "bleu ardoise", + slategray: "gris ardoise", + slategrey: "gris ardoise", // same as slategray + snow: "neige", + springgreen: "vert printemps", + steelblue: "bleu acier", + tan: "grège", + teal: "sarcelle", + thistle: "chardon", + tomato: "tomate", + transparent: "transparent", + turquoise: "turquoise", + violet: "violet", + wheat: "blé", + white: "blanc", + whitesmoke: "blanc cendré", + yellow: "jaune", + yellowgreen: "vert jaunâtre" +}) +); diff --git a/lib/dojo/nls/he/colors.js b/lib/dojo/nls/he/colors.js index a689ec62..5ec2f42e 100644 --- a/lib/dojo/nls/he/colors.js +++ b/lib/dojo/nls/he/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"כחול פלדה בהיר","orangered":"כתום אדום","midnightblue":"כחול כהה","cadetblue":"כחול ים","seashell":"צדף","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"לבן עתיק","mediumspringgreen":"ירוק אביב בינוני","salmon":"סלמון","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירוק-צהוב","mistyrose":"ורוד מעורפל","lightsalmon":"סלמון בהיר","silver":"כסף","dimgrey":"אפור עמום","orange":"כתום","white":"לבן","navajowhite":"לבן נוואחו","royalblue":"כחול מלכותי","deeppink":"ורוד עמוק","lime":"לימון","oldlace":"תחרה עתיקה","chartreuse":"ירוק-צהוב","darkcyan":"טורקיז כהה","yellow":"צהוב","linen":"פשתן","olive":"זית","gold":"זהב","lawngreen":"ירוק דשא","lightyellow":"צהוב בהיר","tan":"חום אדמדם","darkviolet":"סגול כהה","lightslategrey":"אפור צפחה בהיר","grey":"אפור","darkkhaki":"חאקי כהה","green":"ירוק","deepskyblue":"כחול שמיים עמוק","aqua":"אקווה","sienna":"סיינה","mintcream":"קרם מנטה","rosybrown":"חום ורדרד","mediumslateblue":"כחול צפחה בינוני","magenta":"בורדו","lightseagreen":"ירוק ים בהיר","cyan":"טורקיז","olivedrab":"זית עמום","darkgoldenrod":"זהוב כהה","slateblue":"כחול צפחה","mediumaquamarine":"כחול בינוני","lavender":"לבנדר","mediumseagreen":"ירוק ים בינוני","maroon":"חום אדמדם","darkslategray":"אפור צפחה כהה","mediumturquoise":"טורקיז בינוני","ghostwhite":"לבן רפאים","darkblue":"כחול כהה","mediumvioletred":"סגול-אדום בינוני","brown":"חום","lightgray":"אפור בהיר","sandybrown":"חום חולי","pink":"ורוד","firebrick":"לבנה שרופה","indigo":"אינדיגו","snow":"שלג","darkorchid":"סחלב כהה","turquoise":"טורקיז","chocolate":"שוקולד","springgreen":"ירוק אביב","moccasin":"מוקסין","navy":"כחול כהה","lemonchiffon":"ירוק לימון","teal":"כחול-ירוק כהה","floralwhite":"לבן פרחוני","cornflowerblue":"כחול דרדר","paleturquoise":"טורקיז בהיר","purple":"סגול","gainsboro":"גיינסבורו","plum":"שזיף","red":"אדום","blue":"כחול","forestgreen":"ירוק יער","darkgreen":"ירוק כהה","honeydew":"ירקרק","darkseagreen":"ירוק ים כהה","lightcoral":"אלמוג בהיר","palevioletred":"סגול-אדום בהיר","mediumpurple":"סגול בינוני","saddlebrown":"חום דהוי","darkmagenta":"בורדו כהה","thistle":"דרדר","whitesmoke":"עשן לבן","wheat":"חיוט","violet":"סגול","lightskyblue":"כחול שמיים בהיר","goldenrod":"זהוב","mediumblue":"תכלת בינוני","skyblue":"כחול שמיים","crimson":"ארגמן","darksalmon":"סלמון כהה","darkred":"אדום כהה","darkslategrey":"אפור צפחה כהה","peru":"פרו","lightgrey":"אפור בהיר","lightgoldenrodyellow":"צהוב בהיר","blanchedalmond":"שקד","aliceblue":"כחול פלדה","bisque":"לבן שקד","slategray":"אפור צפחה","palegoldenrod":"זהוב בהיר","darkorange":"כתום כהה","aquamarine":"אקוומארין","lightgreen":"ירוק בהיר","burlywood":"חום דהוי","dodgerblue":"כחול","darkgray":"אפור כהה","lightcyan":"טורקיז בהיר","powderblue":"כחול חיוור","blueviolet":"כחול-סגול","orchid":"סחלב","dimgray":"אפור עמום","beige":"בז'","fuchsia":"ורוד בהיר","lavenderblush":"סומק לבנדר","hotpink":"ורוד לוהט","steelblue":"כחול פלדה","tomato":"עגבניה","lightpink":"ורוד בהיר","limegreen":"ירוק לימוני","indianred":"אדום דהוי","papayawhip":"פפאיה","lightslategray":"אפור צפחה בהיר","gray":"אפור","mediumorchid":"סחלב בינוני","cornsilk":"צהבהב","black":"שחור","seagreen":"ירוק ים","darkslateblue":"כחול צפחה כהה","khaki":"חאקי","lightblue":"תכלת","palegreen":"ירוק בהיר","azure":"תכלת עז","peachpuff":"קציפת אפרסק","darkolivegreen":"ירוק זית כהה","yellowgreen":"ירוק צהוב"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/he/colors",({aliceblue:"כחול פלדה",antiquewhite:"לבן עתיק",aqua:"אקווה",aquamarine:"אקוומארין",azure:"תכלת עז",beige:"בז'",bisque:"לבן שקד",black:"שחור",blanchedalmond:"שקד",blue:"כחול",blueviolet:"כחול-סגול",brown:"חום",burlywood:"חום דהוי",cadetblue:"כחול ים",chartreuse:"ירוק-צהוב",chocolate:"שוקולד",coral:"אלמוג",cornflowerblue:"כחול דרדר",cornsilk:"צהבהב",crimson:"ארגמן",cyan:"טורקיז",darkblue:"כחול כהה",darkcyan:"טורקיז כהה",darkgoldenrod:"זהוב כהה",darkgray:"אפור כהה",darkgreen:"ירוק כהה",darkgrey:"אפור כהה",darkkhaki:"חאקי כהה",darkmagenta:"בורדו כהה",darkolivegreen:"ירוק זית כהה",darkorange:"כתום כהה",darkorchid:"סחלב כהה",darkred:"אדום כהה",darksalmon:"סלמון כהה",darkseagreen:"ירוק ים כהה",darkslateblue:"כחול צפחה כהה",darkslategray:"אפור צפחה כהה",darkslategrey:"אפור צפחה כהה",darkturquoise:"טורקיז כהה",darkviolet:"סגול כהה",deeppink:"ורוד עמוק",deepskyblue:"כחול שמיים עמוק",dimgray:"אפור עמום",dimgrey:"אפור עמום",dodgerblue:"כחול",firebrick:"לבנה שרופה",floralwhite:"לבן פרחוני",forestgreen:"ירוק יער",fuchsia:"ורוד בהיר",gainsboro:"גיינסבורו",ghostwhite:"לבן רפאים",gold:"זהב",goldenrod:"זהוב",gray:"אפור",green:"ירוק",greenyellow:"ירוק-צהוב",grey:"אפור",honeydew:"ירקרק",hotpink:"ורוד לוהט",indianred:"אדום דהוי",indigo:"אינדיגו",ivory:"שנהב",khaki:"חאקי",lavender:"לבנדר",lavenderblush:"סומק לבנדר",lawngreen:"ירוק דשא",lemonchiffon:"ירוק לימון",lightblue:"תכלת",lightcoral:"אלמוג בהיר",lightcyan:"טורקיז בהיר",lightgoldenrodyellow:"צהוב בהיר",lightgray:"אפור בהיר",lightgreen:"ירוק בהיר",lightgrey:"אפור בהיר",lightpink:"ורוד בהיר",lightsalmon:"סלמון בהיר",lightseagreen:"ירוק ים בהיר",lightskyblue:"כחול שמיים בהיר",lightslategray:"אפור צפחה בהיר",lightslategrey:"אפור צפחה בהיר",lightsteelblue:"כחול פלדה בהיר",lightyellow:"צהוב בהיר",lime:"לימון",limegreen:"ירוק לימוני",linen:"פשתן",magenta:"בורדו",maroon:"חום אדמדם",mediumaquamarine:"כחול בינוני",mediumblue:"תכלת בינוני",mediumorchid:"סחלב בינוני",mediumpurple:"סגול בינוני",mediumseagreen:"ירוק ים בינוני",mediumslateblue:"כחול צפחה בינוני",mediumspringgreen:"ירוק אביב בינוני",mediumturquoise:"טורקיז בינוני",mediumvioletred:"סגול-אדום בינוני",midnightblue:"כחול כהה",mintcream:"קרם מנטה",mistyrose:"ורוד מעורפל",moccasin:"מוקסין",navajowhite:"לבן נוואחו",navy:"כחול כהה",oldlace:"תחרה עתיקה",olive:"זית",olivedrab:"זית עמום",orange:"כתום",orangered:"כתום אדום",orchid:"סחלב",palegoldenrod:"זהוב בהיר",palegreen:"ירוק בהיר",paleturquoise:"טורקיז בהיר",palevioletred:"סגול-אדום בהיר",papayawhip:"פפאיה",peachpuff:"קציפת אפרסק",peru:"פרו",pink:"ורוד",plum:"שזיף",powderblue:"כחול חיוור",purple:"סגול",red:"אדום",rosybrown:"חום ורדרד",royalblue:"כחול מלכותי",saddlebrown:"חום דהוי",salmon:"סלמון",sandybrown:"חום חולי",seagreen:"ירוק ים",seashell:"צדף",sienna:"סיינה",silver:"כסף",skyblue:"כחול שמיים",slateblue:"כחול צפחה",slategray:"אפור צפחה",slategrey:"אפור צפחה",snow:"שלג",springgreen:"ירוק אביב",steelblue:"כחול פלדה",tan:"חום אדמדם",teal:"כחול-ירוק כהה",thistle:"דרדר",tomato:"עגבניה",turquoise:"טורקיז",violet:"סגול",wheat:"חיוט",white:"לבן",whitesmoke:"עשן לבן",yellow:"צהוב",yellowgreen:"ירוק צהוב"})); \ No newline at end of file diff --git a/lib/dojo/nls/he/colors.js.uncompressed.js b/lib/dojo/nls/he/colors.js.uncompressed.js new file mode 100644 index 00000000..e986b09c --- /dev/null +++ b/lib/dojo/nls/he/colors.js.uncompressed.js @@ -0,0 +1,158 @@ +define( +"dojo/nls/he/colors", //begin v1.x content +({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + +//Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color e.g. gray vs. gray. +//TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? +aliceblue: "כחול פלדה", +antiquewhite: "לבן עתיק", +aqua: "אקווה", +aquamarine: "אקוומארין", +azure: "תכלת עז", +beige: "בז'", +bisque: "לבן שקד", +black: "שחור", +blanchedalmond: "שקד", +blue: "כחול", +blueviolet: "כחול-סגול", +brown: "חום", +burlywood: "חום דהוי", +cadetblue: "כחול ים", +chartreuse: "ירוק-צהוב", +chocolate: "שוקולד", +coral: "אלמוג", +cornflowerblue: "כחול דרדר", +cornsilk: "צהבהב", +crimson: "ארגמן", +cyan: "טורקיז", +darkblue: "כחול כהה", +darkcyan: "טורקיז כהה", +darkgoldenrod: "זהוב כהה", +darkgray: "אפור כהה", +darkgreen: "ירוק כהה", +darkgrey: "אפור כהה", // same as darkgray +darkkhaki: "חאקי כהה", +darkmagenta: "בורדו כהה", +darkolivegreen: "ירוק זית כהה", +darkorange: "כתום כהה", +darkorchid: "סחלב כהה", +darkred: "אדום כהה", +darksalmon: "סלמון כהה", +darkseagreen: "ירוק ים כהה", +darkslateblue: "כחול צפחה כהה", +darkslategray: "אפור צפחה כהה", +darkslategrey: "אפור צפחה כהה", // same as darkslategray +darkturquoise: "טורקיז כהה", +darkviolet: "סגול כהה", +deeppink: "ורוד עמוק", +deepskyblue: "כחול שמיים עמוק", +dimgray: "אפור עמום", +dimgrey: "אפור עמום", // same as dimgray +dodgerblue: "כחול", +firebrick: "לבנה שרופה", +floralwhite: "לבן פרחוני", +forestgreen: "ירוק יער", +fuchsia: "ורוד בהיר", +gainsboro: "גיינסבורו", +ghostwhite: "לבן רפאים", +gold: "זהב", +goldenrod: "זהוב", +gray: "אפור", +green: "ירוק", +greenyellow: "ירוק-צהוב", +grey: "אפור", // same as gray +honeydew: "ירקרק", +hotpink: "ורוד לוהט", +indianred: "אדום דהוי", +indigo: "אינדיגו", +ivory: "שנהב", +khaki: "חאקי", +lavender: "לבנדר", +lavenderblush: "סומק לבנדר", +lawngreen: "ירוק דשא", +lemonchiffon: "ירוק לימון", +lightblue: "תכלת", +lightcoral: "אלמוג בהיר", +lightcyan: "טורקיז בהיר", +lightgoldenrodyellow: "צהוב בהיר", +lightgray: "אפור בהיר", +lightgreen: "ירוק בהיר", +lightgrey: "אפור בהיר", // same as lightgray +lightpink: "ורוד בהיר", +lightsalmon: "סלמון בהיר", +lightseagreen: "ירוק ים בהיר", +lightskyblue: "כחול שמיים בהיר", +lightslategray: "אפור צפחה בהיר", +lightslategrey: "אפור צפחה בהיר", // same as lightslategray +lightsteelblue: "כחול פלדה בהיר", +lightyellow: "צהוב בהיר", +lime: "לימון", +limegreen: "ירוק לימוני", +linen: "פשתן", +magenta: "בורדו", +maroon: "חום אדמדם", +mediumaquamarine: "כחול בינוני", +mediumblue: "תכלת בינוני", +mediumorchid: "סחלב בינוני", +mediumpurple: "סגול בינוני", +mediumseagreen: "ירוק ים בינוני", +mediumslateblue: "כחול צפחה בינוני", +mediumspringgreen: "ירוק אביב בינוני", +mediumturquoise: "טורקיז בינוני", +mediumvioletred: "סגול-אדום בינוני", +midnightblue: "כחול כהה", +mintcream: "קרם מנטה", +mistyrose: "ורוד מעורפל", +moccasin: "מוקסין", +navajowhite: "לבן נוואחו", +navy: "כחול כהה", +oldlace: "תחרה עתיקה", +olive: "זית", +olivedrab: "זית עמום", +orange: "כתום", +orangered: "כתום אדום", +orchid: "סחלב", +palegoldenrod: "זהוב בהיר", +palegreen: "ירוק בהיר", +paleturquoise: "טורקיז בהיר", +palevioletred: "סגול-אדום בהיר", +papayawhip: "פפאיה", +peachpuff: "קציפת אפרסק", +peru: "פרו", +pink: "ורוד", +plum: "שזיף", +powderblue: "כחול חיוור", +purple: "סגול", +red: "אדום", +rosybrown: "חום ורדרד", +royalblue: "כחול מלכותי", +saddlebrown: "חום דהוי", +salmon: "סלמון", +sandybrown: "חום חולי", +seagreen: "ירוק ים", +seashell: "צדף", +sienna: "סיינה", +silver: "כסף", +skyblue: "כחול שמיים", +slateblue: "כחול צפחה", +slategray: "אפור צפחה", +slategrey: "אפור צפחה", // same as slategray +snow: "שלג", +springgreen: "ירוק אביב", +steelblue: "כחול פלדה", +tan: "חום אדמדם", +teal: "כחול-ירוק כהה", +thistle: "דרדר", +tomato: "עגבניה", +turquoise: "טורקיז", +violet: "סגול", +wheat: "חיוט", +white: "לבן", +whitesmoke: "עשן לבן", +yellow: "צהוב", +yellowgreen: "ירוק צהוב" +}) +//end v1.x content +); diff --git a/lib/dojo/nls/hr/colors.js b/lib/dojo/nls/hr/colors.js new file mode 100644 index 00000000..91b9c6ce --- /dev/null +++ b/lib/dojo/nls/hr/colors.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/hr/colors",({aliceblue:"alice plava",antiquewhite:"antique bijela",aqua:"aqua",aquamarine:"akvamarin",azure:"azurna",beige:"bež",bisque:"svjetlo smeđe ružičasta",black:"crna",blanchedalmond:"slonovača",blue:"plava",blueviolet:"plavo ljubičasta",brown:"smeđa",burlywood:"pješčano smeđa",cadetblue:"plavo siva",chartreuse:"chartreuse",chocolate:"čokoladna",coral:"koraljna",cornflowerblue:"različak plava",cornsilk:"cornsilk",crimson:"rumena",cyan:"cijan",darkblue:"tamno plava",darkcyan:"tamno cijan",darkgoldenrod:"tamno zlatno žuta",darkgray:"tamno siva",darkgreen:"tamno zelena",darkgrey:"tamno siva",darkkhaki:"tamno sivo smeđa",darkmagenta:"tamno grimizna",darkolivegreen:"tamno maslinasto zelena",darkorange:"tamno narančasta",darkorchid:"tamno ružičasta",darkred:"tamno crvena",darksalmon:"tamno žuto ružičasta",darkseagreen:"tamno plavo zelena",darkslateblue:"tamno sivo plava",darkslategray:"tamno plavo siva",darkslategrey:"tamno plavo siva",darkturquoise:"tamno tirkizna",darkviolet:"tamno ljubičasta",deeppink:"intenzivno ružičasta",deepskyblue:"intenzivno nebesko plava",dimgray:"mutno siva",dimgrey:"mutno siva",dodgerblue:"dodger plava",firebrick:"žarko crvena",floralwhite:"cvjetno bijela",forestgreen:"tamno zelena",fuchsia:"fuksija",gainsboro:"gainsboro",ghostwhite:"sivo bijela",gold:"zlatna",goldenrod:"zlatno žuta",gray:"siva",green:"zelena",greenyellow:"zeleno-žuta",grey:"siva",honeydew:"honeydew",hotpink:"žarko ružičasta",indianred:"indijski crveno",indigo:"indigo",ivory:"slonovača",khaki:"sivo smeđa",lavender:"lavanda",lavenderblush:"lavanda",lawngreen:"livadno zelena",lemonchiffon:"nježno žuta",lightblue:"svjetlo plava",lightcoral:"svjetlo koraljna",lightcyan:"svjetlo cijan",lightgoldenrodyellow:"svjetlo zlatno žuta",lightgray:"svjetlo siva",lightgreen:"svjetlo zelena",lightgrey:"svjetlo siva",lightpink:"svjetlo ružičasta",lightsalmon:"svjetlo žuto ružičasta",lightseagreen:"svjetlo plavo zelena",lightskyblue:"svjetlo nebesko plava",lightslategray:"svjetlo plavo siva",lightslategrey:"svjetlo plavo siva",lightsteelblue:"svjetlo čelično plava",lightyellow:"svjetlo žuta",lime:"limeta",limegreen:"limeta zelena",linen:"platno",magenta:"grimizna",maroon:"kestenjasta",mediumaquamarine:"srednje akvamarin",mediumblue:"srednje plava",mediumorchid:"srednje ružičasta",mediumpurple:"srednje purpurna",mediumseagreen:"srednje plavo zelena",mediumslateblue:"srednje sivo plava",mediumspringgreen:"srednje proljetno zelena",mediumturquoise:"srednje tirkizna",mediumvioletred:"srednje ljubičasto-crvena",midnightblue:"ponoćno plava",mintcream:"blijedo zelena",mistyrose:"mutno ružičasta",moccasin:"moccasin",navajowhite:"krem bijela",navy:"mornarsko plava",oldlace:"old lace",olive:"maslinasta",olivedrab:"maslinasta",orange:"narančasta",orangered:"narančasto crvena",orchid:"ružičasta",palegoldenrod:"blijedo zlatno žuta",palegreen:"svjetlo zelena",paleturquoise:"blijedo tirkizna",palevioletred:"blijedo ljubičasto crvena",papayawhip:"blijedo narančasta",peachpuff:"breskva",peru:"peru",pink:"ružičasta",plum:"šljiva",powderblue:"blijedo plava",purple:"purpurna",red:"crvena",rosybrown:"ružičasto smeđa",royalblue:"kraljevski plava",saddlebrown:"srednje smeđa",salmon:"ružičasta",sandybrown:"pješčano smeđa",seagreen:"plavo zelena",seashell:"nježno ružičasta",sienna:"sjena",silver:"srebrna",skyblue:"nebesko plava",slateblue:"sivo plava",slategray:"plavo siva",slategrey:"plavo siva",snow:"snijeg",springgreen:"proljetno zeleno",steelblue:"čelično plava",tan:"ten",teal:"teal",thistle:"čičak",tomato:"rajčica",transparent:"prozirno",turquoise:"tirkizna",violet:"ljubičasta",wheat:"pšenica",white:"bijela",whitesmoke:"bijeli dim",yellow:"žuta",yellowgreen:"žuto zelena"})); \ No newline at end of file diff --git a/lib/dojo/nls/hr/colors.js.uncompressed.js b/lib/dojo/nls/hr/colors.js.uncompressed.js new file mode 100644 index 00000000..2928d26e --- /dev/null +++ b/lib/dojo/nls/hr/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/hr/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. +//Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color e.g. gray vs. gray. +//TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? +aliceblue: "alice plava", +antiquewhite: "antique bijela", +aqua: "aqua", +aquamarine: "akvamarin", +azure: "azurna", +beige: "bež", +bisque: "svjetlo smeđe ružičasta", +black: "crna", +blanchedalmond: "slonovača", +blue: "plava", +blueviolet: "plavo ljubičasta", +brown: "smeđa", +burlywood: "pješčano smeđa", +cadetblue: "plavo siva", +chartreuse: "chartreuse", +chocolate: "čokoladna", +coral: "koraljna", +cornflowerblue: "različak plava", +cornsilk: "cornsilk", +crimson: "rumena", +cyan: "cijan", +darkblue: "tamno plava", +darkcyan: "tamno cijan", +darkgoldenrod: "tamno zlatno žuta", +darkgray: "tamno siva", +darkgreen: "tamno zelena", +darkgrey: "tamno siva", // same as darkgray +darkkhaki: "tamno sivo smeđa", +darkmagenta: "tamno grimizna", +darkolivegreen: "tamno maslinasto zelena", +darkorange: "tamno narančasta", +darkorchid: "tamno ružičasta", +darkred: "tamno crvena", +darksalmon: "tamno žuto ružičasta", +darkseagreen: "tamno plavo zelena", +darkslateblue: "tamno sivo plava", +darkslategray: "tamno plavo siva", +darkslategrey: "tamno plavo siva", // same as darkslategray +darkturquoise: "tamno tirkizna", +darkviolet: "tamno ljubičasta", +deeppink: "intenzivno ružičasta", +deepskyblue: "intenzivno nebesko plava", +dimgray: "mutno siva", +dimgrey: "mutno siva", // same as dimgray +dodgerblue: "dodger plava", +firebrick: "žarko crvena", +floralwhite: "cvjetno bijela", +forestgreen: "tamno zelena", +fuchsia: "fuksija", +gainsboro: "gainsboro", +ghostwhite: "sivo bijela", +gold: "zlatna", +goldenrod: "zlatno žuta", +gray: "siva", +green: "zelena", +greenyellow: "zeleno-žuta", +grey: "siva", // same as gray +honeydew: "honeydew", +hotpink: "žarko ružičasta", +indianred: "indijski crveno", +indigo: "indigo", +ivory: "slonovača", +khaki: "sivo smeđa", +lavender: "lavanda", +lavenderblush: "lavanda", +lawngreen: "livadno zelena", +lemonchiffon: "nježno žuta", +lightblue: "svjetlo plava", +lightcoral: "svjetlo koraljna", +lightcyan: "svjetlo cijan", +lightgoldenrodyellow: "svjetlo zlatno žuta", +lightgray: "svjetlo siva", +lightgreen: "svjetlo zelena", +lightgrey: "svjetlo siva", // same as lightgray +lightpink: "svjetlo ružičasta", +lightsalmon: "svjetlo žuto ružičasta", +lightseagreen: "svjetlo plavo zelena", +lightskyblue: "svjetlo nebesko plava", +lightslategray: "svjetlo plavo siva", +lightslategrey: "svjetlo plavo siva", // same as lightslategray +lightsteelblue: "svjetlo čelično plava", +lightyellow: "svjetlo žuta", +lime: "limeta", +limegreen: "limeta zelena", +linen: "platno", +magenta: "grimizna", +maroon: "kestenjasta", +mediumaquamarine: "srednje akvamarin", +mediumblue: "srednje plava", +mediumorchid: "srednje ružičasta", +mediumpurple: "srednje purpurna", +mediumseagreen: "srednje plavo zelena", +mediumslateblue: "srednje sivo plava", +mediumspringgreen: "srednje proljetno zelena", +mediumturquoise: "srednje tirkizna", +mediumvioletred: "srednje ljubičasto-crvena", +midnightblue: "ponoćno plava", +mintcream: "blijedo zelena", +mistyrose: "mutno ružičasta", +moccasin: "moccasin", +navajowhite: "krem bijela", +navy: "mornarsko plava", +oldlace: "old lace", +olive: "maslinasta", +olivedrab: "maslinasta", +orange: "narančasta", +orangered: "narančasto crvena", +orchid: "ružičasta", +palegoldenrod: "blijedo zlatno žuta", +palegreen: "svjetlo zelena", +paleturquoise: "blijedo tirkizna", +palevioletred: "blijedo ljubičasto crvena", +papayawhip: "blijedo narančasta", +peachpuff: "breskva", +peru: "peru", +pink: "ružičasta", +plum: "šljiva", +powderblue: "blijedo plava", +purple: "purpurna", +red: "crvena", +rosybrown: "ružičasto smeđa", +royalblue: "kraljevski plava", +saddlebrown: "srednje smeđa", +salmon: "ružičasta", +sandybrown: "pješčano smeđa", +seagreen: "plavo zelena", +seashell: "nježno ružičasta", +sienna: "sjena", +silver: "srebrna", +skyblue: "nebesko plava", +slateblue: "sivo plava", +slategray: "plavo siva", +slategrey: "plavo siva", // same as slategray +snow: "snijeg", +springgreen: "proljetno zeleno", +steelblue: "čelično plava", +tan: "ten", +teal: "teal", +thistle: "čičak", +tomato: "rajčica", +transparent: "prozirno", +turquoise: "tirkizna", +violet: "ljubičasta", +wheat: "pšenica", +white: "bijela", +whitesmoke: "bijeli dim", +yellow: "žuta", +yellowgreen: "žuto zelena" +}) +); diff --git a/lib/dojo/nls/hu/colors.js b/lib/dojo/nls/hu/colors.js index c0bce74c..6c4fd09a 100644 --- a/lib/dojo/nls/hu/colors.js +++ b/lib/dojo/nls/hu/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"világos acélkék","orangered":"narancsvörös","midnightblue":"éjkék","cadetblue":"kadétkék","seashell":"kagyló","slategrey":"palaszürke","coral":"korall","darkturquoise":"sötét türkizkék","antiquewhite":"antik fehér","mediumspringgreen":"közepes tavaszzöld","salmon":"lazacszín","darkgrey":"sötétszürke","ivory":"elefántcsont","greenyellow":"zöldessárga","mistyrose":"halvány rózsaszín","lightsalmon":"világos lazacszín","silver":"ezüst","dimgrey":"halványszürke","orange":"narancssárga","white":"fehér","navajowhite":"navajo fehér","royalblue":"királykék","deeppink":"sötétrózsaszín","lime":"lime","oldlace":"régi csipke","chartreuse":"chartreuse","darkcyan":"sötét ciánkék","yellow":"sárga","linen":"vászonfehér","olive":"olajzöld","gold":"arany","lawngreen":"fűzöld","lightyellow":"világossárga","tan":"rozsdabarna","darkviolet":"sötét ibolyaszín","lightslategrey":"világos palaszürke","grey":"szürke","darkkhaki":"sötét khakiszín","green":"zöld","deepskyblue":"sötét égszínkék","aqua":"vízszín","sienna":"vörösesbarna","mintcream":"mentaszósz","rosybrown":"barnásrózsaszín","mediumslateblue":"közepes palakék","magenta":"bíbor","lightseagreen":"világos tengerzöld","cyan":"ciánkék","olivedrab":"olajzöld drapp","darkgoldenrod":"sötét aranyvessző","slateblue":"palakék","mediumaquamarine":"közepes akvamarin","lavender":"levendula","mediumseagreen":"közepes tengerzöld","maroon":"gesztenyebarna","darkslategray":"sötét palaszürke","mediumturquoise":"közepes türkizkék","ghostwhite":"szellemfehér","darkblue":"sötétkék","mediumvioletred":"közepes ibolyavörös","brown":"barna","lightgray":"világosszürke","sandybrown":"homokbarna","pink":"rózsaszín","firebrick":"téglavörös","indigo":"indigó","snow":"hó","darkorchid":"sötét orchidea","turquoise":"türkizkék","chocolate":"csokoládé","springgreen":"tavaszzöld","moccasin":"mokkaszín","navy":"tengerészkék","lemonchiffon":"sárga műselyem","teal":"pávakék","floralwhite":"virágfehér","cornflowerblue":"búzavirágkék","paleturquoise":"halvány türkizkék","purple":"lila","gainsboro":"gainsboro","plum":"szilvakék","red":"vörös","blue":"kék","forestgreen":"erdőzöld","darkgreen":"sötétzöld","honeydew":"mézharmat","darkseagreen":"sötét tengerzöld","lightcoral":"világos korall","palevioletred":"halvány ibolyavörös","mediumpurple":"közepes lila","saddlebrown":"nyeregbarna","darkmagenta":"sötétbíbor","thistle":"bogáncs","whitesmoke":"fehér füst","wheat":"búza","violet":"ibolyaszín","lightskyblue":"világos égszínkék","goldenrod":"aranyvessző","mediumblue":"közepes kék","skyblue":"égszínkék","crimson":"karmazsinvörös","darksalmon":"sötét lazacszín","darkred":"sötétvörös","darkslategrey":"sötét palaszürke","peru":"peru","lightgrey":"világosszürke","lightgoldenrodyellow":"világos aranyvessző sárga","blanchedalmond":"hámozott mandula","aliceblue":"Alice kék","bisque":"porcelán","slategray":"palaszürke","palegoldenrod":"halvány aranyvessző","darkorange":"sötét narancssárga","aquamarine":"akvamarin","lightgreen":"világoszöld","burlywood":"nyersfa","dodgerblue":"dodger kék","darkgray":"sötétszürke","lightcyan":"világos ciánkék","powderblue":"púderkék","blueviolet":"ibolyakék","orchid":"orchidea","dimgray":"halványszürke","beige":"bézs","fuchsia":"fukszia","lavenderblush":"pirosas levendula","hotpink":"meleg rózsaszín","steelblue":"acélkék","tomato":"paradicsom","lightpink":"világos rózsaszín","limegreen":"limezöld","indianred":"indiánvörös","papayawhip":"papayahab","lightslategray":"világos palaszürke","gray":"szürke","mediumorchid":"közepes orchidea","cornsilk":"kukoricahaj","black":"fekete","seagreen":"tengerzöld","darkslateblue":"sötét palakék","khaki":"khakiszín","lightblue":"világoskék","palegreen":"halványzöld","azure":"azúrkék","peachpuff":"barackszín","darkolivegreen":"sötét olajzöld","yellowgreen":"sárgászöld"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/hu/colors",({aliceblue:"Alice kék",antiquewhite:"antik fehér",aqua:"vízszín",aquamarine:"akvamarin",azure:"azúrkék",beige:"bézs",bisque:"porcelán",black:"fekete",blanchedalmond:"hámozott mandula",blue:"kék",blueviolet:"ibolyakék",brown:"barna",burlywood:"nyersfa",cadetblue:"kadétkék",chartreuse:"chartreuse",chocolate:"csokoládé",coral:"korall",cornflowerblue:"búzavirágkék",cornsilk:"kukoricahaj",crimson:"karmazsinvörös",cyan:"ciánkék",darkblue:"sötétkék",darkcyan:"sötét ciánkék",darkgoldenrod:"sötét aranyvessző",darkgray:"sötétszürke",darkgreen:"sötétzöld",darkgrey:"sötétszürke",darkkhaki:"sötét khakiszín",darkmagenta:"sötétbíbor",darkolivegreen:"sötét olajzöld",darkorange:"sötét narancssárga",darkorchid:"sötét orchidea",darkred:"sötétvörös",darksalmon:"sötét lazacszín",darkseagreen:"sötét tengerzöld",darkslateblue:"sötét palakék",darkslategray:"sötét palaszürke",darkslategrey:"sötét palaszürke",darkturquoise:"sötét türkizkék",darkviolet:"sötét ibolyaszín",deeppink:"sötétrózsaszín",deepskyblue:"sötét égszínkék",dimgray:"halványszürke",dimgrey:"halványszürke",dodgerblue:"dodger kék",firebrick:"téglavörös",floralwhite:"virágfehér",forestgreen:"erdőzöld",fuchsia:"fukszia",gainsboro:"gainsboro",ghostwhite:"szellemfehér",gold:"arany",goldenrod:"aranyvessző",gray:"szürke",green:"zöld",greenyellow:"zöldessárga",grey:"szürke",honeydew:"mézharmat",hotpink:"meleg rózsaszín",indianred:"indiánvörös",indigo:"indigó",ivory:"elefántcsont",khaki:"khakiszín",lavender:"levendula",lavenderblush:"pirosas levendula",lawngreen:"fűzöld",lemonchiffon:"sárga műselyem",lightblue:"világoskék",lightcoral:"világos korall",lightcyan:"világos ciánkék",lightgoldenrodyellow:"világos aranyvessző sárga",lightgray:"világosszürke",lightgreen:"világoszöld",lightgrey:"világosszürke",lightpink:"világos rózsaszín",lightsalmon:"világos lazacszín",lightseagreen:"világos tengerzöld",lightskyblue:"világos égszínkék",lightslategray:"világos palaszürke",lightslategrey:"világos palaszürke",lightsteelblue:"világos acélkék",lightyellow:"világossárga",lime:"lime",limegreen:"limezöld",linen:"vászonfehér",magenta:"bíbor",maroon:"gesztenyebarna",mediumaquamarine:"közepes akvamarin",mediumblue:"közepes kék",mediumorchid:"közepes orchidea",mediumpurple:"közepes lila",mediumseagreen:"közepes tengerzöld",mediumslateblue:"közepes palakék",mediumspringgreen:"közepes tavaszzöld",mediumturquoise:"közepes türkizkék",mediumvioletred:"közepes ibolyavörös",midnightblue:"éjkék",mintcream:"mentaszósz",mistyrose:"halvány rózsaszín",moccasin:"mokkaszín",navajowhite:"navajo fehér",navy:"tengerészkék",oldlace:"régi csipke",olive:"olajzöld",olivedrab:"olajzöld drapp",orange:"narancssárga",orangered:"narancsvörös",orchid:"orchidea",palegoldenrod:"halvány aranyvessző",palegreen:"halványzöld",paleturquoise:"halvány türkizkék",palevioletred:"halvány ibolyavörös",papayawhip:"papayahab",peachpuff:"barackszín",peru:"peru",pink:"rózsaszín",plum:"szilvakék",powderblue:"púderkék",purple:"lila",red:"vörös",rosybrown:"barnásrózsaszín",royalblue:"királykék",saddlebrown:"nyeregbarna",salmon:"lazacszín",sandybrown:"homokbarna",seagreen:"tengerzöld",seashell:"kagyló",sienna:"vörösesbarna",silver:"ezüst",skyblue:"égszínkék",slateblue:"palakék",slategray:"palaszürke",slategrey:"palaszürke",snow:"hó",springgreen:"tavaszzöld",steelblue:"acélkék",tan:"rozsdabarna",teal:"pávakék",thistle:"bogáncs",tomato:"paradicsom",transparent:"átlátszó",turquoise:"türkizkék",violet:"ibolyaszín",wheat:"búza",white:"fehér",whitesmoke:"fehér füst",yellow:"sárga",yellowgreen:"sárgászöld"})); \ No newline at end of file diff --git a/lib/dojo/nls/hu/colors.js.uncompressed.js b/lib/dojo/nls/hu/colors.js.uncompressed.js new file mode 100644 index 00000000..92773aea --- /dev/null +++ b/lib/dojo/nls/hu/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/hu/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "Alice kék", + antiquewhite: "antik fehér", + aqua: "vízszín", + aquamarine: "akvamarin", + azure: "azúrkék", + beige: "bézs", + bisque: "porcelán", + black: "fekete", + blanchedalmond: "hámozott mandula", + blue: "kék", + blueviolet: "ibolyakék", + brown: "barna", + burlywood: "nyersfa", + cadetblue: "kadétkék", + chartreuse: "chartreuse", + chocolate: "csokoládé", + coral: "korall", + cornflowerblue: "búzavirágkék", + cornsilk: "kukoricahaj", + crimson: "karmazsinvörös", + cyan: "ciánkék", + darkblue: "sötétkék", + darkcyan: "sötét ciánkék", + darkgoldenrod: "sötét aranyvessző", + darkgray: "sötétszürke", + darkgreen: "sötétzöld", + darkgrey: "sötétszürke", // same as darkgray + darkkhaki: "sötét khakiszín", + darkmagenta: "sötétbíbor", + darkolivegreen: "sötét olajzöld", + darkorange: "sötét narancssárga", + darkorchid: "sötét orchidea", + darkred: "sötétvörös", + darksalmon: "sötét lazacszín", + darkseagreen: "sötét tengerzöld", + darkslateblue: "sötét palakék", + darkslategray: "sötét palaszürke", + darkslategrey: "sötét palaszürke", // same as darkslategray + darkturquoise: "sötét türkizkék", + darkviolet: "sötét ibolyaszín", + deeppink: "sötétrózsaszín", + deepskyblue: "sötét égszínkék", + dimgray: "halványszürke", + dimgrey: "halványszürke", // same as dimgray + dodgerblue: "dodger kék", + firebrick: "téglavörös", + floralwhite: "virágfehér", + forestgreen: "erdőzöld", + fuchsia: "fukszia", + gainsboro: "gainsboro", + ghostwhite: "szellemfehér", + gold: "arany", + goldenrod: "aranyvessző", + gray: "szürke", + green: "zöld", + greenyellow: "zöldessárga", + grey: "szürke", // same as gray + honeydew: "mézharmat", + hotpink: "meleg rózsaszín", + indianred: "indiánvörös", + indigo: "indigó", + ivory: "elefántcsont", + khaki: "khakiszín", + lavender: "levendula", + lavenderblush: "pirosas levendula", + lawngreen: "fűzöld", + lemonchiffon: "sárga műselyem", + lightblue: "világoskék", + lightcoral: "világos korall", + lightcyan: "világos ciánkék", + lightgoldenrodyellow: "világos aranyvessző sárga", + lightgray: "világosszürke", + lightgreen: "világoszöld", + lightgrey: "világosszürke", // same as lightgray + lightpink: "világos rózsaszín", + lightsalmon: "világos lazacszín", + lightseagreen: "világos tengerzöld", + lightskyblue: "világos égszínkék", + lightslategray: "világos palaszürke", + lightslategrey: "világos palaszürke", // same as lightslategray + lightsteelblue: "világos acélkék", + lightyellow: "világossárga", + lime: "lime", + limegreen: "limezöld", + linen: "vászonfehér", + magenta: "bíbor", + maroon: "gesztenyebarna", + mediumaquamarine: "közepes akvamarin", + mediumblue: "közepes kék", + mediumorchid: "közepes orchidea", + mediumpurple: "közepes lila", + mediumseagreen: "közepes tengerzöld", + mediumslateblue: "közepes palakék", + mediumspringgreen: "közepes tavaszzöld", + mediumturquoise: "közepes türkizkék", + mediumvioletred: "közepes ibolyavörös", + midnightblue: "éjkék", + mintcream: "mentaszósz", + mistyrose: "halvány rózsaszín", + moccasin: "mokkaszín", + navajowhite: "navajo fehér", + navy: "tengerészkék", + oldlace: "régi csipke", + olive: "olajzöld", + olivedrab: "olajzöld drapp", + orange: "narancssárga", + orangered: "narancsvörös", + orchid: "orchidea", + palegoldenrod: "halvány aranyvessző", + palegreen: "halványzöld", + paleturquoise: "halvány türkizkék", + palevioletred: "halvány ibolyavörös", + papayawhip: "papayahab", + peachpuff: "barackszín", + peru: "peru", + pink: "rózsaszín", + plum: "szilvakék", + powderblue: "púderkék", + purple: "lila", + red: "vörös", + rosybrown: "barnásrózsaszín", + royalblue: "királykék", + saddlebrown: "nyeregbarna", + salmon: "lazacszín", + sandybrown: "homokbarna", + seagreen: "tengerzöld", + seashell: "kagyló", + sienna: "vörösesbarna", + silver: "ezüst", + skyblue: "égszínkék", + slateblue: "palakék", + slategray: "palaszürke", + slategrey: "palaszürke", // same as slategray + snow: "hó", + springgreen: "tavaszzöld", + steelblue: "acélkék", + tan: "rozsdabarna", + teal: "pávakék", + thistle: "bogáncs", + tomato: "paradicsom", + transparent: "átlátszó", + turquoise: "türkizkék", + violet: "ibolyaszín", + wheat: "búza", + white: "fehér", + whitesmoke: "fehér füst", + yellow: "sárga", + yellowgreen: "sárgászöld" +}) +); diff --git a/lib/dojo/nls/it/colors.js b/lib/dojo/nls/it/colors.js index 8a530070..e941c63d 100644 --- a/lib/dojo/nls/it/colors.js +++ b/lib/dojo/nls/it/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"blu acciao chiaro","orangered":"vermiglio","midnightblue":"blu melanzana scuro","cadetblue":"verde acqua","seashell":"sabbia rosa","slategrey":"grigio ardesia","coral":"corallo","darkturquoise":"turchese scuro","antiquewhite":"bianco antico","mediumspringgreen":"verde primavera medio","salmon":"salmone","darkgrey":"grigio scuro","ivory":"avorio","greenyellow":"giallo verde","mistyrose":"rosa pallido","lightsalmon":"salmone chiaro","silver":"grigio 25%","dimgrey":"grigio 80%","orange":"arancione","white":"bianco","navajowhite":"pesca chiaro","royalblue":"blu reale","deeppink":"ciclamino","lime":"verde fluorescente","oldlace":"mandorla","chartreuse":"verde brillante","darkcyan":"ciano scuro","yellow":"giallo","linen":"lino","olive":"verde oliva","gold":"oro","lawngreen":"verde prato","lightyellow":"giallo chiaro","tan":"grigio bruno","darkviolet":"viola scuro","lightslategrey":"grigio ardesia chiaro","grey":"grigio","darkkhaki":"kaki scuro","green":"verde","deepskyblue":"azzurro cielo scuro","aqua":"acqua","sienna":"cuoio","mintcream":"bianco nuvola","rosybrown":"marrone rosato","mediumslateblue":"blu ardesia medio","magenta":"magenta","lightseagreen":"verde mare chiaro","cyan":"ciano","olivedrab":"marrone oliva","darkgoldenrod":"ocra scuro","slateblue":"blu ardesia","mediumaquamarine":"acquamarina medio","lavender":"lavanda","mediumseagreen":"verde mare medio","maroon":"scarlatto","darkslategray":"grigio ardesia scuro","mediumturquoise":"turchese medio","ghostwhite":"bianco gesso","darkblue":"blu scuro","mediumvioletred":"vinaccia","brown":"marrone","lightgray":"grigio chiaro","sandybrown":"marrone sabbia","pink":"rosa","firebrick":"rosso mattone","indigo":"indaco","snow":"neve","darkorchid":"orchidea scuro","turquoise":"turchese","chocolate":"cioccolato","springgreen":"verde primavera","moccasin":"mocassino","navy":"blu notte","lemonchiffon":"caffelatte chiaro","teal":"verde turchese","floralwhite":"bianco giglio","cornflowerblue":"blu fiordaliso","paleturquoise":"turchese pallido","purple":"porpora","gainsboro":"grigio 10%","plum":"prugna","red":"rosso","blue":"blu","forestgreen":"verde foresta","darkgreen":"verde scuro","honeydew":"bianco germoglio","darkseagreen":"verde mare scuro","lightcoral":"rosa corallo","palevioletred":"vinaccia chiaro","mediumpurple":"porpora medio","saddlebrown":"cacao","darkmagenta":"magenta scuro","thistle":"rosa cenere","whitesmoke":"bianco fumo","wheat":"sabbia","violet":"viola","lightskyblue":"azzurro cielo chiaro","goldenrod":"ocra gialla","mediumblue":"blu medio","skyblue":"azzurro cielo","crimson":"cremisi","darksalmon":"salmone scuro","darkred":"rosso scuro","darkslategrey":"grigio ardesia scuro","peru":"marrone terra bruciata","lightgrey":"grigio chiaro","lightgoldenrodyellow":"giallo tenue","blanchedalmond":"mandorla chiaro","aliceblue":"blu alice","bisque":"incarnato","slategray":"grigio ardesia","palegoldenrod":"giallo zolfo chiaro","darkorange":"arancione scuro","aquamarine":"acquamarina","lightgreen":"verde chiaro","burlywood":"tabacco","dodgerblue":"blu d'oriente","darkgray":"grigio scuro","lightcyan":"ciano chiaro","powderblue":"azzurro polvere","blueviolet":"blu violetto","orchid":"orchidea","dimgray":"grigio 80%","beige":"beige","fuchsia":"fucsia","lavenderblush":"bianco rosato","hotpink":"rosa acceso","steelblue":"blu acciao","tomato":"pomodoro","lightpink":"rosa chiaro","limegreen":"verde lime","indianred":"terra indiana","papayawhip":"cipria","lightslategray":"grigio ardesia chiaro","gray":"grigio","mediumorchid":"orchidea medio","cornsilk":"crema","black":"nero","seagreen":"verde mare","darkslateblue":"blu ardesia scuro","khaki":"kaki","lightblue":"azzurro","palegreen":"verde pallido","azure":"azzurro ghiaccio","peachpuff":"pesca","darkolivegreen":"verde oliva scuro","yellowgreen":"giallo verde"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/it/colors",({aliceblue:"bianco ghiaccio",antiquewhite:"rosa antico",aqua:"verde acqua",aquamarine:"acquamarina",azure:"azure",beige:"beige",bisque:"terracotta",black:"nero",blanchedalmond:"beige 2",blue:"blu",blueviolet:"violetto bluastro",brown:"marrone",burlywood:"legno massiccio",cadetblue:"verde petrolio",chartreuse:"verde brillante",chocolate:"cioccolato",coral:"corallo",cornflowerblue:"blu fiordaliso",cornsilk:"crema",crimson:"rosso scarlatto",cyan:"ciano",darkblue:"blu scuro",darkcyan:"celeste scuro",darkgoldenrod:"ocra scuro",darkgray:"grigio scuro",darkgreen:"verde scuro",darkgrey:"grigio scuro",darkkhaki:"cachi scuro",darkmagenta:"magenta scuro",darkolivegreen:"verde oliva scuro",darkorange:"arancione scuro",darkorchid:"orchidea scuro",darkred:"rosso scuro",darksalmon:"salmone scuro",darkseagreen:"verde acqua scuro",darkslateblue:"blu ardesia scuro",darkslategray:"grigio ardesia scuro",darkslategrey:"grigio ardesia scuro",darkturquoise:"turchese scuro",darkviolet:"viola scuro",deeppink:"ciclamino",deepskyblue:"azzurro intenso",dimgray:"grigio tenue",dimgrey:"grigio tenue",dodgerblue:"dodger blue",firebrick:"mattone",floralwhite:"bianco grigio",forestgreen:"verde pino scuro",fuchsia:"fucsia",gainsboro:"gainsboro",ghostwhite:"bianco gesso",gold:"oro",goldenrod:"dorato",gray:"grigio",green:"verde",greenyellow:"verde-giallo",grey:"grigio",honeydew:"miele",hotpink:"rosa acceso",indianred:"terra indiana",indigo:"indaco",ivory:"avorio",khaki:"cachi",lavender:"lavanda",lavenderblush:"lavanda rosa",lawngreen:"verde brillante chiaro",lemonchiffon:"lemon chiffon",lightblue:"blu chiaro",lightcoral:"corallo chiaro",lightcyan:"ciano chiaro",lightgoldenrodyellow:"giallo dorato chiaro",lightgray:"grigio chiaro",lightgreen:"verde chiaro",lightgrey:"grigio chiaro",lightpink:"rosa chiaro",lightsalmon:"salmone chiaro",lightseagreen:"verde acqua chiaro",lightskyblue:"azzurro chiaro",lightslategray:"grigio ardesia chiaro",lightslategrey:"grigio ardesia chiaro",lightsteelblue:"blu acciaio chiaro",lightyellow:"giallo chiaro",lime:"lime",limegreen:"verde lime",linen:"lino",magenta:"magenta",maroon:"Bordeaux",mediumaquamarine:"acquamarina medio",mediumblue:"blu medio",mediumorchid:"orchidea medio",mediumpurple:"viola medio",mediumseagreen:"verde acqua medio",mediumslateblue:"blu ardesia medio",mediumspringgreen:"verde brillante medio",mediumturquoise:"turchese medio",mediumvioletred:"violetto rosso medio",midnightblue:"blu notte",mintcream:"bianco nuvola",mistyrose:"rosa pallido",moccasin:"mocassino",navajowhite:"sabbia",navy:"blu scuro",oldlace:"mandorla",olive:"verde oliva",olivedrab:"verde bottiglia",orange:"arancione",orangered:"vermiglio",orchid:"orchidea",palegoldenrod:"dorato pallido",palegreen:"verde pallido",paleturquoise:"turchese pallido",palevioletred:"violetto rosso pallido",papayawhip:"papaya",peachpuff:"pesche",peru:"perù",pink:"rosa",plum:"prugna",powderblue:"azzurro polvere",purple:"viola",red:"rosso",rosybrown:"caffè latte",royalblue:"royal blue",saddlebrown:"cacao",salmon:"salmone",sandybrown:"argilla",seagreen:"verde acqua",seashell:"sabbia rosa",sienna:"terra di siena",silver:"argento",skyblue:"azzurro",slateblue:"blu ardesia",slategray:"grigio ardesia",slategrey:"grigio ardesia",snow:"neve",springgreen:"verde brillante",steelblue:"blu brillante",tan:"tan",teal:"verde acqua",thistle:"rosa cenere",tomato:"pomodoro",transparent:"trasparente",turquoise:"turchese",violet:"violetto",wheat:"tabacco",white:"bianco",whitesmoke:"bianco fumo",yellow:"giallo",yellowgreen:"giallo verde"})); \ No newline at end of file diff --git a/lib/dojo/nls/it/colors.js.uncompressed.js b/lib/dojo/nls/it/colors.js.uncompressed.js new file mode 100644 index 00000000..aafbb2d7 --- /dev/null +++ b/lib/dojo/nls/it/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/it/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "bianco ghiaccio", + antiquewhite: "rosa antico", + aqua: "verde acqua", + aquamarine: "acquamarina", + azure: "azure", + beige: "beige", + bisque: "terracotta", + black: "nero", + blanchedalmond: "beige 2", + blue: "blu", + blueviolet: "violetto bluastro", + brown: "marrone", + burlywood: "legno massiccio", + cadetblue: "verde petrolio", + chartreuse: "verde brillante", + chocolate: "cioccolato", + coral: "corallo", + cornflowerblue: "blu fiordaliso", + cornsilk: "crema", + crimson: "rosso scarlatto", + cyan: "ciano", + darkblue: "blu scuro", + darkcyan: "celeste scuro", + darkgoldenrod: "ocra scuro", + darkgray: "grigio scuro", + darkgreen: "verde scuro", + darkgrey: "grigio scuro", // same as darkgray + darkkhaki: "cachi scuro", + darkmagenta: "magenta scuro", + darkolivegreen: "verde oliva scuro", + darkorange: "arancione scuro", + darkorchid: "orchidea scuro", + darkred: "rosso scuro", + darksalmon: "salmone scuro", + darkseagreen: "verde acqua scuro", + darkslateblue: "blu ardesia scuro", + darkslategray: "grigio ardesia scuro", + darkslategrey: "grigio ardesia scuro", // same as darkslategray + darkturquoise: "turchese scuro", + darkviolet: "viola scuro", + deeppink: "ciclamino", + deepskyblue: "azzurro intenso", + dimgray: "grigio tenue", + dimgrey: "grigio tenue", // same as dimgray + dodgerblue: "dodger blue", + firebrick: "mattone", + floralwhite: "bianco grigio", + forestgreen: "verde pino scuro", + fuchsia: "fucsia", + gainsboro: "gainsboro", + ghostwhite: "bianco gesso", + gold: "oro", + goldenrod: "dorato", + gray: "grigio", + green: "verde", + greenyellow: "verde-giallo", + grey: "grigio", // same as gray + honeydew: "miele", + hotpink: "rosa acceso", + indianred: "terra indiana", + indigo: "indaco", + ivory: "avorio", + khaki: "cachi", + lavender: "lavanda", + lavenderblush: "lavanda rosa", + lawngreen: "verde brillante chiaro", + lemonchiffon: "lemon chiffon", + lightblue: "blu chiaro", + lightcoral: "corallo chiaro", + lightcyan: "ciano chiaro", + lightgoldenrodyellow: "giallo dorato chiaro", + lightgray: "grigio chiaro", + lightgreen: "verde chiaro", + lightgrey: "grigio chiaro", // same as lightgray + lightpink: "rosa chiaro", + lightsalmon: "salmone chiaro", + lightseagreen: "verde acqua chiaro", + lightskyblue: "azzurro chiaro", + lightslategray: "grigio ardesia chiaro", + lightslategrey: "grigio ardesia chiaro", // same as lightslategray + lightsteelblue: "blu acciaio chiaro", + lightyellow: "giallo chiaro", + lime: "lime", + limegreen: "verde lime", + linen: "lino", + magenta: "magenta", + maroon: "Bordeaux", + mediumaquamarine: "acquamarina medio", + mediumblue: "blu medio", + mediumorchid: "orchidea medio", + mediumpurple: "viola medio", + mediumseagreen: "verde acqua medio", + mediumslateblue: "blu ardesia medio", + mediumspringgreen: "verde brillante medio", + mediumturquoise: "turchese medio", + mediumvioletred: "violetto rosso medio", + midnightblue: "blu notte", + mintcream: "bianco nuvola", + mistyrose: "rosa pallido", + moccasin: "mocassino", + navajowhite: "sabbia", + navy: "blu scuro", + oldlace: "mandorla", + olive: "verde oliva", + olivedrab: "verde bottiglia", + orange: "arancione", + orangered: "vermiglio", + orchid: "orchidea", + palegoldenrod: "dorato pallido", + palegreen: "verde pallido", + paleturquoise: "turchese pallido", + palevioletred: "violetto rosso pallido", + papayawhip: "papaya", + peachpuff: "pesche", + peru: "perù", + pink: "rosa", + plum: "prugna", + powderblue: "azzurro polvere", + purple: "viola", + red: "rosso", + rosybrown: "caffè latte", + royalblue: "royal blue", + saddlebrown: "cacao", + salmon: "salmone", + sandybrown: "argilla", + seagreen: "verde acqua", + seashell: "sabbia rosa", + sienna: "terra di siena", + silver: "argento", + skyblue: "azzurro", + slateblue: "blu ardesia", + slategray: "grigio ardesia", + slategrey: "grigio ardesia", // same as slategray + snow: "neve", + springgreen: "verde brillante", + steelblue: "blu brillante", + tan: "tan", + teal: "verde acqua", + thistle: "rosa cenere", + tomato: "pomodoro", + transparent: "trasparente", + turquoise: "turchese", + violet: "violetto", + wheat: "tabacco", + white: "bianco", + whitesmoke: "bianco fumo", + yellow: "giallo", + yellowgreen: "giallo verde" +}) +); diff --git a/lib/dojo/nls/ja/colors.js b/lib/dojo/nls/ja/colors.js index 46aa1f25..4b5591ea 100644 --- a/lib/dojo/nls/ja/colors.js +++ b/lib/dojo/nls/ja/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"ライト・スチール・ブルー","orangered":"オレンジ・レッド","midnightblue":"ミッドナイト・ブルー","cadetblue":"くすんだ青","seashell":"シーシェル","slategrey":"スレート・グレイ","coral":"珊瑚","darkturquoise":"ダーク・ターコイズ","antiquewhite":"アンティーク・ホワイト","mediumspringgreen":"ミディアム・スプリング・グリーン","salmon":"サーモン","darkgrey":"ダーク・グレイ","ivory":"アイボリー","greenyellow":"緑黄色","mistyrose":"ミスティ・ローズ","lightsalmon":"ライト・サーモン","silver":"銀","dimgrey":"くすんだグレイ","orange":"オレンジ","white":"白","navajowhite":"ナバホ・ホワイト","royalblue":"藤色","deeppink":"濃いピンク","lime":"ライム","oldlace":"オールド・レイス","chartreuse":"淡黄緑","darkcyan":"ダーク・シアン・ブルー","yellow":"黄","linen":"亜麻色","olive":"オリーブ","gold":"金","lawngreen":"ローン・グリーン","lightyellow":"ライト・イエロー","tan":"茶褐色","darkviolet":"ダーク・バイオレット","lightslategrey":"ライト・スレート・グレイ","grey":"グレイ","darkkhaki":"ダーク・カーキー","green":"緑","deepskyblue":"濃い空色","aqua":"アクア","sienna":"黄褐色","mintcream":"ミント・クリーム","rosybrown":"ロージー・ブラウン","mediumslateblue":"ミディアム・スレート・ブルー","magenta":"赤紫","lightseagreen":"ライト・シー・グリーン","cyan":"シアン・ブルー","olivedrab":"濃黄緑","darkgoldenrod":"ダーク・ゴールデン・ロッド","slateblue":"スレート・ブルー","mediumaquamarine":"ミディアム・アクアマリーン","lavender":"ラベンダー","mediumseagreen":"ミディアム・シー・グリーン","maroon":"えび茶","darkslategray":"ダーク・スレート・グレイ","mediumturquoise":"ミディアム・ターコイズ","ghostwhite":"ゴースト・ホワイト","darkblue":"ダーク・ブルー","mediumvioletred":"ミディアム・バイオレット・レッド","brown":"茶","lightgray":"ライト・グレイ","sandybrown":"砂褐色","pink":"ピンク","firebrick":"赤煉瓦色","indigo":"藍色","snow":"雪色","darkorchid":"ダーク・オーキッド","turquoise":"ターコイズ","chocolate":"チョコレート","springgreen":"スプリング・グリーン","moccasin":"モカシン","navy":"濃紺","lemonchiffon":"レモン・シフォン","teal":"ティール","floralwhite":"フローラル・ホワイト","cornflowerblue":"コーンフラワー・ブルー","paleturquoise":"ペイル・ターコイズ","purple":"紫","gainsboro":"ゲインズボーロ","plum":"深紫","red":"赤","blue":"青","forestgreen":"フォレスト・グリーン","darkgreen":"ダーク・グリーン","honeydew":"ハニーデュー","darkseagreen":"ダーク・シー・グリーン","lightcoral":"ライト・コーラル","palevioletred":"ペイル・バイオレット・レッド","mediumpurple":"ミディアム・パープル","saddlebrown":"サドル・ブラウン","darkmagenta":"ダーク・マジェンタ","thistle":"シスル","whitesmoke":"ホワイト・スモーク","wheat":"小麦色","violet":"すみれ色","lightskyblue":"ライト・スカイ・ブルー","goldenrod":"ゴールデン・ロッド","mediumblue":"ミディアム・ブルー","skyblue":"スカイ・ブルー","crimson":"深紅","darksalmon":"ダーク・サーモン","darkred":"ダーク・レッド","darkslategrey":"ダーク・スレート・グレイ","peru":"ペルー","lightgrey":"ライト・グレイ","lightgoldenrodyellow":"ライト・ゴールデン・ロッド・イエロー","blanchedalmond":"皮なしアーモンド","aliceblue":"アリス・ブルー","bisque":"ビスク","slategray":"スレート・グレイ","palegoldenrod":"ペイル・ゴールデン・ロッド","darkorange":"ダーク・オレンジ","aquamarine":"碧緑","lightgreen":"ライト・グリーン","burlywood":"バーリーウッド","dodgerblue":"ドッジャー・ブルー","darkgray":"ダーク・グレイ","lightcyan":"ライト・シアン","powderblue":"淡青","blueviolet":"青紫","orchid":"薄紫","dimgray":"くすんだグレイ","beige":"ベージュ","fuchsia":"紫紅色","lavenderblush":"ラベンダー・ブラッシ","hotpink":"ホット・ピンク","steelblue":"鋼色","tomato":"トマト色","lightpink":"ライト・ピンク","limegreen":"ライム・グリーン","indianred":"インディアン・レッド","papayawhip":"パパイア・ホイップ","lightslategray":"ライト・スレート・グレイ","gray":"グレイ","mediumorchid":"ミディアム・オーキッド","cornsilk":"コーンシルク","black":"黒","seagreen":"シー・グリーン","darkslateblue":"ダーク・スレート・ブルー","khaki":"カーキー","lightblue":"ライト・ブルー","palegreen":"ペイル・グリーン","azure":"薄い空色","peachpuff":"ピーチ・パフ","darkolivegreen":"ダーク・オリーブ・グリーン","yellowgreen":"黄緑"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/ja/colors",({aliceblue:"アリスブルー",antiquewhite:"アンティークホワイト",aqua:"アクア",aquamarine:"碧緑",azure:"薄い空色",beige:"ベージュ",bisque:"ビスク",black:"黒",blanchedalmond:"皮なしアーモンド",blue:"青",blueviolet:"青紫",brown:"茶",burlywood:"バーリーウッド",cadetblue:"くすんだ青",chartreuse:"淡黄緑",chocolate:"チョコレート",coral:"珊瑚",cornflowerblue:"コーンフラワーブルー",cornsilk:"コーンシルク",crimson:"深紅",cyan:"シアンブルー",darkblue:"ダークブルー",darkcyan:"ダークシアンブルー",darkgoldenrod:"ダークゴールデンロッド",darkgray:"ダークグレイ",darkgreen:"ダークグリーン",darkgrey:"ダークグレイ",darkkhaki:"ダークカーキ",darkmagenta:"ダークマジェンタ",darkolivegreen:"ダークオリーブグリーン",darkorange:"ダークオレンジ",darkorchid:"ダークオーキッド",darkred:"ダークレッド",darksalmon:"ダークサーモン",darkseagreen:"ダークシーグリーン",darkslateblue:"ダークスレートブルー",darkslategray:"ダークスレートグレイ",darkslategrey:"ダークスレートグレイ",darkturquoise:"ダークターコイズ",darkviolet:"ダークバイオレット",deeppink:"濃いピンク",deepskyblue:"濃い空色",dimgray:"くすんだグレイ",dimgrey:"くすんだグレイ",dodgerblue:"ドッジャーブルー",firebrick:"赤煉瓦色",floralwhite:"フローラルホワイト",forestgreen:"フォレストグリーン",fuchsia:"紫紅色",gainsboro:"ゲインズボーロ",ghostwhite:"ゴーストホワイト",gold:"金",goldenrod:"ゴールデンロッド",gray:"グレイ",green:"緑",greenyellow:"緑黄色",grey:"グレイ",honeydew:"ハニーデュー",hotpink:"ホットピンク",indianred:"インディアンレッド",indigo:"藍色",ivory:"アイボリー",khaki:"カーキ",lavender:"ラベンダー",lavenderblush:"ラベンダーブラッシ",lawngreen:"ローングリーン",lemonchiffon:"レモンシフォン",lightblue:"ライトブルー",lightcoral:"ライトコーラル",lightcyan:"ライトシアン",lightgoldenrodyellow:"ライトゴールデンロッドイエロー",lightgray:"ライトグレイ",lightgreen:"ライトグリーン",lightgrey:"ライトグレイ",lightpink:"ライトピンク",lightsalmon:"ライトサーモン",lightseagreen:"ライトシーグリーン",lightskyblue:"ライトスカイブルー",lightslategray:"ライトスレートグレイ",lightslategrey:"ライトスレートグレイ",lightsteelblue:"ライトスチールブルー",lightyellow:"ライトイエロー",lime:"ライム",limegreen:"ライムグリーン",linen:"亜麻色",magenta:"赤紫",maroon:"えび茶",mediumaquamarine:"ミディアムアクアマリーン",mediumblue:"ミディアムブルー",mediumorchid:"ミディアムオーキッド",mediumpurple:"ミディアムパープル",mediumseagreen:"ミディアムシーグリーン",mediumslateblue:"ミディアムスレートブルー",mediumspringgreen:"ミディアムスプリンググリーン",mediumturquoise:"ミディアムターコイズ",mediumvioletred:"ミディアムバイオレットレッド",midnightblue:"ミッドナイトブルー",mintcream:"ミントクリーム",mistyrose:"ミスティローズ",moccasin:"モカシン",navajowhite:"ナバホホワイト",navy:"濃紺",oldlace:"オールドレイス",olive:"オリーブ",olivedrab:"濃黄緑",orange:"オレンジ",orangered:"オレンジレッド",orchid:"薄紫",palegoldenrod:"ペイルゴールデンロッド",palegreen:"ペイルグリーン",paleturquoise:"ペイルターコイズ",palevioletred:"ペイルバイオレットレッド",papayawhip:"パパイアホイップ",peachpuff:"ピーチパフ",peru:"ペルー",pink:"ピンク",plum:"深紫",powderblue:"淡青",purple:"紫",red:"赤",rosybrown:"ロージーブラウン",royalblue:"藤色",saddlebrown:"サドルブラウン",salmon:"サーモン",sandybrown:"砂褐色",seagreen:"シーグリーン",seashell:"シーシェル",sienna:"黄褐色",silver:"銀",skyblue:"スカイブルー",slateblue:"スレートブルー",slategray:"スレートグレイ",slategrey:"スレートグレイ",snow:"雪色",springgreen:"スプリンググリーン",steelblue:"鋼色",tan:"茶褐色",teal:"ティール",thistle:"シスル",tomato:"トマト色",transparent:"透明",turquoise:"ターコイズ",violet:"すみれ色",wheat:"小麦色",white:"白",whitesmoke:"ホワイトスモーク",yellow:"黄",yellowgreen:"黄緑"})); \ No newline at end of file diff --git a/lib/dojo/nls/ja/colors.js.uncompressed.js b/lib/dojo/nls/ja/colors.js.uncompressed.js new file mode 100644 index 00000000..7051d786 --- /dev/null +++ b/lib/dojo/nls/ja/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/ja/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "アリスブルー", + antiquewhite: "アンティークホワイト", + aqua: "アクア", + aquamarine: "碧緑", + azure: "薄い空色", + beige: "ベージュ", + bisque: "ビスク", + black: "黒", + blanchedalmond: "皮なしアーモンド", + blue: "青", + blueviolet: "青紫", + brown: "茶", + burlywood: "バーリーウッド", + cadetblue: "くすんだ青", + chartreuse: "淡黄緑", + chocolate: "チョコレート", + coral: "珊瑚", + cornflowerblue: "コーンフラワーブルー", + cornsilk: "コーンシルク", + crimson: "深紅", + cyan: "シアンブルー", + darkblue: "ダークブルー", + darkcyan: "ダークシアンブルー", + darkgoldenrod: "ダークゴールデンロッド", + darkgray: "ダークグレイ", + darkgreen: "ダークグリーン", + darkgrey: "ダークグレイ", // same as darkgray + darkkhaki: "ダークカーキ", + darkmagenta: "ダークマジェンタ", + darkolivegreen: "ダークオリーブグリーン", + darkorange: "ダークオレンジ", + darkorchid: "ダークオーキッド", + darkred: "ダークレッド", + darksalmon: "ダークサーモン", + darkseagreen: "ダークシーグリーン", + darkslateblue: "ダークスレートブルー", + darkslategray: "ダークスレートグレイ", + darkslategrey: "ダークスレートグレイ", // same as darkslategray + darkturquoise: "ダークターコイズ", + darkviolet: "ダークバイオレット", + deeppink: "濃いピンク", + deepskyblue: "濃い空色", + dimgray: "くすんだグレイ", + dimgrey: "くすんだグレイ", // same as dimgray + dodgerblue: "ドッジャーブルー", + firebrick: "赤煉瓦色", + floralwhite: "フローラルホワイト", + forestgreen: "フォレストグリーン", + fuchsia: "紫紅色", + gainsboro: "ゲインズボーロ", + ghostwhite: "ゴーストホワイト", + gold: "金", + goldenrod: "ゴールデンロッド", + gray: "グレイ", + green: "緑", + greenyellow: "緑黄色", + grey: "グレイ", // same as gray + honeydew: "ハニーデュー", + hotpink: "ホットピンク", + indianred: "インディアンレッド", + indigo: "藍色", + ivory: "アイボリー", + khaki: "カーキ", + lavender: "ラベンダー", + lavenderblush: "ラベンダーブラッシ", + lawngreen: "ローングリーン", + lemonchiffon: "レモンシフォン", + lightblue: "ライトブルー", + lightcoral: "ライトコーラル", + lightcyan: "ライトシアン", + lightgoldenrodyellow: "ライトゴールデンロッドイエロー", + lightgray: "ライトグレイ", + lightgreen: "ライトグリーン", + lightgrey: "ライトグレイ", // same as lightgray + lightpink: "ライトピンク", + lightsalmon: "ライトサーモン", + lightseagreen: "ライトシーグリーン", + lightskyblue: "ライトスカイブルー", + lightslategray: "ライトスレートグレイ", + lightslategrey: "ライトスレートグレイ", // same as lightslategray + lightsteelblue: "ライトスチールブルー", + lightyellow: "ライトイエロー", + lime: "ライム", + limegreen: "ライムグリーン", + linen: "亜麻色", + magenta: "赤紫", + maroon: "えび茶", + mediumaquamarine: "ミディアムアクアマリーン", + mediumblue: "ミディアムブルー", + mediumorchid: "ミディアムオーキッド", + mediumpurple: "ミディアムパープル", + mediumseagreen: "ミディアムシーグリーン", + mediumslateblue: "ミディアムスレートブルー", + mediumspringgreen: "ミディアムスプリンググリーン", + mediumturquoise: "ミディアムターコイズ", + mediumvioletred: "ミディアムバイオレットレッド", + midnightblue: "ミッドナイトブルー", + mintcream: "ミントクリーム", + mistyrose: "ミスティローズ", + moccasin: "モカシン", + navajowhite: "ナバホホワイト", + navy: "濃紺", + oldlace: "オールドレイス", + olive: "オリーブ", + olivedrab: "濃黄緑", + orange: "オレンジ", + orangered: "オレンジレッド", + orchid: "薄紫", + palegoldenrod: "ペイルゴールデンロッド", + palegreen: "ペイルグリーン", + paleturquoise: "ペイルターコイズ", + palevioletred: "ペイルバイオレットレッド", + papayawhip: "パパイアホイップ", + peachpuff: "ピーチパフ", + peru: "ペルー", + pink: "ピンク", + plum: "深紫", + powderblue: "淡青", + purple: "紫", + red: "赤", + rosybrown: "ロージーブラウン", + royalblue: "藤色", + saddlebrown: "サドルブラウン", + salmon: "サーモン", + sandybrown: "砂褐色", + seagreen: "シーグリーン", + seashell: "シーシェル", + sienna: "黄褐色", + silver: "銀", + skyblue: "スカイブルー", + slateblue: "スレートブルー", + slategray: "スレートグレイ", + slategrey: "スレートグレイ", // same as slategray + snow: "雪色", + springgreen: "スプリンググリーン", + steelblue: "鋼色", + tan: "茶褐色", + teal: "ティール", + thistle: "シスル", + tomato: "トマト色", + transparent: "透明", + turquoise: "ターコイズ", + violet: "すみれ色", + wheat: "小麦色", + white: "白", + whitesmoke: "ホワイトスモーク", + yellow: "黄", + yellowgreen: "黄緑" +}) +); diff --git a/lib/dojo/nls/kk/colors.js b/lib/dojo/nls/kk/colors.js index 19b90679..924da788 100644 --- a/lib/dojo/nls/kk/colors.js +++ b/lib/dojo/nls/kk/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"ашық сұрғылт көк","orangered":"қызғылт сары қызыл","midnightblue":"түн ортасы көк","cadetblue":"кадет көк","seashell":"теңіз қабыршағы","slategrey":"көкшіл сұры","coral":"коралл","darkturquoise":"күңгірт көгілдір","antiquewhite":"ақ антик","mediumspringgreen":"орташа ашық жасыл","salmon":"сомон","darkgrey":"қою сұры","ivory":"піл сүйег","greenyellow":"жасыл-сары","mistyrose":"көмескі қызғылт","lightsalmon":"ашық сарғыш қызғылт","silver":"күміс түстес","dimgrey":"күңгірт сұры","orange":"қызғылт сары","white":"ақ","navajowhite":"навахо ақ","royalblue":"патша көк","deeppink":"қою қызғылт","lime":"әк","oldlace":"ескі бау","chartreuse":"жасылдау-сары","darkcyan":"күңгірт циан","yellow":"сары","linen":"зығыр","olive":"зәйтүнді","gold":"сары түсті","lawngreen":"көгал жасыл","lightyellow":"ашық сары","tan":"сарғыш қоңыр","darkviolet":"күңгірт күлгін","lightslategrey":"ашық көкшіл сұры","grey":"сұры","darkkhaki":"қою хаки","green":"жасыл","deepskyblue":"қою аспан көк","aqua":"су түсі","sienna":"сиенна","mintcream":"жалбыз майы","rosybrown":"қызғылт қоңыр","mediumslateblue":"орташа көкшіл сұры","magenta":"фуксин","lightseagreen":"ашық теңіз толқыны","cyan":"циан","olivedrab":"жасылдау сары","darkgoldenrod":"қара алтын","slateblue":"грифель көк","mediumaquamarine":"орташа жасылдау көк","lavender":"бозғылт ақшыл көк","mediumseagreen":"орташа теңіз толқыны","maroon":"сарғылт","darkslategray":"күңгірт көкшіл сұры","mediumturquoise":"орташа көгілдір","ghostwhite":"елесті ақ","darkblue":"күңгірт көк","mediumvioletred":"орташа ақшыл көк-қызыл","brown":"қоңыр","lightgray":"ашық сұры","sandybrown":"құмды қоңыр","pink":"қызғылт","firebrick":"қызыл кірпіш","indigo":"индиго","snow":"қар","darkorchid":"күңгірт орсель","turquoise":"көгілдір","chocolate":"шоколад","springgreen":"көктем жасыл","moccasin":"мокасин","navy":"қара-көк","lemonchiffon":"лимон шиффон","teal":"шүрегей","floralwhite":"гүлді ақ","cornflowerblue":"көктікен көк","paleturquoise":"бозғылт көгілдір","purple":"күлгін","gainsboro":"gainsboro","plum":"алхоры","red":"қызыл","blue":"көк","forestgreen":"шөпті жасыл","darkgreen":"қою жасыл","honeydew":"балдай","darkseagreen":"қою теңіз толқыны","lightcoral":"ашық коралл","palevioletred":"бозғылт ақшыл көк-қызыл","mediumpurple":"орташа күлгін","saddlebrown":"тоқым қоңыр","darkmagenta":"қою күлгін","thistle":"артишок","whitesmoke":"ақ түтін","wheat":"бидай","violet":"күлгін","lightskyblue":"ашық аспан көк","goldenrod":"алтын","mediumblue":"орташа көк","skyblue":"аспан көк","crimson":"таңқұрай","darksalmon":"қою сарылау қызғылт","darkred":"күңгірт қызыл","darkslategrey":"күңгірт көкшіл сұры","peru":"перу","lightgrey":"ашық сұры","lightgoldenrodyellow":"ашық сары түсті сары","blanchedalmond":"ағартылған бадам","aliceblue":"бозғылт көк","bisque":"бисквит","slategray":"көкшіл сұры","palegoldenrod":"бозғылт алтын","darkorange":"қою қызғылт сары","aquamarine":"жасылдау-көк","lightgreen":"ақшыл жасыл","burlywood":"ағаш тамыры","dodgerblue":"көк доджер","darkgray":"қою сұры","lightcyan":"ашық көгілдір","powderblue":"жасылдау көк","blueviolet":"көк-ақшыл көк","orchid":"орхидея","dimgray":"күңгірт сұры","beige":"сарғыш","fuchsia":"фуксия","lavenderblush":"күңгірт ақшыл қызыл","hotpink":"ашық қызғылт","steelblue":"көкшіл сұрғылт","tomato":"қызанақ","lightpink":"ақшыл қызғылт","limegreen":"әк жасыл","indianred":"үнділік қызыл","papayawhip":"папайя қамшысы","lightslategray":"ашық көкшіл сұры","gray":"сұры","mediumorchid":"орташа ақшыл","cornsilk":"жібек","black":"қара","seagreen":"теңіз толқыны","darkslateblue":"күңгірт грифель көк","khaki":"хаки","lightblue":"ақшыл көк","palegreen":"бозғылт жасыл","azure":"көкшіл","peachpuff":"шабдалы","darkolivegreen":"қою қоңырлау жасыл","yellowgreen":"сарғыш жасыл"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/kk/colors",({aliceblue:"бозғылт көк",antiquewhite:"ақ антик",aqua:"су түсі",aquamarine:"жасылдау-көк",azure:"көкшіл",beige:"сарғыш",bisque:"бисквит",black:"қара",blanchedalmond:"ағартылған бадам",blue:"көк",blueviolet:"көк-ақшыл көк",brown:"қоңыр",burlywood:"ағаш тамыры",cadetblue:"кадет көк",chartreuse:"жасылдау-сары",chocolate:"шоколад",coral:"коралл",cornflowerblue:"көктікен көк",cornsilk:"жібек",crimson:"таңқұрай",cyan:"циан",darkblue:"күңгірт көк",darkcyan:"күңгірт циан",darkgoldenrod:"қара алтын",darkgray:"қою сұры",darkgreen:"қою жасыл",darkgrey:"қою сұры",darkkhaki:"қою хаки",darkmagenta:"қою қызыл күрең",darkolivegreen:"қою қоңырлау жасыл",darkorange:"қою қызғылт сары",darkorchid:"күңгірт орсель",darkred:"күңгірт қызыл",darksalmon:"қою сарылау қызғылт",darkseagreen:"қою теңіз толқыны",darkslateblue:"күңгірт грифель көк",darkslategray:"күңгірт көкшіл сұры",darkslategrey:"күңгірт көкшіл сұры",darkturquoise:"күңгірт көгілдір",darkviolet:"күңгірт қызыл күрең",deeppink:"қою қызғылт",deepskyblue:"қою аспан көк",dimgray:"күңгірт сұры",dimgrey:"күңгірт сұры",dodgerblue:"көк доджер",firebrick:"қызыл кірпіш",floralwhite:"гүлді ақ",forestgreen:"шөпті жасыл",fuchsia:"фуксия",gainsboro:"gainsboro",ghostwhite:"елесті ақ",gold:"алтындай",goldenrod:"алтын",gray:"сұры",green:"жасыл",greenyellow:"жасыл-сары",grey:"сұры",honeydew:"балдай",hotpink:"ашық қызғылт",indianred:"үнділік қызыл",indigo:"индиго",ivory:"піл сүйег",khaki:"хаки",lavender:"бозғылт ақшыл көк",lavenderblush:"күңгірт ақшыл қызыл",lawngreen:"көгал жасыл",lemonchiffon:"лимон шиффон",lightblue:"ақшыл көк",lightcoral:"ашық коралл",lightcyan:"ашық көгілдір",lightgoldenrodyellow:"ашық алтындай сары",lightgray:"ашық сұры",lightgreen:"ақшыл жасыл",lightgrey:"ашық сұры",lightpink:"ақшыл қызғылт",lightsalmon:"ашық сарғыш қызғылт",lightseagreen:"ашық теңіз толқыны",lightskyblue:"ашық аспан көк",lightslategray:"ашық көкшіл сұры",lightslategrey:"ашық көкшіл сұры",lightsteelblue:"ашық сұрғылт көк",lightyellow:"ашық сары",lime:"әк",limegreen:"әк жасыл",linen:"зығыр",magenta:"фуксин",maroon:"сарғылт",mediumaquamarine:"орташа жасылдау көк",mediumblue:"орташа көк",mediumorchid:"орташа ақшыл",mediumpurple:"орташа қызыл күрең",mediumseagreen:"орташа теңіз толқыны",mediumslateblue:"орташа көкшіл сұры",mediumspringgreen:"орташа ашық жасыл",mediumturquoise:"орташа көгілдір",mediumvioletred:"орташа ақшыл көк-қызыл",midnightblue:"түн ортасы көк",mintcream:"жалбыз майы",mistyrose:"көмескі қызғылт",moccasin:"мокасин",navajowhite:"навахо ақ",navy:"теңіз көк",oldlace:"ескі бау",olive:"зәйтүнді",olivedrab:"жасылдау сары",orange:"қызғылт сары",orangered:"қызғылт сары қызыл",orchid:"орхидея",palegoldenrod:"бозғылт алтын",palegreen:"бозғылт жасыл",paleturquoise:"бозғылт көгілдір",palevioletred:"бозғылт ақшыл көк-қызыл",papayawhip:"папайя қамшысы",peachpuff:"шабдалы",peru:"перу",pink:"қызғылт",plum:"алхоры",powderblue:"жасылдау көк",purple:"қызыл күрең",red:"қызыл",rosybrown:"қызғылт қоңыр",royalblue:"патша көк",saddlebrown:"тоқым қоңыр",salmon:"сомон",sandybrown:"құмды қоңыр",seagreen:"теңіз толқыны",seashell:"теңіз қабыршағы",sienna:"сиенна",silver:"күмістей",skyblue:"аспан көк",slateblue:"грифель көк",slategray:"көкшіл сұры",slategrey:"көкшіл сұры",snow:"қар",springgreen:"көктем жасыл",steelblue:"көкшіл сұрғылт",tan:"сарғыш қоңыр",teal:"шүрегей",thistle:"артишок",tomato:"қызанақ",transparent:"мөлдір",turquoise:"көгілдір",violet:"күлгін",wheat:"бидай",white:"ақ",whitesmoke:"ақ түтін",yellow:"сары",yellowgreen:"сарғыш жасыл"})); \ No newline at end of file diff --git a/lib/dojo/nls/kk/colors.js.uncompressed.js b/lib/dojo/nls/kk/colors.js.uncompressed.js new file mode 100644 index 00000000..d7aa08c4 --- /dev/null +++ b/lib/dojo/nls/kk/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/kk/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "бозғылт көк", + antiquewhite: "ақ антик", + aqua: "су түсі", + aquamarine: "жасылдау-көк", + azure: "көкшіл", + beige: "сарғыш", + bisque: "бисквит", + black: "қара", + blanchedalmond: "ағартылған бадам", + blue: "көк", + blueviolet: "көк-ақшыл көк", + brown: "қоңыр", + burlywood: "ағаш тамыры", + cadetblue: "кадет көк", + chartreuse: "жасылдау-сары", + chocolate: "шоколад", + coral: "коралл", + cornflowerblue: "көктікен көк", + cornsilk: "жібек", + crimson: "таңқұрай", + cyan: "циан", + darkblue: "күңгірт көк", + darkcyan: "күңгірт циан", + darkgoldenrod: "қара алтын", + darkgray: "қою сұры", + darkgreen: "қою жасыл", + darkgrey: "қою сұры", // same as darkgray + darkkhaki: "қою хаки", + darkmagenta: "қою қызыл күрең", + darkolivegreen: "қою қоңырлау жасыл", + darkorange: "қою қызғылт сары", + darkorchid: "күңгірт орсель", + darkred: "күңгірт қызыл", + darksalmon: "қою сарылау қызғылт", + darkseagreen: "қою теңіз толқыны", + darkslateblue: "күңгірт грифель көк", + darkslategray: "күңгірт көкшіл сұры", + darkslategrey: "күңгірт көкшіл сұры", // same as darkslategray + darkturquoise: "күңгірт көгілдір", + darkviolet: "күңгірт қызыл күрең", + deeppink: "қою қызғылт", + deepskyblue: "қою аспан көк", + dimgray: "күңгірт сұры", + dimgrey: "күңгірт сұры", // same as dimgray + dodgerblue: "көк доджер", + firebrick: "қызыл кірпіш", + floralwhite: "гүлді ақ", + forestgreen: "шөпті жасыл", + fuchsia: "фуксия", + gainsboro: "gainsboro", + ghostwhite: "елесті ақ", + gold: "алтындай", + goldenrod: "алтын", + gray: "сұры", + green: "жасыл", + greenyellow: "жасыл-сары", + grey: "сұры", // same as gray + honeydew: "балдай", + hotpink: "ашық қызғылт", + indianred: "үнділік қызыл", + indigo: "индиго", + ivory: "піл сүйег", + khaki: "хаки", + lavender: "бозғылт ақшыл көк", + lavenderblush: "күңгірт ақшыл қызыл", + lawngreen: "көгал жасыл", + lemonchiffon: "лимон шиффон", + lightblue: "ақшыл көк", + lightcoral: "ашық коралл", + lightcyan: "ашық көгілдір", + lightgoldenrodyellow: "ашық алтындай сары", + lightgray: "ашық сұры", + lightgreen: "ақшыл жасыл", + lightgrey: "ашық сұры", // same as lightgray + lightpink: "ақшыл қызғылт", + lightsalmon: "ашық сарғыш қызғылт", + lightseagreen: "ашық теңіз толқыны", + lightskyblue: "ашық аспан көк", + lightslategray: "ашық көкшіл сұры", + lightslategrey: "ашық көкшіл сұры", // same as lightslategray + lightsteelblue: "ашық сұрғылт көк", + lightyellow: "ашық сары", + lime: "әк", + limegreen: "әк жасыл", + linen: "зығыр", + magenta: "фуксин", + maroon: "сарғылт", + mediumaquamarine: "орташа жасылдау көк", + mediumblue: "орташа көк", + mediumorchid: "орташа ақшыл", + mediumpurple: "орташа қызыл күрең", + mediumseagreen: "орташа теңіз толқыны", + mediumslateblue: "орташа көкшіл сұры", + mediumspringgreen: "орташа ашық жасыл", + mediumturquoise: "орташа көгілдір", + mediumvioletred: "орташа ақшыл көк-қызыл", + midnightblue: "түн ортасы көк", + mintcream: "жалбыз майы", + mistyrose: "көмескі қызғылт", + moccasin: "мокасин", + navajowhite: "навахо ақ", + navy: "теңіз көк", + oldlace: "ескі бау", + olive: "зәйтүнді", + olivedrab: "жасылдау сары", + orange: "қызғылт сары", + orangered: "қызғылт сары қызыл", + orchid: "орхидея", + palegoldenrod: "бозғылт алтын", + palegreen: "бозғылт жасыл", + paleturquoise: "бозғылт көгілдір", + palevioletred: "бозғылт ақшыл көк-қызыл", + papayawhip: "папайя қамшысы", + peachpuff: "шабдалы", + peru: "перу", + pink: "қызғылт", + plum: "алхоры", + powderblue: "жасылдау көк", + purple: "қызыл күрең", + red: "қызыл", + rosybrown: "қызғылт қоңыр", + royalblue: "патша көк", + saddlebrown: "тоқым қоңыр", + salmon: "сомон", + sandybrown: "құмды қоңыр", + seagreen: "теңіз толқыны", + seashell: "теңіз қабыршағы", + sienna: "сиенна", + silver: "күмістей", + skyblue: "аспан көк", + slateblue: "грифель көк", + slategray: "көкшіл сұры", + slategrey: "көкшіл сұры", // same as slategray + snow: "қар", + springgreen: "көктем жасыл", + steelblue: "көкшіл сұрғылт", + tan: "сарғыш қоңыр", + teal: "шүрегей", + thistle: "артишок", + tomato: "қызанақ", + transparent: "мөлдір", + turquoise: "көгілдір", + violet: "күлгін", + wheat: "бидай", + white: "ақ", + whitesmoke: "ақ түтін", + yellow: "сары", + yellowgreen: "сарғыш жасыл" +}) +); diff --git a/lib/dojo/nls/ko/colors.js b/lib/dojo/nls/ko/colors.js index 0c6576b1..4dba16c5 100644 --- a/lib/dojo/nls/ko/colors.js +++ b/lib/dojo/nls/ko/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"라이트 스틸 블루(light steel blue)","orangered":"오렌지 레드(orange red)","midnightblue":"미드나잇 블루(midnight blue)","cadetblue":"카뎃 블루(cadet blue)","seashell":"씨쉘(seashell)","slategrey":"슬레이트 그레이(slate gray)","coral":"코랄(coral)","darkturquoise":"다크 터콰즈(dark turquoise)","antiquewhite":"앤틱 화이트(antique white)","mediumspringgreen":"미디엄 스프링 그린(medium spring green)","salmon":"샐몬(salmon)","darkgrey":"다크 그레이(dark gray)","ivory":"아이보리(ivory)","greenyellow":"그린 옐로우(green-yellow)","mistyrose":"미스티 로즈(misty rose)","lightsalmon":"라이트 샐몬(light salmon)","silver":"실버(silver)","dimgrey":"딤 그레이(dim gray)","orange":"오렌지(orange)","white":"화이트(white)","navajowhite":"나바호 화이트(navajo white)","royalblue":"로얄 블루(royal blue)","deeppink":"딥 핑크(deep pink)","lime":"라임(lime)","oldlace":"올드 레이스(old lace)","chartreuse":"샤르트뢰즈(chartreuse)","darkcyan":"다크 시안(dark cyan)","yellow":"옐로우(yellow)","linen":"리넨(linen)","olive":"올리브(olive)","gold":"골드(gold)","lawngreen":"론 그린(lawn green)","lightyellow":"라이트 옐로우(light yellow)","tan":"탠(tan)","darkviolet":"다크 바이올렛(dark violet)","lightslategrey":"라이트 슬레이트 그레이(light slate gray)","grey":"그레이(gray)","darkkhaki":"다크 카키(dark khaki)","green":"그린(green)","deepskyblue":"딥 스카이 블루(deep sky blue)","aqua":"아쿠아(aqua)","sienna":"시에나(sienna)","mintcream":"민트 크림(mint cream)","rosybrown":"로지 브라운(rosy brown)","mediumslateblue":"미디엄 슬레이트 블루(medium slate blue)","magenta":"마젠타(magenta)","lightseagreen":"라이트 씨 그린(light sea green)","cyan":"시안(cyan)","olivedrab":"올리브 드랩(olive drab)","darkgoldenrod":"다크 골든로드(dark goldenrod)","slateblue":"슬레이트 블루(slate blue)","mediumaquamarine":"미디엄 아쿠아마린(medium aquamarine)","lavender":"라벤더(lavender)","mediumseagreen":"미디엄 씨 그린(medium sea green)","maroon":"마룬(maroon)","darkslategray":"다크 슬레이트 그레이(dark slate gray)","mediumturquoise":"미디엄 터콰즈(medium turquoise)","ghostwhite":"고스트 화이트(ghost white)","darkblue":"다크 블루(dark blue)","mediumvioletred":"미디엄 바이올렛 레드(medium violet-red)","brown":"브라운(brown)","lightgray":"라이트 그레이(light gray)","sandybrown":"샌디 브라운(sandy brown)","pink":"핑크(pink)","firebrick":"파이어 브릭(fire brick)","indigo":"인디고(indigo)","snow":"스노우(snow)","darkorchid":"다크 오키드(dark orchid)","turquoise":"터콰즈(turquoise)","chocolate":"초콜렛(chocolate)","springgreen":"스프링 그린(spring green)","moccasin":"모카신(moccasin)","navy":"네이비(navy)","lemonchiffon":"레몬 쉬폰(lemon chiffon)","teal":"틸(teal)","floralwhite":"플로랄 화이트(floral white)","cornflowerblue":"콘플라워 블루(cornflower blue)","paleturquoise":"페일 터콰즈(pale turquoise)","purple":"퍼플(purple)","gainsboro":"게인스브로(gainsboro)","plum":"플럼(plum)","red":"레드(red)","blue":"블루(blue)","forestgreen":"포레스트 그린(forest green)","darkgreen":"다크 그린(dark green)","honeydew":"허니듀(honeydew)","darkseagreen":"다크 씨 그린(dark sea green)","lightcoral":"라이트 코랄(light coral)","palevioletred":"페일 바이올렛 레드(pale violet-red)","mediumpurple":"미디엄 퍼플(medium purple)","saddlebrown":"새들 브라운(saddle brown)","darkmagenta":"다크 마젠타(dark magenta)","thistle":"시슬(thistle)","whitesmoke":"화이트 스모크(white smoke)","wheat":"휘트(wheat)","violet":"바이올렛(violet)","lightskyblue":"라이트 스카이 블루(light sky blue)","goldenrod":"골든로드(goldenrod)","mediumblue":"미디엄 블루(medium blue)","skyblue":"스카이 블루(sky blue)","crimson":"크림슨(crimson)","darksalmon":"다크 샐몬(dark salmon)","darkred":"다크 레드(dark red)","darkslategrey":"다크 슬레이트 그레이(dark slate gray)","peru":"페루(peru)","lightgrey":"라이트 그레이(light gray)","lightgoldenrodyellow":"라이트 골든로드 옐로우(light goldenrod yellow)","blanchedalmond":"블랜치 아몬드(blanched almond)","aliceblue":"앨리스 블루(alice blue)","bisque":"비스크(bisque)","slategray":"슬레이트 그레이(slate gray)","palegoldenrod":"페일 골든로드(pale goldenrod)","darkorange":"다크 오렌지(dark orange)","aquamarine":"아쿠아마린(aquamarine)","lightgreen":"라이트 그린(light green)","burlywood":"벌리우드(burlywood)","dodgerblue":"다저 블루(dodger blue)","darkgray":"다크 그레이(dark gray)","lightcyan":"라이트 시안(light cyan)","powderblue":"파우더 블루(powder blue)","blueviolet":"블루 바이올렛(blue-violet)","orchid":"오키드(orchid)","dimgray":"딤 그레이(dim gray)","beige":"베이지(beige)","fuchsia":"후크샤(fuchsia)","lavenderblush":"라벤더 블러쉬(lavender blush)","hotpink":"핫 핑크(hot pink)","steelblue":"스틸 블루(steel blue)","tomato":"토마토(tomato)","lightpink":"라이트 핑크(light pink)","limegreen":"라임 그린(lime green)","indianred":"인디안 레드(indian red)","papayawhip":"파파야 휩(papaya whip)","lightslategray":"라이트 슬레이트 그레이(light slate gray)","gray":"그레이(gray)","mediumorchid":"미디엄 오키드(medium orchid)","cornsilk":"콘실크(cornsilk)","black":"블랙(black)","seagreen":"씨 그린(sea green)","darkslateblue":"다크 슬레이트 블루(dark slate blue)","khaki":"카키(khaki)","lightblue":"라이트 블루(light blue)","palegreen":"페일 그린(pale green)","azure":"애쥬어(azure)","peachpuff":"피치 퍼프(peach puff)","darkolivegreen":"다크 올리브 그린(dark olive green)","yellowgreen":"옐로우 그린(yellow green)"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/ko/colors",({aliceblue:"앨리스 블루(alice blue)",antiquewhite:"앤틱 화이트(antique white)",aqua:"아쿠아(aqua)",aquamarine:"아쿠아마린(aquamarine)",azure:"애쥬어(azure)",beige:"베이지(beige)",bisque:"비스크(bisque)",black:"블랙(black)",blanchedalmond:"블랜치 아몬드(blanched almond)",blue:"블루(blue)",blueviolet:"블루 바이올렛(blue-violet)",brown:"브라운(brown)",burlywood:"벌리우드(burlywood)",cadetblue:"카뎃 블루(cadet blue)",chartreuse:"샤르트뢰즈(chartreuse)",chocolate:"초콜렛(chocolate)",coral:"코랄(coral)",cornflowerblue:"콘플라워 블루(cornflower blue)",cornsilk:"콘실크(cornsilk)",crimson:"크림슨(crimson)",cyan:"시안(cyan)",darkblue:"다크 블루(dark blue)",darkcyan:"다크 시안(dark cyan)",darkgoldenrod:"다크 골든로드(dark goldenrod)",darkgray:"다크 그레이(dark gray)",darkgreen:"다크 그린(dark green)",darkgrey:"다크 그레이(dark gray)",darkkhaki:"다크 카키(dark khaki)",darkmagenta:"다크 마젠타(dark magenta)",darkolivegreen:"다크 올리브 그린(dark olive green)",darkorange:"다크 오렌지(dark orange)",darkorchid:"다크 오키드(dark orchid)",darkred:"다크 레드(dark red)",darksalmon:"다크 샐몬(dark salmon)",darkseagreen:"다크 씨 그린(dark sea green)",darkslateblue:"다크 슬레이트 블루(dark slate blue)",darkslategray:"다크 슬레이트 그레이(dark slate gray)",darkslategrey:"다크 슬레이트 그레이(dark slate gray)",darkturquoise:"다크 터콰즈(dark turquoise)",darkviolet:"다크 바이올렛(dark violet)",deeppink:"딥 핑크(deep pink)",deepskyblue:"딥 스카이 블루(deep sky blue)",dimgray:"딤 그레이(dim gray)",dimgrey:"딤 그레이(dim gray)",dodgerblue:"다저 블루(dodger blue)",firebrick:"파이어 브릭(fire brick)",floralwhite:"플로랄 화이트(floral white)",forestgreen:"포레스트 그린(forest green)",fuchsia:"후크샤(fuchsia)",gainsboro:"게인스브로(gainsboro)",ghostwhite:"고스트 화이트(ghost white)",gold:"골드(gold)",goldenrod:"골든로드(goldenrod)",gray:"그레이(gray)",green:"그린(green)",greenyellow:"그린 옐로우(green-yellow)",grey:"그레이(gray)",honeydew:"허니듀(honeydew)",hotpink:"핫 핑크(hot pink)",indianred:"인디안 레드(indian red)",indigo:"인디고(indigo)",ivory:"아이보리(ivory)",khaki:"카키(khaki)",lavender:"라벤더(lavender)",lavenderblush:"라벤더 블러쉬(lavender blush)",lawngreen:"론 그린(lawn green)",lemonchiffon:"레몬 쉬폰(lemon chiffon)",lightblue:"라이트 블루(light blue)",lightcoral:"라이트 코랄(light coral)",lightcyan:"라이트 시안(light cyan)",lightgoldenrodyellow:"라이트 골든로드 옐로우(light goldenrod yellow)",lightgray:"라이트 그레이(light gray)",lightgreen:"라이트 그린(light green)",lightgrey:"라이트 그레이(light gray)",lightpink:"라이트 핑크(light pink)",lightsalmon:"라이트 샐몬(light salmon)",lightseagreen:"라이트 씨 그린(light sea green)",lightskyblue:"라이트 스카이 블루(light sky blue)",lightslategray:"라이트 슬레이트 그레이(light slate gray)",lightslategrey:"라이트 슬레이트 그레이(light slate gray)",lightsteelblue:"라이트 스틸 블루(light steel blue)",lightyellow:"라이트 옐로우(light yellow)",lime:"라임(lime)",limegreen:"라임 그린(lime green)",linen:"리넨(linen)",magenta:"마젠타(magenta)",maroon:"마룬(maroon)",mediumaquamarine:"미디엄 아쿠아마린(medium aquamarine)",mediumblue:"미디엄 블루(medium blue)",mediumorchid:"미디엄 오키드(medium orchid)",mediumpurple:"미디엄 퍼플(medium purple)",mediumseagreen:"미디엄 씨 그린(medium sea green)",mediumslateblue:"미디엄 슬레이트 블루(medium slate blue)",mediumspringgreen:"미디엄 스프링 그린(medium spring green)",mediumturquoise:"미디엄 터콰즈(medium turquoise)",mediumvioletred:"미디엄 바이올렛 레드(medium violet-red)",midnightblue:"미드나잇 블루(midnight blue)",mintcream:"민트 크림(mint cream)",mistyrose:"미스티 로즈(misty rose)",moccasin:"모카신(moccasin)",navajowhite:"나바호 화이트(navajo white)",navy:"네이비(navy)",oldlace:"올드 레이스(old lace)",olive:"올리브(olive)",olivedrab:"올리브 드랩(olive drab)",orange:"오렌지(orange)",orangered:"오렌지 레드(orange red)",orchid:"오키드(orchid)",palegoldenrod:"페일 골든로드(pale goldenrod)",palegreen:"페일 그린(pale green)",paleturquoise:"페일 터콰즈(pale turquoise)",palevioletred:"페일 바이올렛 레드(pale violet-red)",papayawhip:"파파야 휩(papaya whip)",peachpuff:"피치 퍼프(peach puff)",peru:"페루(peru)",pink:"핑크(pink)",plum:"플럼(plum)",powderblue:"파우더 블루(powder blue)",purple:"퍼플(purple)",red:"레드(red)",rosybrown:"로지 브라운(rosy brown)",royalblue:"로얄 블루(royal blue)",saddlebrown:"새들 브라운(saddle brown)",salmon:"샐몬(salmon)",sandybrown:"샌디 브라운(sandy brown)",seagreen:"씨 그린(sea green)",seashell:"씨쉘(seashell)",sienna:"시에나(sienna)",silver:"실버(silver)",skyblue:"스카이 블루(sky blue)",slateblue:"슬레이트 블루(slate blue)",slategray:"슬레이트 그레이(slate gray)",slategrey:"슬레이트 그레이(slate gray)",snow:"스노우(snow)",springgreen:"스프링 그린(spring green)",steelblue:"스틸 블루(steel blue)",tan:"탠(tan)",teal:"틸(teal)",thistle:"시슬(thistle)",tomato:"토마토(tomato)",transparent:"투명(transparent)",turquoise:"터콰즈(turquoise)",violet:"바이올렛(violet)",wheat:"휘트(wheat)",white:"화이트(white)",whitesmoke:"화이트 스모크(white smoke)",yellow:"옐로우(yellow)",yellowgreen:"옐로우 그린(yellow green)"})); \ No newline at end of file diff --git a/lib/dojo/nls/ko/colors.js.uncompressed.js b/lib/dojo/nls/ko/colors.js.uncompressed.js new file mode 100644 index 00000000..901b3c9d --- /dev/null +++ b/lib/dojo/nls/ko/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/ko/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "앨리스 블루(alice blue)", + antiquewhite: "앤틱 화이트(antique white)", + aqua: "아쿠아(aqua)", + aquamarine: "아쿠아마린(aquamarine)", + azure: "애쥬어(azure)", + beige: "베이지(beige)", + bisque: "비스크(bisque)", + black: "블랙(black)", + blanchedalmond: "블랜치 아몬드(blanched almond)", + blue: "블루(blue)", + blueviolet: "블루 바이올렛(blue-violet)", + brown: "브라운(brown)", + burlywood: "벌리우드(burlywood)", + cadetblue: "카뎃 블루(cadet blue)", + chartreuse: "샤르트뢰즈(chartreuse)", + chocolate: "초콜렛(chocolate)", + coral: "코랄(coral)", + cornflowerblue: "콘플라워 블루(cornflower blue)", + cornsilk: "콘실크(cornsilk)", + crimson: "크림슨(crimson)", + cyan: "시안(cyan)", + darkblue: "다크 블루(dark blue)", + darkcyan: "다크 시안(dark cyan)", + darkgoldenrod: "다크 골든로드(dark goldenrod)", + darkgray: "다크 그레이(dark gray)", + darkgreen: "다크 그린(dark green)", + darkgrey: "다크 그레이(dark gray)", // same as darkgray + darkkhaki: "다크 카키(dark khaki)", + darkmagenta: "다크 마젠타(dark magenta)", + darkolivegreen: "다크 올리브 그린(dark olive green)", + darkorange: "다크 오렌지(dark orange)", + darkorchid: "다크 오키드(dark orchid)", + darkred: "다크 레드(dark red)", + darksalmon: "다크 샐몬(dark salmon)", + darkseagreen: "다크 씨 그린(dark sea green)", + darkslateblue: "다크 슬레이트 블루(dark slate blue)", + darkslategray: "다크 슬레이트 그레이(dark slate gray)", + darkslategrey: "다크 슬레이트 그레이(dark slate gray)", // same as darkslategray + darkturquoise: "다크 터콰즈(dark turquoise)", + darkviolet: "다크 바이올렛(dark violet)", + deeppink: "딥 핑크(deep pink)", + deepskyblue: "딥 스카이 블루(deep sky blue)", + dimgray: "딤 그레이(dim gray)", + dimgrey: "딤 그레이(dim gray)", // same as dimgray + dodgerblue: "다저 블루(dodger blue)", + firebrick: "파이어 브릭(fire brick)", + floralwhite: "플로랄 화이트(floral white)", + forestgreen: "포레스트 그린(forest green)", + fuchsia: "후크샤(fuchsia)", + gainsboro: "게인스브로(gainsboro)", + ghostwhite: "고스트 화이트(ghost white)", + gold: "골드(gold)", + goldenrod: "골든로드(goldenrod)", + gray: "그레이(gray)", + green: "그린(green)", + greenyellow: "그린 옐로우(green-yellow)", + grey: "그레이(gray)", // same as gray + honeydew: "허니듀(honeydew)", + hotpink: "핫 핑크(hot pink)", + indianred: "인디안 레드(indian red)", + indigo: "인디고(indigo)", + ivory: "아이보리(ivory)", + khaki: "카키(khaki)", + lavender: "라벤더(lavender)", + lavenderblush: "라벤더 블러쉬(lavender blush)", + lawngreen: "론 그린(lawn green)", + lemonchiffon: "레몬 쉬폰(lemon chiffon)", + lightblue: "라이트 블루(light blue)", + lightcoral: "라이트 코랄(light coral)", + lightcyan: "라이트 시안(light cyan)", + lightgoldenrodyellow: "라이트 골든로드 옐로우(light goldenrod yellow)", + lightgray: "라이트 그레이(light gray)", + lightgreen: "라이트 그린(light green)", + lightgrey: "라이트 그레이(light gray)", // same as lightgray + lightpink: "라이트 핑크(light pink)", + lightsalmon: "라이트 샐몬(light salmon)", + lightseagreen: "라이트 씨 그린(light sea green)", + lightskyblue: "라이트 스카이 블루(light sky blue)", + lightslategray: "라이트 슬레이트 그레이(light slate gray)", + lightslategrey: "라이트 슬레이트 그레이(light slate gray)", // same as lightslategray + lightsteelblue: "라이트 스틸 블루(light steel blue)", + lightyellow: "라이트 옐로우(light yellow)", + lime: "라임(lime)", + limegreen: "라임 그린(lime green)", + linen: "리넨(linen)", + magenta: "마젠타(magenta)", + maroon: "마룬(maroon)", + mediumaquamarine: "미디엄 아쿠아마린(medium aquamarine)", + mediumblue: "미디엄 블루(medium blue)", + mediumorchid: "미디엄 오키드(medium orchid)", + mediumpurple: "미디엄 퍼플(medium purple)", + mediumseagreen: "미디엄 씨 그린(medium sea green)", + mediumslateblue: "미디엄 슬레이트 블루(medium slate blue)", + mediumspringgreen: "미디엄 스프링 그린(medium spring green)", + mediumturquoise: "미디엄 터콰즈(medium turquoise)", + mediumvioletred: "미디엄 바이올렛 레드(medium violet-red)", + midnightblue: "미드나잇 블루(midnight blue)", + mintcream: "민트 크림(mint cream)", + mistyrose: "미스티 로즈(misty rose)", + moccasin: "모카신(moccasin)", + navajowhite: "나바호 화이트(navajo white)", + navy: "네이비(navy)", + oldlace: "올드 레이스(old lace)", + olive: "올리브(olive)", + olivedrab: "올리브 드랩(olive drab)", + orange: "오렌지(orange)", + orangered: "오렌지 레드(orange red)", + orchid: "오키드(orchid)", + palegoldenrod: "페일 골든로드(pale goldenrod)", + palegreen: "페일 그린(pale green)", + paleturquoise: "페일 터콰즈(pale turquoise)", + palevioletred: "페일 바이올렛 레드(pale violet-red)", + papayawhip: "파파야 휩(papaya whip)", + peachpuff: "피치 퍼프(peach puff)", + peru: "페루(peru)", + pink: "핑크(pink)", + plum: "플럼(plum)", + powderblue: "파우더 블루(powder blue)", + purple: "퍼플(purple)", + red: "레드(red)", + rosybrown: "로지 브라운(rosy brown)", + royalblue: "로얄 블루(royal blue)", + saddlebrown: "새들 브라운(saddle brown)", + salmon: "샐몬(salmon)", + sandybrown: "샌디 브라운(sandy brown)", + seagreen: "씨 그린(sea green)", + seashell: "씨쉘(seashell)", + sienna: "시에나(sienna)", + silver: "실버(silver)", + skyblue: "스카이 블루(sky blue)", + slateblue: "슬레이트 블루(slate blue)", + slategray: "슬레이트 그레이(slate gray)", + slategrey: "슬레이트 그레이(slate gray)", // same as slategray + snow: "스노우(snow)", + springgreen: "스프링 그린(spring green)", + steelblue: "스틸 블루(steel blue)", + tan: "탠(tan)", + teal: "틸(teal)", + thistle: "시슬(thistle)", + tomato: "토마토(tomato)", + transparent: "투명(transparent)", + turquoise: "터콰즈(turquoise)", + violet: "바이올렛(violet)", + wheat: "휘트(wheat)", + white: "화이트(white)", + whitesmoke: "화이트 스모크(white smoke)", + yellow: "옐로우(yellow)", + yellowgreen: "옐로우 그린(yellow green)" +}) +); diff --git a/lib/dojo/nls/nb/colors.js b/lib/dojo/nls/nb/colors.js index 15770a40..eb382bad 100644 --- a/lib/dojo/nls/nb/colors.js +++ b/lib/dojo/nls/nb/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"lys stålblå","orangered":"rødoransje","midnightblue":"midnattsblå","cadetblue":"mørk grønnblå","seashell":"skjellhvit","slategrey":"skifergrå","coral":"korall","darkturquoise":"mørk turkis","antiquewhite":"antikk hvit","mediumspringgreen":"middels vårgrønn","salmon":"lakserosa","darkgrey":"mørk grå","ivory":"elfenbenshvit","greenyellow":"gulgrønn","mistyrose":"lys rosenrød","lightsalmon":"lys lakserosa","silver":"sølvfarget","dimgrey":"mørk mørkegrå","orange":"oransje","white":"hvit","navajowhite":"gulbrun","royalblue":"kongeblå","deeppink":"dyp rosa","lime":"lime","oldlace":"kniplingshvit","chartreuse":"løvgrønn","darkcyan":"mørk cyan","yellow":"gul","linen":"lin","olive":"oliven","gold":"gull","lawngreen":"plengrønn","lightyellow":"lys gul","tan":"matt mellombrun","darkviolet":"mørk fiolett","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grønn","deepskyblue":"dyp himmelblå","aqua":"akva","sienna":"nøttebrun","mintcream":"mintkrem","rosybrown":"brunlilla","mediumslateblue":"middels skiferblå","magenta":"magenta","lightseagreen":"lys sjøgrønn","cyan":"cyan","olivedrab":"middels olivengrønn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"middels akvamarin","lavender":"lavendel","mediumseagreen":"middels sjøgrønn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"middels turkis","ghostwhite":"egghvit","darkblue":"mørk blå","mediumvioletred":"middels fiolettrød","brown":"brun","lightgray":"lys grå","sandybrown":"sandbrun","pink":"rosa","firebrick":"mursteinsrød","indigo":"indigo","snow":"snøhvit","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"sjokolade","springgreen":"vårgrønn","moccasin":"lys gulbrun","navy":"marineblå","lemonchiffon":"ferskenfarget","teal":"mørk grønnblå","floralwhite":"blomsterhvit","cornflowerblue":"kornblå","paleturquoise":"svak turkis","purple":"purpur","gainsboro":"lys lys grå","plum":"plommefarget","red":"rød","blue":"blå","forestgreen":"skoggrønn","darkgreen":"mørk grønn","honeydew":"grønnhvit","darkseagreen":"mørk sjøgrønn","lightcoral":"lys korall","palevioletred":"svak fiolettrød","mediumpurple":"middels purpur","saddlebrown":"mørk nøttebrun","darkmagenta":"mørk magenta","thistle":"lys grålilla","whitesmoke":"røykhvit","wheat":"varm sienna","violet":"fiolett","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellomblå","skyblue":"himmelblå","crimson":"karmosinrødt","darksalmon":"mørk lakserosa","darkred":"mørk rød","darkslategrey":"mørk skifergrå","peru":"lys nøttebrun","lightgrey":"lys grå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"lys mandel","aliceblue":"blåhvit","bisque":"gulrosa","slategray":"skifergrå","palegoldenrod":"svak gyldenris","darkorange":"mørk oransje","aquamarine":"akvamarin","lightgreen":"lys grønn","burlywood":"matt mellombrun","dodgerblue":"lys havblå","darkgray":"mørk grå","lightcyan":"lys cyan","powderblue":"lys grønnblå","blueviolet":"blåfiolett","orchid":"orkide","dimgray":"mørk mørkegrå","beige":"beige","fuchsia":"fuksia","lavenderblush":"lillahvit","hotpink":"halvmørk rosa","steelblue":"stålblå","tomato":"tomatrød","lightpink":"lys rosa","limegreen":"limegrønn","indianred":"rustrød","papayawhip":"lys papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"middels orkide","cornsilk":"cornsilk","black":"svart","seagreen":"sjøgrønn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lys blå","palegreen":"svak grønn","azure":"asur","peachpuff":"brunrosa","darkolivegreen":"mørk olivengrønn","yellowgreen":"gulgrønn"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/nb/colors",({aliceblue:"blåhvit",antiquewhite:"antikk hvit",aqua:"akva",aquamarine:"akvamarin",azure:"asur",beige:"beige",bisque:"gulrosa",black:"svart",blanchedalmond:"lys mandel",blue:"blå",blueviolet:"blåfiolett",brown:"brun",burlywood:"matt mellombrun",cadetblue:"mørk grønnblå",chartreuse:"løvgrønn",chocolate:"sjokolade",coral:"korall",cornflowerblue:"kornblå",cornsilk:"cornsilk",crimson:"karmosinrødt",cyan:"cyan",darkblue:"mørk blå",darkcyan:"mørk cyan",darkgoldenrod:"mørk gyldenris",darkgray:"mørk grå",darkgreen:"mørk grønn",darkgrey:"mørk grå",darkkhaki:"mørk khaki",darkmagenta:"mørk magenta",darkolivegreen:"mørk olivengrønn",darkorange:"mørk oransje",darkorchid:"mørk orkide",darkred:"mørk rød",darksalmon:"mørk lakserosa",darkseagreen:"mørk sjøgrønn",darkslateblue:"mørk skiferblå",darkslategray:"mørk skifergrå",darkslategrey:"mørk skifergrå",darkturquoise:"mørk turkis",darkviolet:"mørk fiolett",deeppink:"dyp rosa",deepskyblue:"dyp himmelblå",dimgray:"mørk mørkegrå",dimgrey:"mørk mørkegrå",dodgerblue:"lys havblå",firebrick:"mursteinsrød",floralwhite:"blomsterhvit",forestgreen:"skoggrønn",fuchsia:"fuksia",gainsboro:"lys lys grå",ghostwhite:"egghvit",gold:"gull",goldenrod:"gyldenris",gray:"grå",green:"grønn",greenyellow:"gulgrønn",grey:"grå",honeydew:"grønnhvit",hotpink:"halvmørk rosa",indianred:"rustrød",indigo:"indigo",ivory:"elfenbenshvit",khaki:"khaki",lavender:"lavendel",lavenderblush:"lillahvit",lawngreen:"plengrønn",lemonchiffon:"ferskenfarget",lightblue:"lys blå",lightcoral:"lys korall",lightcyan:"lys cyan",lightgoldenrodyellow:"lys gyldenrisgul",lightgray:"lys grå",lightgreen:"lys grønn",lightgrey:"lys grå",lightpink:"lys rosa",lightsalmon:"lys lakserosa",lightseagreen:"lys sjøgrønn",lightskyblue:"lys himmelblå",lightslategray:"lys skifergrå",lightslategrey:"lys skifergrå",lightsteelblue:"lys stålblå",lightyellow:"lys gul",lime:"lime",limegreen:"limegrønn",linen:"lin",magenta:"magenta",maroon:"rødbrun",mediumaquamarine:"middels akvamarin",mediumblue:"mellomblå",mediumorchid:"middels orkide",mediumpurple:"middels purpur",mediumseagreen:"middels sjøgrønn",mediumslateblue:"middels skiferblå",mediumspringgreen:"middels vårgrønn",mediumturquoise:"middels turkis",mediumvioletred:"middels fiolettrød",midnightblue:"midnattsblå",mintcream:"mintkrem",mistyrose:"lys rosenrød",moccasin:"lys gulbrun",navajowhite:"gulbrun",navy:"marineblå",oldlace:"kniplingshvit",olive:"oliven",olivedrab:"middels olivengrønn",orange:"oransje",orangered:"rødoransje",orchid:"orkide",palegoldenrod:"svak gyldenris",palegreen:"svak grønn",paleturquoise:"svak turkis",palevioletred:"svak fiolettrød",papayawhip:"lys papaya",peachpuff:"brunrosa",peru:"lys nøttebrun",pink:"rosa",plum:"plommefarget",powderblue:"lys grønnblå",purple:"purpur",red:"rød",rosybrown:"brunlilla",royalblue:"kongeblå",saddlebrown:"mørk nøttebrun",salmon:"lakserosa",sandybrown:"sandbrun",seagreen:"sjøgrønn",seashell:"skjellhvit",sienna:"nøttebrun",silver:"sølvfarget",skyblue:"himmelblå",slateblue:"skiferblå",slategray:"skifergrå",slategrey:"skifergrå",snow:"snøhvit",springgreen:"vårgrønn",steelblue:"stålblå",tan:"matt mellombrun",teal:"mørk grønnblå",thistle:"lys grålilla",tomato:"tomatrød",transparent:"gjennomsiktig",turquoise:"turkis",violet:"fiolett",wheat:"varm sienna",white:"hvit",whitesmoke:"røykhvit",yellow:"gul",yellowgreen:"gulgrønn"})); \ No newline at end of file diff --git a/lib/dojo/nls/nb/colors.js.uncompressed.js b/lib/dojo/nls/nb/colors.js.uncompressed.js new file mode 100644 index 00000000..8345bbbe --- /dev/null +++ b/lib/dojo/nls/nb/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/nb/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "blåhvit", + antiquewhite: "antikk hvit", + aqua: "akva", + aquamarine: "akvamarin", + azure: "asur", + beige: "beige", + bisque: "gulrosa", + black: "svart", + blanchedalmond: "lys mandel", + blue: "blå", + blueviolet: "blåfiolett", + brown: "brun", + burlywood: "matt mellombrun", + cadetblue: "mørk grønnblå", + chartreuse: "løvgrønn", + chocolate: "sjokolade", + coral: "korall", + cornflowerblue: "kornblå", + cornsilk: "cornsilk", + crimson: "karmosinrødt", + cyan: "cyan", + darkblue: "mørk blå", + darkcyan: "mørk cyan", + darkgoldenrod: "mørk gyldenris", + darkgray: "mørk grå", + darkgreen: "mørk grønn", + darkgrey: "mørk grå", // same as darkgray + darkkhaki: "mørk khaki", + darkmagenta: "mørk magenta", + darkolivegreen: "mørk olivengrønn", + darkorange: "mørk oransje", + darkorchid: "mørk orkide", + darkred: "mørk rød", + darksalmon: "mørk lakserosa", + darkseagreen: "mørk sjøgrønn", + darkslateblue: "mørk skiferblå", + darkslategray: "mørk skifergrå", + darkslategrey: "mørk skifergrå", // same as darkslategray + darkturquoise: "mørk turkis", + darkviolet: "mørk fiolett", + deeppink: "dyp rosa", + deepskyblue: "dyp himmelblå", + dimgray: "mørk mørkegrå", + dimgrey: "mørk mørkegrå", // same as dimgray + dodgerblue: "lys havblå", + firebrick: "mursteinsrød", + floralwhite: "blomsterhvit", + forestgreen: "skoggrønn", + fuchsia: "fuksia", + gainsboro: "lys lys grå", + ghostwhite: "egghvit", + gold: "gull", + goldenrod: "gyldenris", + gray: "grå", + green: "grønn", + greenyellow: "gulgrønn", + grey: "grå", // same as gray + honeydew: "grønnhvit", + hotpink: "halvmørk rosa", + indianred: "rustrød", + indigo: "indigo", + ivory: "elfenbenshvit", + khaki: "khaki", + lavender: "lavendel", + lavenderblush: "lillahvit", + lawngreen: "plengrønn", + lemonchiffon: "ferskenfarget", + lightblue: "lys blå", + lightcoral: "lys korall", + lightcyan: "lys cyan", + lightgoldenrodyellow: "lys gyldenrisgul", + lightgray: "lys grå", + lightgreen: "lys grønn", + lightgrey: "lys grå", // same as lightgray + lightpink: "lys rosa", + lightsalmon: "lys lakserosa", + lightseagreen: "lys sjøgrønn", + lightskyblue: "lys himmelblå", + lightslategray: "lys skifergrå", + lightslategrey: "lys skifergrå", // same as lightslategray + lightsteelblue: "lys stålblå", + lightyellow: "lys gul", + lime: "lime", + limegreen: "limegrønn", + linen: "lin", + magenta: "magenta", + maroon: "rødbrun", + mediumaquamarine: "middels akvamarin", + mediumblue: "mellomblå", + mediumorchid: "middels orkide", + mediumpurple: "middels purpur", + mediumseagreen: "middels sjøgrønn", + mediumslateblue: "middels skiferblå", + mediumspringgreen: "middels vårgrønn", + mediumturquoise: "middels turkis", + mediumvioletred: "middels fiolettrød", + midnightblue: "midnattsblå", + mintcream: "mintkrem", + mistyrose: "lys rosenrød", + moccasin: "lys gulbrun", + navajowhite: "gulbrun", + navy: "marineblå", + oldlace: "kniplingshvit", + olive: "oliven", + olivedrab: "middels olivengrønn", + orange: "oransje", + orangered: "rødoransje", + orchid: "orkide", + palegoldenrod: "svak gyldenris", + palegreen: "svak grønn", + paleturquoise: "svak turkis", + palevioletred: "svak fiolettrød", + papayawhip: "lys papaya", + peachpuff: "brunrosa", + peru: "lys nøttebrun", + pink: "rosa", + plum: "plommefarget", + powderblue: "lys grønnblå", + purple: "purpur", + red: "rød", + rosybrown: "brunlilla", + royalblue: "kongeblå", + saddlebrown: "mørk nøttebrun", + salmon: "lakserosa", + sandybrown: "sandbrun", + seagreen: "sjøgrønn", + seashell: "skjellhvit", + sienna: "nøttebrun", + silver: "sølvfarget", + skyblue: "himmelblå", + slateblue: "skiferblå", + slategray: "skifergrå", + slategrey: "skifergrå", // same as slategray + snow: "snøhvit", + springgreen: "vårgrønn", + steelblue: "stålblå", + tan: "matt mellombrun", + teal: "mørk grønnblå", + thistle: "lys grålilla", + tomato: "tomatrød", + transparent: "gjennomsiktig", + turquoise: "turkis", + violet: "fiolett", + wheat: "varm sienna", + white: "hvit", + whitesmoke: "røykhvit", + yellow: "gul", + yellowgreen: "gulgrønn" +}) +); diff --git a/lib/dojo/nls/nl/colors.js b/lib/dojo/nls/nl/colors.js index ae0ccbf3..6ce97506 100644 --- a/lib/dojo/nls/nl/colors.js +++ b/lib/dojo/nls/nl/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"lichtstaalblauw","orangered":"oranjerood","midnightblue":"nachtblauw","cadetblue":"donkerstaalblauw","seashell":"schelp","slategrey":"leigrijs","coral":"koraalrood","darkturquoise":"donkerturquoise","antiquewhite":"antiekwit","mediumspringgreen":"midlentegroen","salmon":"zalm","darkgrey":"donkergrijs","ivory":"ivoorwit","greenyellow":"groengeel","mistyrose":"matroze","lightsalmon":"lichtzalm","silver":"zilvergrijs","dimgrey":"dofgrijs","orange":"oranje","white":"wit","navajowhite":"navajowit","royalblue":"koningsblauw","deeppink":"donkerroze","lime":"limoen","oldlace":"kant","chartreuse":"groengeel","darkcyan":"donkercyaan","yellow":"geel","linen":"linnen","olive":"olijfgroen","gold":"goud","lawngreen":"grasgroen","lightyellow":"lichtgeel","tan":"geelbruin","darkviolet":"donkerviolet","lightslategrey":"lichtblauwgrijs","grey":"grijs","darkkhaki":"donkerkaki","green":"groen","deepskyblue":"diephemelblauw","aqua":"aqua","sienna":"sienna","mintcream":"mintroomgeel","rosybrown":"roodbruin","mediumslateblue":"midgrijsblauw","magenta":"magenta","lightseagreen":"lichtzeegroen","cyan":"cyaan","olivedrab":"grijsbruin","darkgoldenrod":"donkergoud","slateblue":"leiblauw","mediumaquamarine":"midaquamarijn","lavender":"lavendelblauw","mediumseagreen":"midzeegroen","maroon":"kastanjebruin","darkslategray":"donkerblauwgrijs","mediumturquoise":"midturquoise","ghostwhite":"spierwit","darkblue":"donkerblauw","mediumvioletred":"midvioletrood","brown":"bruin","lightgray":"lichtgrijs","sandybrown":"zandbruin","pink":"roze","firebrick":"vuursteenrood","indigo":"indigo","snow":"sneeuwwit","darkorchid":"donkerorchidee","turquoise":"turquoise","chocolate":"chocoladebruin","springgreen":"lentegroen","moccasin":"moccasin","navy":"marineblauw","lemonchiffon":"citroengeel","teal":"grijsblauw","floralwhite":"rozewit","cornflowerblue":"korenbloemblauw","paleturquoise":"bleekturquoise","purple":"purper","gainsboro":"lichtblauwgrijs","plum":"pruim","red":"rood","blue":"blauw","forestgreen":"bosgroen","darkgreen":"donkergroen","honeydew":"meloen","darkseagreen":"donkerzeegroen","lightcoral":"lichtkoraal","palevioletred":"bleekvioletrood","mediumpurple":"midpurper","saddlebrown":"leerbruin","darkmagenta":"donkermagenta","thistle":"distel","whitesmoke":"rookwit","wheat":"tarwebruin","violet":"violet","lightskyblue":"lichthemelsblauw","goldenrod":"goudbruin","mediumblue":"midblauw","skyblue":"hemelsblauw","crimson":"karmozijnrood","darksalmon":"donkerzalm","darkred":"donkerrood","darkslategrey":"donkerblauwgrijs","peru":"bruin","lightgrey":"lichtgrijs","lightgoldenrodyellow":"lichtgoudgeel","blanchedalmond":"amandel","aliceblue":"lichtblauw","bisque":"oranjegeel","slategray":"leigrijs","palegoldenrod":"bleekgeel","darkorange":"donkeroranje","aquamarine":"aquamarijn","lightgreen":"lichtgroen","burlywood":"lichtbruin","dodgerblue":"helderblauw","darkgray":"donkergrijs","lightcyan":"lichtcyaan","powderblue":"lichtblauw-wit","blueviolet":"violet","orchid":"orchidee","dimgray":"dofgrijs","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelblos","hotpink":"acaciaroze","steelblue":"staalblauw","tomato":"tomaat","lightpink":"lichtroze","limegreen":"limoengroen","indianred":"indisch rood","papayawhip":"papajaroze","lightslategray":"lichtblauwgrijs","gray":"grijs","mediumorchid":"midorchidee","cornsilk":"maïsgeel","black":"zwart","seagreen":"zeegroen","darkslateblue":"donkergrijsblauw","khaki":"kaki","lightblue":"lichtblauw","palegreen":"bleekgroen","azure":"azuur","peachpuff":"perzikroze","darkolivegreen":"donkerolijfgroen","yellowgreen":"geelgroen"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/nl/colors",({aliceblue:"lichtblauw",antiquewhite:"antiekwit",aqua:"aqua",aquamarine:"aquamarijn",azure:"azuur",beige:"beige",bisque:"oranjegeel",black:"zwart",blanchedalmond:"amandel",blue:"blauw",blueviolet:"violet",brown:"bruin",burlywood:"lichtbruin",cadetblue:"donkerstaalblauw",chartreuse:"groengeel",chocolate:"chocoladebruin",coral:"koraalrood",cornflowerblue:"korenbloemblauw",cornsilk:"maïsgeel",crimson:"karmozijnrood",cyan:"cyaan",darkblue:"donkerblauw",darkcyan:"donkercyaan",darkgoldenrod:"donkergoud",darkgray:"donkergrijs",darkgreen:"donkergroen",darkgrey:"donkergrijs",darkkhaki:"donkerkaki",darkmagenta:"donkermagenta",darkolivegreen:"donkerolijfgroen",darkorange:"donkeroranje",darkorchid:"donkerorchidee",darkred:"donkerrood",darksalmon:"donkerzalm",darkseagreen:"donkerzeegroen",darkslateblue:"donkergrijsblauw",darkslategray:"donkerblauwgrijs",darkslategrey:"donkerblauwgrijs",darkturquoise:"donkerturquoise",darkviolet:"donkerviolet",deeppink:"donkerroze",deepskyblue:"diephemelblauw",dimgray:"dofgrijs",dimgrey:"dofgrijs",dodgerblue:"helderblauw",firebrick:"vuursteenrood",floralwhite:"rozewit",forestgreen:"bosgroen",fuchsia:"fuchsia",gainsboro:"lichtblauwgrijs",ghostwhite:"spierwit",gold:"goud",goldenrod:"goudbruin",gray:"grijs",green:"groen",greenyellow:"groengeel",grey:"grijs",honeydew:"meloen",hotpink:"acaciaroze",indianred:"indisch rood",indigo:"indigo",ivory:"ivoorwit",khaki:"kaki",lavender:"lavendelblauw",lavenderblush:"lavendelblos",lawngreen:"grasgroen",lemonchiffon:"citroengeel",lightblue:"lichtblauw",lightcoral:"lichtkoraal",lightcyan:"lichtcyaan",lightgoldenrodyellow:"lichtgoudgeel",lightgray:"lichtgrijs",lightgreen:"lichtgroen",lightgrey:"lichtgrijs",lightpink:"lichtroze",lightsalmon:"lichtzalm",lightseagreen:"lichtzeegroen",lightskyblue:"lichthemelsblauw",lightslategray:"lichtblauwgrijs",lightslategrey:"lichtblauwgrijs",lightsteelblue:"lichtstaalblauw",lightyellow:"lichtgeel",lime:"limoen",limegreen:"limoengroen",linen:"linnen",magenta:"magenta",maroon:"kastanjebruin",mediumaquamarine:"midaquamarijn",mediumblue:"midblauw",mediumorchid:"midorchidee",mediumpurple:"midpurper",mediumseagreen:"midzeegroen",mediumslateblue:"midgrijsblauw",mediumspringgreen:"midlentegroen",mediumturquoise:"midturquoise",mediumvioletred:"midvioletrood",midnightblue:"nachtblauw",mintcream:"mintroomgeel",mistyrose:"matroze",moccasin:"moccasin",navajowhite:"navajowit",navy:"marineblauw",oldlace:"kant",olive:"olijfgroen",olivedrab:"grijsbruin",orange:"oranje",orangered:"oranjerood",orchid:"orchidee",palegoldenrod:"bleekgeel",palegreen:"bleekgroen",paleturquoise:"bleekturquoise",palevioletred:"bleekvioletrood",papayawhip:"papajaroze",peachpuff:"perzikroze",peru:"bruin",pink:"roze",plum:"pruim",powderblue:"lichtblauw-wit",purple:"purper",red:"rood",rosybrown:"roodbruin",royalblue:"koningsblauw",saddlebrown:"leerbruin",salmon:"zalm",sandybrown:"zandbruin",seagreen:"zeegroen",seashell:"schelp",sienna:"sienna",silver:"zilvergrijs",skyblue:"hemelsblauw",slateblue:"leiblauw",slategray:"leigrijs",slategrey:"leigrijs",snow:"sneeuwwit",springgreen:"lentegroen",steelblue:"staalblauw",tan:"geelbruin",teal:"grijsblauw",thistle:"distel",tomato:"tomaat",transparent:"transparant",turquoise:"turquoise",violet:"violet",wheat:"tarwebruin",white:"wit",whitesmoke:"rookwit",yellow:"geel",yellowgreen:"geelgroen"})); \ No newline at end of file diff --git a/lib/dojo/nls/nl/colors.js.uncompressed.js b/lib/dojo/nls/nl/colors.js.uncompressed.js new file mode 100644 index 00000000..d4fa3d98 --- /dev/null +++ b/lib/dojo/nls/nl/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/nl/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "lichtblauw", + antiquewhite: "antiekwit", + aqua: "aqua", + aquamarine: "aquamarijn", + azure: "azuur", + beige: "beige", + bisque: "oranjegeel", + black: "zwart", + blanchedalmond: "amandel", + blue: "blauw", + blueviolet: "violet", + brown: "bruin", + burlywood: "lichtbruin", + cadetblue: "donkerstaalblauw", + chartreuse: "groengeel", + chocolate: "chocoladebruin", + coral: "koraalrood", + cornflowerblue: "korenbloemblauw", + cornsilk: "maïsgeel", + crimson: "karmozijnrood", + cyan: "cyaan", + darkblue: "donkerblauw", + darkcyan: "donkercyaan", + darkgoldenrod: "donkergoud", + darkgray: "donkergrijs", + darkgreen: "donkergroen", + darkgrey: "donkergrijs", // same as darkgray + darkkhaki: "donkerkaki", + darkmagenta: "donkermagenta", + darkolivegreen: "donkerolijfgroen", + darkorange: "donkeroranje", + darkorchid: "donkerorchidee", + darkred: "donkerrood", + darksalmon: "donkerzalm", + darkseagreen: "donkerzeegroen", + darkslateblue: "donkergrijsblauw", + darkslategray: "donkerblauwgrijs", + darkslategrey: "donkerblauwgrijs", // same as darkslategray + darkturquoise: "donkerturquoise", + darkviolet: "donkerviolet", + deeppink: "donkerroze", + deepskyblue: "diephemelblauw", + dimgray: "dofgrijs", + dimgrey: "dofgrijs", // same as dimgray + dodgerblue: "helderblauw", + firebrick: "vuursteenrood", + floralwhite: "rozewit", + forestgreen: "bosgroen", + fuchsia: "fuchsia", + gainsboro: "lichtblauwgrijs", + ghostwhite: "spierwit", + gold: "goud", + goldenrod: "goudbruin", + gray: "grijs", + green: "groen", + greenyellow: "groengeel", + grey: "grijs", // same as gray + honeydew: "meloen", + hotpink: "acaciaroze", + indianred: "indisch rood", + indigo: "indigo", + ivory: "ivoorwit", + khaki: "kaki", + lavender: "lavendelblauw", + lavenderblush: "lavendelblos", + lawngreen: "grasgroen", + lemonchiffon: "citroengeel", + lightblue: "lichtblauw", + lightcoral: "lichtkoraal", + lightcyan: "lichtcyaan", + lightgoldenrodyellow: "lichtgoudgeel", + lightgray: "lichtgrijs", + lightgreen: "lichtgroen", + lightgrey: "lichtgrijs", // same as lightgray + lightpink: "lichtroze", + lightsalmon: "lichtzalm", + lightseagreen: "lichtzeegroen", + lightskyblue: "lichthemelsblauw", + lightslategray: "lichtblauwgrijs", + lightslategrey: "lichtblauwgrijs", // same as lightslategray + lightsteelblue: "lichtstaalblauw", + lightyellow: "lichtgeel", + lime: "limoen", + limegreen: "limoengroen", + linen: "linnen", + magenta: "magenta", + maroon: "kastanjebruin", + mediumaquamarine: "midaquamarijn", + mediumblue: "midblauw", + mediumorchid: "midorchidee", + mediumpurple: "midpurper", + mediumseagreen: "midzeegroen", + mediumslateblue: "midgrijsblauw", + mediumspringgreen: "midlentegroen", + mediumturquoise: "midturquoise", + mediumvioletred: "midvioletrood", + midnightblue: "nachtblauw", + mintcream: "mintroomgeel", + mistyrose: "matroze", + moccasin: "moccasin", + navajowhite: "navajowit", + navy: "marineblauw", + oldlace: "kant", + olive: "olijfgroen", + olivedrab: "grijsbruin", + orange: "oranje", + orangered: "oranjerood", + orchid: "orchidee", + palegoldenrod: "bleekgeel", + palegreen: "bleekgroen", + paleturquoise: "bleekturquoise", + palevioletred: "bleekvioletrood", + papayawhip: "papajaroze", + peachpuff: "perzikroze", + peru: "bruin", + pink: "roze", + plum: "pruim", + powderblue: "lichtblauw-wit", + purple: "purper", + red: "rood", + rosybrown: "roodbruin", + royalblue: "koningsblauw", + saddlebrown: "leerbruin", + salmon: "zalm", + sandybrown: "zandbruin", + seagreen: "zeegroen", + seashell: "schelp", + sienna: "sienna", + silver: "zilvergrijs", + skyblue: "hemelsblauw", + slateblue: "leiblauw", + slategray: "leigrijs", + slategrey: "leigrijs", // same as slategray + snow: "sneeuwwit", + springgreen: "lentegroen", + steelblue: "staalblauw", + tan: "geelbruin", + teal: "grijsblauw", + thistle: "distel", + tomato: "tomaat", + transparent: "transparant", + turquoise: "turquoise", + violet: "violet", + wheat: "tarwebruin", + white: "wit", + whitesmoke: "rookwit", + yellow: "geel", + yellowgreen: "geelgroen" +}) +); diff --git a/lib/dojo/nls/pl/colors.js b/lib/dojo/nls/pl/colors.js index 2fa71bd1..f685b495 100644 --- a/lib/dojo/nls/pl/colors.js +++ b/lib/dojo/nls/pl/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"jasnostalowoniebieski","orangered":"pomarańczowoczerwony","midnightblue":"granatowoczarny","cadetblue":"niebieskoszary","seashell":"matowoliliowy","slategrey":"mysi","coral":"koralowy","darkturquoise":"mlecznoturkusowy","antiquewhite":"biel antyczna","mediumspringgreen":"średnia wiosenna zieleń","salmon":"łososiowy","darkgrey":"ciemnoszary","ivory":"kość słoniowa","greenyellow":"zielonożółty","mistyrose":"bladoróżany","lightsalmon":"jasnołososiowy","silver":"srebrny","dimgrey":"przyciemniony szary","orange":"pomarańczowy","white":"biały","navajowhite":"piaskowy","royalblue":"królewski błękit","deeppink":"głęboki różowy","lime":"limonkowy","oldlace":"bladopomarańczowy","chartreuse":"żółtooliwkowy","darkcyan":"ciemnoniebieskozielony","yellow":"żółty","linen":"lniany","olive":"oliwkowy","gold":"złoty","lawngreen":"trawiasty","lightyellow":"jasnożółty","tan":"śniady","darkviolet":"ciemnofiołkowy","lightslategrey":"jasny mysi","grey":"szary","darkkhaki":"ciemny khaki","green":"zielony","deepskyblue":"intensywny błękit nieba","aqua":"morski","sienna":"siena","mintcream":"jasnomiętowy","rosybrown":"różowobrązowy","mediumslateblue":"średni gołębi","magenta":"amarantowy","lightseagreen":"jasna zieleń morska","cyan":"niebieskozielony","olivedrab":"oliwkowa zieleń","darkgoldenrod":"ciemne stare złoto","slateblue":"gołębi","mediumaquamarine":"średnia akwamaryna","lavender":"lawendowy","mediumseagreen":"średnia zieleń morska","maroon":"kasztanowy","darkslategray":"ciemny mysi","mediumturquoise":"średni turkusowy","ghostwhite":"bladobiały","darkblue":"ciemnoniebieski","mediumvioletred":"średni fiołkowowoczerwony","brown":"brązowy","lightgray":"jasnoszary","sandybrown":"piaskowy brąz","pink":"różowy","firebrick":"ceglasty","indigo":"indygo","snow":"śnieżny","darkorchid":"ciemna orchidea","turquoise":"turkusowy","chocolate":"czekoladowy","springgreen":"wiosenna zieleń","moccasin":"mokasynowy","navy":"granatowy","lemonchiffon":"cytrynowy","teal":"zielonomodry","floralwhite":"kwiatowa biel","cornflowerblue":"chabrowy","paleturquoise":"bladoturkusowy","purple":"fioletowy","gainsboro":"bladoszary","plum":"śliwkowy","red":"czerwony","blue":"niebieski","forestgreen":"leśna zieleń","darkgreen":"ciemnozielony","honeydew":"miodowy","darkseagreen":"ciemna zieleń morska","lightcoral":"jasnokoralowy","palevioletred":"blady fiołkowoczerwony","mediumpurple":"średni fioletowy","saddlebrown":"brąz skórzany","darkmagenta":"ciemnoamarantowy","thistle":"bladofioletowy","whitesmoke":"przydymiony biały","wheat":"pszeniczny","violet":"fiołkowy","lightskyblue":"jasny błękit nieba","goldenrod":"stare złoto","mediumblue":"ciemnochabrowy","skyblue":"błękit nieba","crimson":"karmazynowy","darksalmon":"ciemnołososiowy","darkred":"ciemnoczerwony","darkslategrey":"ciemny mysi","peru":"jasnobrązowy","lightgrey":"jasnoszary","lightgoldenrodyellow":"jasnożółte stare złoto","blanchedalmond":"migdałowy","aliceblue":"bladoniebieski","bisque":"biszkoptowy","slategray":"mysi","palegoldenrod":"blade stare złoto","darkorange":"ciemnopomarańczowy","aquamarine":"akwamaryna","lightgreen":"jasnozielony","burlywood":"kolor drewna","dodgerblue":"błękit Dodgers","darkgray":"ciemnoszary","lightcyan":"jasnoniebieskozielony","powderblue":"jasnobladobłękitny","blueviolet":"błękitnofiołkowy","orchid":"orchidea","dimgray":"przyciemniony szary","beige":"beżowy","fuchsia":"fuksjowy","lavenderblush":"lawendowocielisty","hotpink":"odblaskoworóżowy","steelblue":"stalowoniebieski","tomato":"pomidorowy","lightpink":"jasnoróżowy","limegreen":"zielony limonkowy","indianred":"kasztanowy","papayawhip":"papaja","lightslategray":"jasny mysi","gray":"szary","mediumorchid":"średnia orchidea","cornsilk":"kukurydziany","black":"czarny","seagreen":"zieleń morska","darkslateblue":"ciemny gołębi","khaki":"khaki","lightblue":"jasnoniebieski","palegreen":"bladozielony","azure":"lazurowy","peachpuff":"brzoskwiniowy","darkolivegreen":"ciemnooliwkowy","yellowgreen":"żółtozielony"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/pl/colors",({aliceblue:"bladoniebieski",antiquewhite:"biel antyczna",aqua:"morski",aquamarine:"akwamaryna",azure:"lazurowy",beige:"beżowy",bisque:"cielistobeżowy",black:"czarny",blanchedalmond:"obrany migdał",blue:"niebieski",blueviolet:"błękitnofiołkowy",brown:"brązowy",burlywood:"piaskowobeżowy",cadetblue:"szaroniebieski",chartreuse:"żółtooliwkowy",chocolate:"czekoladowy",coral:"koralowy",cornflowerblue:"niebieskochabrowy",cornsilk:"białożółty",crimson:"karmazynowy",cyan:"niebieskozielony",darkblue:"ciemnoniebieski",darkcyan:"ciemnoniebieskozielony",darkgoldenrod:"ciemne stare złoto",darkgray:"ciemnoszary",darkgreen:"ciemnozielony",darkgrey:"ciemnoszary",darkkhaki:"ciemny khaki",darkmagenta:"ciemnoamarantowy",darkolivegreen:"ciemnooliwkowozielony",darkorange:"ciemnopomarańczowy",darkorchid:"ciemna orchidea",darkred:"ciemnoczerwony",darksalmon:"ciemnołososiowy",darkseagreen:"ciemna zieleń morska",darkslateblue:"ciemny gołębi",darkslategray:"ciemny mysi",darkslategrey:"ciemny mysi",darkturquoise:"ciemnoturkusowy",darkviolet:"ciemnofiołkowy",deeppink:"głęboki róż",deepskyblue:"intensywny błękit nieba",dimgray:"przyciemniony szary",dimgrey:"przyciemniony szary",dodgerblue:"niebieski Dodgersów",firebrick:"podpalana cegła",floralwhite:"złamana biel",forestgreen:"leśna zieleń",fuchsia:"fuksjowy",gainsboro:"jasnoniebieskawoszary",ghostwhite:"sina biel",gold:"złoty",goldenrod:"stare złoto",gray:"szary",green:"zielony",greenyellow:"zielonożółty",grey:"szary",honeydew:"miodowy",hotpink:"odblaskoworóżowy",indianred:"kasztanowy",indigo:"indygo",ivory:"kość słoniowa",khaki:"khaki",lavender:"lawendowy",lavenderblush:"lawendoworóżowy",lawngreen:"trawiasty",lemonchiffon:"babka cytrynowa",lightblue:"jasnoniebieski",lightcoral:"jasnokoralowy",lightcyan:"jasnoniebieskozielony",lightgoldenrodyellow:"jasne stare złoto",lightgray:"jasnoszary",lightgreen:"jasnozielony",lightgrey:"jasnoszary",lightpink:"jasnoróżowy",lightsalmon:"jasnołososiowy",lightseagreen:"jasna zieleń morska",lightskyblue:"jasny błękit nieba",lightslategray:"jasny mysi",lightslategrey:"jasny mysi",lightsteelblue:"jasnostalowoniebieski",lightyellow:"jasnożółty",lime:"limonkowy",limegreen:"limonkowozielony",linen:"lniany",magenta:"amarantowy",maroon:"rdzawoczerwony",mediumaquamarine:"średnia akwamaryna",mediumblue:"średni niebieski",mediumorchid:"średnia orchidea",mediumpurple:"średni fioletowy",mediumseagreen:"średnia zieleń morska",mediumslateblue:"średni gołębi",mediumspringgreen:"średnia wiosenna zieleń",mediumturquoise:"średni turkusowy",mediumvioletred:"średni fiołkowowoczerwony",midnightblue:"atramentowoniebieski",mintcream:"miętowokremowy",mistyrose:"mglistoróżany",moccasin:"mokasynowy",navajowhite:"biel Nawaho",navy:"granatowy",oldlace:"ecru",olive:"oliwkowy",olivedrab:"oliwkowozielony",orange:"pomarańczowy",orangered:"czerwona pomarańcza",orchid:"orchidea",palegoldenrod:"blade stare złoto",palegreen:"bladozielony",paleturquoise:"bladoturkusowy",palevioletred:"bladofiołkowoczerwony",papayawhip:"kremowa papaja",peachpuff:"cielisty brzoskwiniowy",peru:"palona glina",pink:"różowy",plum:"śliwkowy",powderblue:"jasnobladobłękitny",purple:"fioletowy",red:"czerwony",rosybrown:"różanobrązowy",royalblue:"królewska purpura",saddlebrown:"brąz skórzany",salmon:"łososiowy",sandybrown:"piaskowobrązowy",seagreen:"zieleń morska",seashell:"matowoliliowy",sienna:"sjena",silver:"srebrny",skyblue:"błękit nieba",slateblue:"gołębi",slategray:"mysi",slategrey:"mysi",snow:"śnieżny",springgreen:"wiosenna zieleń",steelblue:"stalowoniebieski",tan:"śniady",teal:"zielonomodry",thistle:"kwiat ostu",tomato:"pomidorowy",transparent:"przezroczysty",turquoise:"turkusowy",violet:"fiołkowy",wheat:"pszeniczny",white:"biały",whitesmoke:"siwy",yellow:"żółty",yellowgreen:"żółtozielony"})); \ No newline at end of file diff --git a/lib/dojo/nls/pl/colors.js.uncompressed.js b/lib/dojo/nls/pl/colors.js.uncompressed.js new file mode 100644 index 00000000..ad95f626 --- /dev/null +++ b/lib/dojo/nls/pl/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/pl/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "bladoniebieski", + antiquewhite: "biel antyczna", + aqua: "morski", + aquamarine: "akwamaryna", + azure: "lazurowy", + beige: "beżowy", + bisque: "cielistobeżowy", + black: "czarny", + blanchedalmond: "obrany migdał", + blue: "niebieski", + blueviolet: "błękitnofiołkowy", + brown: "brązowy", + burlywood: "piaskowobeżowy", + cadetblue: "szaroniebieski", + chartreuse: "żółtooliwkowy", + chocolate: "czekoladowy", + coral: "koralowy", + cornflowerblue: "niebieskochabrowy", + cornsilk: "białożółty", + crimson: "karmazynowy", + cyan: "niebieskozielony", + darkblue: "ciemnoniebieski", + darkcyan: "ciemnoniebieskozielony", + darkgoldenrod: "ciemne stare złoto", + darkgray: "ciemnoszary", + darkgreen: "ciemnozielony", + darkgrey: "ciemnoszary", // same as darkgray + darkkhaki: "ciemny khaki", + darkmagenta: "ciemnoamarantowy", + darkolivegreen: "ciemnooliwkowozielony", + darkorange: "ciemnopomarańczowy", + darkorchid: "ciemna orchidea", + darkred: "ciemnoczerwony", + darksalmon: "ciemnołososiowy", + darkseagreen: "ciemna zieleń morska", + darkslateblue: "ciemny gołębi", + darkslategray: "ciemny mysi", + darkslategrey: "ciemny mysi", // same as darkslategray + darkturquoise: "ciemnoturkusowy", + darkviolet: "ciemnofiołkowy", + deeppink: "głęboki róż", + deepskyblue: "intensywny błękit nieba", + dimgray: "przyciemniony szary", + dimgrey: "przyciemniony szary", // same as dimgray + dodgerblue: "niebieski Dodgersów", + firebrick: "podpalana cegła", + floralwhite: "złamana biel", + forestgreen: "leśna zieleń", + fuchsia: "fuksjowy", + gainsboro: "jasnoniebieskawoszary", + ghostwhite: "sina biel", + gold: "złoty", + goldenrod: "stare złoto", + gray: "szary", + green: "zielony", + greenyellow: "zielonożółty", + grey: "szary", // same as gray + honeydew: "miodowy", + hotpink: "odblaskoworóżowy", + indianred: "kasztanowy", + indigo: "indygo", + ivory: "kość słoniowa", + khaki: "khaki", + lavender: "lawendowy", + lavenderblush: "lawendoworóżowy", + lawngreen: "trawiasty", + lemonchiffon: "babka cytrynowa", + lightblue: "jasnoniebieski", + lightcoral: "jasnokoralowy", + lightcyan: "jasnoniebieskozielony", + lightgoldenrodyellow: "jasne stare złoto", + lightgray: "jasnoszary", + lightgreen: "jasnozielony", + lightgrey: "jasnoszary", // same as lightgray + lightpink: "jasnoróżowy", + lightsalmon: "jasnołososiowy", + lightseagreen: "jasna zieleń morska", + lightskyblue: "jasny błękit nieba", + lightslategray: "jasny mysi", + lightslategrey: "jasny mysi", // same as lightslategray + lightsteelblue: "jasnostalowoniebieski", + lightyellow: "jasnożółty", + lime: "limonkowy", + limegreen: "limonkowozielony", + linen: "lniany", + magenta: "amarantowy", + maroon: "rdzawoczerwony", + mediumaquamarine: "średnia akwamaryna", + mediumblue: "średni niebieski", + mediumorchid: "średnia orchidea", + mediumpurple: "średni fioletowy", + mediumseagreen: "średnia zieleń morska", + mediumslateblue: "średni gołębi", + mediumspringgreen: "średnia wiosenna zieleń", + mediumturquoise: "średni turkusowy", + mediumvioletred: "średni fiołkowowoczerwony", + midnightblue: "atramentowoniebieski", + mintcream: "miętowokremowy", + mistyrose: "mglistoróżany", + moccasin: "mokasynowy", + navajowhite: "biel Nawaho", + navy: "granatowy", + oldlace: "ecru", + olive: "oliwkowy", + olivedrab: "oliwkowozielony", + orange: "pomarańczowy", + orangered: "czerwona pomarańcza", + orchid: "orchidea", + palegoldenrod: "blade stare złoto", + palegreen: "bladozielony", + paleturquoise: "bladoturkusowy", + palevioletred: "bladofiołkowoczerwony", + papayawhip: "kremowa papaja", + peachpuff: "cielisty brzoskwiniowy", + peru: "palona glina", + pink: "różowy", + plum: "śliwkowy", + powderblue: "jasnobladobłękitny", + purple: "fioletowy", + red: "czerwony", + rosybrown: "różanobrązowy", + royalblue: "królewska purpura", + saddlebrown: "brąz skórzany", + salmon: "łososiowy", + sandybrown: "piaskowobrązowy", + seagreen: "zieleń morska", + seashell: "matowoliliowy", + sienna: "sjena", + silver: "srebrny", + skyblue: "błękit nieba", + slateblue: "gołębi", + slategray: "mysi", + slategrey: "mysi", // same as slategray + snow: "śnieżny", + springgreen: "wiosenna zieleń", + steelblue: "stalowoniebieski", + tan: "śniady", + teal: "zielonomodry", + thistle: "kwiat ostu", + tomato: "pomidorowy", + transparent: "przezroczysty", + turquoise: "turkusowy", + violet: "fiołkowy", + wheat: "pszeniczny", + white: "biały", + whitesmoke: "siwy", + yellow: "żółty", + yellowgreen: "żółtozielony" +}) +); diff --git a/lib/dojo/nls/pt-pt/colors.js b/lib/dojo/nls/pt-pt/colors.js index 5038b537..484fe5b0 100644 --- a/lib/dojo/nls/pt-pt/colors.js +++ b/lib/dojo/nls/pt-pt/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"azul-aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadete","seashell":"concha","slategrey":"cinzento ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","salmon":"salmão","darkgrey":"cinzento escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa pálido","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinzento esbatido","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul real","deeppink":"rosa profundo","lime":"lima","oldlace":"renda antiga","chartreuse":"amarelo esverdeado","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"azeitona","gold":"dourado","lawngreen":"verde relva","lightyellow":"amarelo claro","tan":"castanho claro","darkviolet":"violeta escuro","lightslategrey":"cinzento ardósia claro","grey":"cinzento","darkkhaki":"caqui escuro","green":"verde","deepskyblue":"azul céu profundo","aqua":"verde-água","sienna":"castanho-avermelhado","mintcream":"creme de menta","rosybrown":"castanho rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"azeitona claro","darkgoldenrod":"ouro velho escuro","slateblue":"azul ardósia","mediumaquamarine":"verde-azulado médio","lavender":"alfazema","mediumseagreen":"verde marinho médio","maroon":"bordeaux","darkslategray":"cinzento ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco sombreado","darkblue":"azul escuro","mediumvioletred":"violeta avermelhado médio","brown":"castanho","lightgray":"cinzento claro","sandybrown":"castanho areia","pink":"rosa","firebrick":"tijolo fogo","indigo":"índigo","snow":"branco-neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"mocassim","navy":"azul marinho","lemonchiffon":"limão chiffon","teal":"verde-azulado","floralwhite":"branco floral","cornflowerblue":"azul-violáceo","paleturquoise":"turquesa pálido","purple":"roxo","gainsboro":"cinzento azulado claro","plum":"cor-de-ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"mel","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"violeta avermelhado pálido","mediumpurple":"roxo médio","saddlebrown":"castanho sela","darkmagenta":"magenta escuro","thistle":"cardo","whitesmoke":"fumo branco","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"ouro velho","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinzento ardósia escuro","peru":"peru","lightgrey":"cinzento claro","lightgoldenrodyellow":"ouro velho amarelado claro","blanchedalmond":"amêndoa claro","aliceblue":"azul alice","bisque":"rosa-velho","slategray":"cinzento ardósia","palegoldenrod":"ouro velho pálido","darkorange":"laranja escuro","aquamarine":"verde-azulado","lightgreen":"verde claro","burlywood":"castanho pinho","dodgerblue":"azul furtivo","darkgray":"cinzento escuro","lightcyan":"ciano claro","powderblue":"azul de esmalte","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinzento esbatido","beige":"bege","fuchsia":"fúcsia","lavenderblush":"alfazema rosado","hotpink":"rosa forte","steelblue":"azul-aço","tomato":"vermelho tomate","lightpink":"rosa claro","limegreen":"verde-lima","indianred":"almagre","papayawhip":"creme de papaia","lightslategray":"cinzento ardósia claro","gray":"cinzento","mediumorchid":"orquídea médio","cornsilk":"branco seda","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"azul-celeste","peachpuff":"pêssego","darkolivegreen":"verde-azeitona escuro","yellowgreen":"verde amarelado"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/pt-pt/colors",({aliceblue:"azul alice",antiquewhite:"branco antigo",aqua:"verde-água",aquamarine:"verde-azulado",azure:"azul-celeste",beige:"bege",bisque:"rosa-velho",black:"preto",blanchedalmond:"amêndoa claro",blue:"azul",blueviolet:"azul violeta",brown:"castanho",burlywood:"castanho pinho",cadetblue:"azul cadete",chartreuse:"amarelo esverdeado",chocolate:"chocolate",coral:"coral",cornflowerblue:"azul-violáceo",cornsilk:"branco seda",crimson:"carmesim",cyan:"ciano",darkblue:"azul escuro",darkcyan:"ciano escuro",darkgoldenrod:"ouro velho escuro",darkgray:"cinzento escuro",darkgreen:"verde escuro",darkgrey:"cinzento escuro",darkkhaki:"caqui escuro",darkmagenta:"magenta escuro",darkolivegreen:"verde-azeitona escuro",darkorange:"laranja escuro",darkorchid:"orquídea escuro",darkred:"vermelho escuro",darksalmon:"salmão escuro",darkseagreen:"verde marinho escuro",darkslateblue:"azul ardósia escuro",darkslategray:"cinzento ardósia escuro",darkslategrey:"cinzento ardósia escuro",darkturquoise:"turquesa escuro",darkviolet:"violeta escuro",deeppink:"rosa profundo",deepskyblue:"azul céu profundo",dimgray:"cinzento esbatido",dimgrey:"cinzento esbatido",dodgerblue:"azul furtivo",firebrick:"tijolo fogo",floralwhite:"branco floral",forestgreen:"verde floresta",fuchsia:"fúcsia",gainsboro:"cinzento azulado claro",ghostwhite:"branco sombreado",gold:"dourado",goldenrod:"ouro velho",gray:"cinzento",green:"verde",greenyellow:"amarelo esverdeado",grey:"cinzento",honeydew:"mel",hotpink:"rosa forte",indianred:"almagre",indigo:"índigo",ivory:"marfim",khaki:"caqui",lavender:"alfazema",lavenderblush:"alfazema rosado",lawngreen:"verde relva",lemonchiffon:"limão chiffon",lightblue:"azul claro",lightcoral:"coral claro",lightcyan:"ciano claro",lightgoldenrodyellow:"ouro velho amarelado claro",lightgray:"cinzento claro",lightgreen:"verde claro",lightgrey:"cinzento claro",lightpink:"rosa claro",lightsalmon:"salmão claro",lightseagreen:"verde marinho claro",lightskyblue:"azul céu claro",lightslategray:"cinzento ardósia claro",lightslategrey:"cinzento ardósia claro",lightsteelblue:"azul-aço claro",lightyellow:"amarelo claro",lime:"lima",limegreen:"verde-lima",linen:"linho",magenta:"magenta",maroon:"bordeaux",mediumaquamarine:"verde-azulado médio",mediumblue:"azul médio",mediumorchid:"orquídea médio",mediumpurple:"roxo médio",mediumseagreen:"verde marinho médio",mediumslateblue:"azul ardósia médio",mediumspringgreen:"verde primavera médio",mediumturquoise:"turquesa médio",mediumvioletred:"violeta avermelhado médio",midnightblue:"azul meia-noite",mintcream:"creme de menta",mistyrose:"rosa pálido",moccasin:"mocassim",navajowhite:"branco navajo",navy:"azul marinho",oldlace:"renda antiga",olive:"azeitona",olivedrab:"azeitona claro",orange:"laranja",orangered:"vermelho alaranjado",orchid:"orquídea",palegoldenrod:"ouro velho pálido",palegreen:"verde pálido",paleturquoise:"turquesa pálido",palevioletred:"violeta avermelhado pálido",papayawhip:"creme de papaia",peachpuff:"pêssego",peru:"peru",pink:"rosa",plum:"cor-de-ameixa",powderblue:"azul de esmalte",purple:"roxo",red:"vermelho",rosybrown:"castanho rosado",royalblue:"azul real",saddlebrown:"castanho sela",salmon:"salmão",sandybrown:"castanho areia",seagreen:"verde marinho",seashell:"concha",sienna:"castanho-avermelhado",silver:"prateado",skyblue:"azul céu",slateblue:"azul ardósia",slategray:"cinzento ardósia",slategrey:"cinzento ardósia",snow:"branco-neve",springgreen:"verde primavera",steelblue:"azul-aço",tan:"castanho claro",teal:"verde-azulado",thistle:"cardo",tomato:"vermelho tomate",transparent:"transparente",turquoise:"turquesa",violet:"violeta",wheat:"trigo",white:"branco",whitesmoke:"fumo branco",yellow:"amarelo",yellowgreen:"verde amarelado"})); \ No newline at end of file diff --git a/lib/dojo/nls/pt-pt/colors.js.uncompressed.js b/lib/dojo/nls/pt-pt/colors.js.uncompressed.js new file mode 100644 index 00000000..542b7a10 --- /dev/null +++ b/lib/dojo/nls/pt-pt/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/pt-pt/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "azul alice", + antiquewhite: "branco antigo", + aqua: "verde-água", + aquamarine: "verde-azulado", + azure: "azul-celeste", + beige: "bege", + bisque: "rosa-velho", + black: "preto", + blanchedalmond: "amêndoa claro", + blue: "azul", + blueviolet: "azul violeta", + brown: "castanho", + burlywood: "castanho pinho", + cadetblue: "azul cadete", + chartreuse: "amarelo esverdeado", + chocolate: "chocolate", + coral: "coral", + cornflowerblue: "azul-violáceo", + cornsilk: "branco seda", + crimson: "carmesim", + cyan: "ciano", + darkblue: "azul escuro", + darkcyan: "ciano escuro", + darkgoldenrod: "ouro velho escuro", + darkgray: "cinzento escuro", + darkgreen: "verde escuro", + darkgrey: "cinzento escuro", // same as darkgray + darkkhaki: "caqui escuro", + darkmagenta: "magenta escuro", + darkolivegreen: "verde-azeitona escuro", + darkorange: "laranja escuro", + darkorchid: "orquídea escuro", + darkred: "vermelho escuro", + darksalmon: "salmão escuro", + darkseagreen: "verde marinho escuro", + darkslateblue: "azul ardósia escuro", + darkslategray: "cinzento ardósia escuro", + darkslategrey: "cinzento ardósia escuro", // same as darkslategray + darkturquoise: "turquesa escuro", + darkviolet: "violeta escuro", + deeppink: "rosa profundo", + deepskyblue: "azul céu profundo", + dimgray: "cinzento esbatido", + dimgrey: "cinzento esbatido", // same as dimgray + dodgerblue: "azul furtivo", + firebrick: "tijolo fogo", + floralwhite: "branco floral", + forestgreen: "verde floresta", + fuchsia: "fúcsia", + gainsboro: "cinzento azulado claro", + ghostwhite: "branco sombreado", + gold: "dourado", + goldenrod: "ouro velho", + gray: "cinzento", + green: "verde", + greenyellow: "amarelo esverdeado", + grey: "cinzento", // same as gray + honeydew: "mel", + hotpink: "rosa forte", + indianred: "almagre", + indigo: "índigo", + ivory: "marfim", + khaki: "caqui", + lavender: "alfazema", + lavenderblush: "alfazema rosado", + lawngreen: "verde relva", + lemonchiffon: "limão chiffon", + lightblue: "azul claro", + lightcoral: "coral claro", + lightcyan: "ciano claro", + lightgoldenrodyellow: "ouro velho amarelado claro", + lightgray: "cinzento claro", + lightgreen: "verde claro", + lightgrey: "cinzento claro", // same as lightgray + lightpink: "rosa claro", + lightsalmon: "salmão claro", + lightseagreen: "verde marinho claro", + lightskyblue: "azul céu claro", + lightslategray: "cinzento ardósia claro", + lightslategrey: "cinzento ardósia claro", // same as lightslategray + lightsteelblue: "azul-aço claro", + lightyellow: "amarelo claro", + lime: "lima", + limegreen: "verde-lima", + linen: "linho", + magenta: "magenta", + maroon: "bordeaux", + mediumaquamarine: "verde-azulado médio", + mediumblue: "azul médio", + mediumorchid: "orquídea médio", + mediumpurple: "roxo médio", + mediumseagreen: "verde marinho médio", + mediumslateblue: "azul ardósia médio", + mediumspringgreen: "verde primavera médio", + mediumturquoise: "turquesa médio", + mediumvioletred: "violeta avermelhado médio", + midnightblue: "azul meia-noite", + mintcream: "creme de menta", + mistyrose: "rosa pálido", + moccasin: "mocassim", + navajowhite: "branco navajo", + navy: "azul marinho", + oldlace: "renda antiga", + olive: "azeitona", + olivedrab: "azeitona claro", + orange: "laranja", + orangered: "vermelho alaranjado", + orchid: "orquídea", + palegoldenrod: "ouro velho pálido", + palegreen: "verde pálido", + paleturquoise: "turquesa pálido", + palevioletred: "violeta avermelhado pálido", + papayawhip: "creme de papaia", + peachpuff: "pêssego", + peru: "peru", + pink: "rosa", + plum: "cor-de-ameixa", + powderblue: "azul de esmalte", + purple: "roxo", + red: "vermelho", + rosybrown: "castanho rosado", + royalblue: "azul real", + saddlebrown: "castanho sela", + salmon: "salmão", + sandybrown: "castanho areia", + seagreen: "verde marinho", + seashell: "concha", + sienna: "castanho-avermelhado", + silver: "prateado", + skyblue: "azul céu", + slateblue: "azul ardósia", + slategray: "cinzento ardósia", + slategrey: "cinzento ardósia", // same as slategray + snow: "branco-neve", + springgreen: "verde primavera", + steelblue: "azul-aço", + tan: "castanho claro", + teal: "verde-azulado", + thistle: "cardo", + tomato: "vermelho tomate", + transparent: "transparente", + turquoise: "turquesa", + violet: "violeta", + wheat: "trigo", + white: "branco", + whitesmoke: "fumo branco", + yellow: "amarelo", + yellowgreen: "verde amarelado" +}) +); diff --git a/lib/dojo/nls/pt/colors.js b/lib/dojo/nls/pt/colors.js index 0695a0ff..71c34682 100644 --- a/lib/dojo/nls/pt/colors.js +++ b/lib/dojo/nls/pt/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"azul aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadet","seashell":"seashell","slategrey":"cinza ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","salmon":"salmão","darkgrey":"cinza escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa enevoado","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinza turvo","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul royal","deeppink":"rosa profundo","lime":"lima","oldlace":"cadarço velho","chartreuse":"chartreuse","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"oliva","gold":"dourado","lawngreen":"verde grama","lightyellow":"amarelo claro","tan":"tan","darkviolet":"violeta escuro","lightslategrey":"cinza ardósia claro","grey":"cinza","darkkhaki":"cáqui escuro","green":"verde","deepskyblue":"azul céu intenso","aqua":"aqua","sienna":"sienna","mintcream":"creme de menta","rosybrown":"marrom rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"verde oliva","darkgoldenrod":"goldenrod escuro","slateblue":"azul ardósia","mediumaquamarine":"água marinha médio","lavender":"lavanda","mediumseagreen":"verde marinho médio","maroon":"castanho","darkslategray":"cinza ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco ghost","darkblue":"azul escuro","mediumvioletred":"vermelho violeta médio","brown":"marrom","lightgray":"cinza claro","sandybrown":"marrom cor de areia","pink":"rosa","firebrick":"firebrick","indigo":"índigo","snow":"branco neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"moccasin","navy":"marinho","lemonchiffon":"limão chiffon","teal":"azul esverdeado","floralwhite":"branco floral","cornflowerblue":"azul centaurea","paleturquoise":"turquesa esbranquiçado","purple":"roxo","gainsboro":"gainsboro","plum":"ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"honeydew","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"vermelho violeta esbranquiçado","mediumpurple":"roxo médio","saddlebrown":"marrom saddle","darkmagenta":"magenta escuro","thistle":"thistle","whitesmoke":"fumaça branca","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"goldenrod","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinza ardósia escuro","peru":"peru","lightgrey":"cinza claro","lightgoldenrodyellow":"amarelo goldenrod claro","blanchedalmond":"amêndoa pelada","aliceblue":"azul alice","bisque":"bisque","slategray":"cinza ardósia","palegoldenrod":"goldenrod esbranquiçado","darkorange":"laranja escuro","aquamarine":"água marinha","lightgreen":"verde claro","burlywood":"burlywood","dodgerblue":"azul dodger","darkgray":"cinza escuro","lightcyan":"ciano claro","powderblue":"azul talco","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinza turvo","beige":"bege","fuchsia":"fúcsia","lavenderblush":"lavanda avermelhada","hotpink":"rosa quente","steelblue":"azul aço","tomato":"tomate","lightpink":"rosa claro","limegreen":"verde lima","indianred":"vermelho indiano","papayawhip":"creme de papaya","lightslategray":"cinza ardósia claro","gray":"cinza","mediumorchid":"orquídea médio","cornsilk":"cornsilk","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"cáqui","lightblue":"azul claro","palegreen":"verde esbranquiçado","azure":"azul celeste","peachpuff":"peach puff","darkolivegreen":"verde oliva escuro","yellowgreen":"verde amarelado"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/pt/colors",({aliceblue:"azul alice",antiquewhite:"branco antigo",aqua:"aqua",aquamarine:"água marinha",azure:"azul celeste",beige:"bege",bisque:"bisque",black:"preto",blanchedalmond:"amêndoa pelada",blue:"azul",blueviolet:"azul violeta",brown:"marrom",burlywood:"burlywood",cadetblue:"azul cadet",chartreuse:"chartreuse",chocolate:"chocolate",coral:"coral",cornflowerblue:"azul centaurea",cornsilk:"cornsilk",crimson:"carmesim",cyan:"ciano",darkblue:"azul escuro",darkcyan:"ciano escuro",darkgoldenrod:"goldenrod escuro",darkgray:"cinza escuro",darkgreen:"verde escuro",darkgrey:"cinza escuro",darkkhaki:"cáqui escuro",darkmagenta:"magenta escuro",darkolivegreen:"verde oliva escuro",darkorange:"laranja escuro",darkorchid:"orquídea escuro",darkred:"vermelho escuro",darksalmon:"salmão escuro",darkseagreen:"verde marinho escuro",darkslateblue:"azul ardósia escuro",darkslategray:"cinza ardósia escuro",darkslategrey:"cinza ardósia escuro",darkturquoise:"turquesa escuro",darkviolet:"violeta escuro",deeppink:"rosa profundo",deepskyblue:"azul céu intenso",dimgray:"cinza turvo",dimgrey:"cinza turvo",dodgerblue:"azul dodger",firebrick:"firebrick",floralwhite:"branco floral",forestgreen:"verde floresta",fuchsia:"fúcsia",gainsboro:"gainsboro",ghostwhite:"branco ghost",gold:"dourado",goldenrod:"goldenrod",gray:"cinza",green:"verde",greenyellow:"amarelo esverdeado",grey:"cinza",honeydew:"honeydew",hotpink:"rosa quente",indianred:"vermelho indiano",indigo:"índigo",ivory:"marfim",khaki:"cáqui",lavender:"lavanda",lavenderblush:"lavanda avermelhada",lawngreen:"verde grama",lemonchiffon:"limão chiffon",lightblue:"azul claro",lightcoral:"coral claro",lightcyan:"ciano claro",lightgoldenrodyellow:"amarelo goldenrod claro",lightgray:"cinza claro",lightgreen:"verde claro",lightgrey:"cinza claro",lightpink:"rosa claro",lightsalmon:"salmão claro",lightseagreen:"verde marinho claro",lightskyblue:"azul céu claro",lightslategray:"cinza ardósia claro",lightslategrey:"cinza ardósia claro",lightsteelblue:"azul aço claro",lightyellow:"amarelo claro",lime:"lima",limegreen:"verde lima",linen:"linho",magenta:"magenta",maroon:"castanho",mediumaquamarine:"água marinha médio",mediumblue:"azul médio",mediumorchid:"orquídea médio",mediumpurple:"roxo médio",mediumseagreen:"verde marinho médio",mediumslateblue:"azul ardósia médio",mediumspringgreen:"verde primavera médio",mediumturquoise:"turquesa médio",mediumvioletred:"vermelho violeta médio",midnightblue:"azul meia-noite",mintcream:"creme de menta",mistyrose:"rosa enevoado",moccasin:"moccasin",navajowhite:"branco navajo",navy:"marinho",oldlace:"cadarço velho",olive:"oliva",olivedrab:"verde oliva",orange:"laranja",orangered:"vermelho alaranjado",orchid:"orquídea",palegoldenrod:"goldenrod esbranquiçado",palegreen:"verde esbranquiçado",paleturquoise:"turquesa esbranquiçado",palevioletred:"vermelho violeta esbranquiçado",papayawhip:"creme de papaya",peachpuff:"peach puff",peru:"peru",pink:"rosa",plum:"ameixa",powderblue:"azul talco",purple:"roxo",red:"vermelho",rosybrown:"marrom rosado",royalblue:"azul royal",saddlebrown:"marrom saddle",salmon:"salmão",sandybrown:"marrom cor de areia",seagreen:"verde marinho",seashell:"seashell",sienna:"sienna",silver:"prateado",skyblue:"azul céu",slateblue:"azul ardósia",slategray:"cinza ardósia",slategrey:"cinza ardósia",snow:"branco neve",springgreen:"verde primavera",steelblue:"azul aço",tan:"tan",teal:"azul esverdeado",thistle:"thistle",tomato:"tomate",transparent:"transparente",turquoise:"turquesa",violet:"violeta",wheat:"trigo",white:"branco",whitesmoke:"fumaça branca",yellow:"amarelo",yellowgreen:"verde amarelado"})); \ No newline at end of file diff --git a/lib/dojo/nls/pt/colors.js.uncompressed.js b/lib/dojo/nls/pt/colors.js.uncompressed.js new file mode 100644 index 00000000..02893b56 --- /dev/null +++ b/lib/dojo/nls/pt/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/pt/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "azul alice", + antiquewhite: "branco antigo", + aqua: "aqua", + aquamarine: "água marinha", + azure: "azul celeste", + beige: "bege", + bisque: "bisque", + black: "preto", + blanchedalmond: "amêndoa pelada", + blue: "azul", + blueviolet: "azul violeta", + brown: "marrom", + burlywood: "burlywood", + cadetblue: "azul cadet", + chartreuse: "chartreuse", + chocolate: "chocolate", + coral: "coral", + cornflowerblue: "azul centaurea", + cornsilk: "cornsilk", + crimson: "carmesim", + cyan: "ciano", + darkblue: "azul escuro", + darkcyan: "ciano escuro", + darkgoldenrod: "goldenrod escuro", + darkgray: "cinza escuro", + darkgreen: "verde escuro", + darkgrey: "cinza escuro", // same as darkgray + darkkhaki: "cáqui escuro", + darkmagenta: "magenta escuro", + darkolivegreen: "verde oliva escuro", + darkorange: "laranja escuro", + darkorchid: "orquídea escuro", + darkred: "vermelho escuro", + darksalmon: "salmão escuro", + darkseagreen: "verde marinho escuro", + darkslateblue: "azul ardósia escuro", + darkslategray: "cinza ardósia escuro", + darkslategrey: "cinza ardósia escuro", // same as darkslategray + darkturquoise: "turquesa escuro", + darkviolet: "violeta escuro", + deeppink: "rosa profundo", + deepskyblue: "azul céu intenso", + dimgray: "cinza turvo", + dimgrey: "cinza turvo", // same as dimgray + dodgerblue: "azul dodger", + firebrick: "firebrick", + floralwhite: "branco floral", + forestgreen: "verde floresta", + fuchsia: "fúcsia", + gainsboro: "gainsboro", + ghostwhite: "branco ghost", + gold: "dourado", + goldenrod: "goldenrod", + gray: "cinza", + green: "verde", + greenyellow: "amarelo esverdeado", + grey: "cinza", // same as gray + honeydew: "honeydew", + hotpink: "rosa quente", + indianred: "vermelho indiano", + indigo: "índigo", + ivory: "marfim", + khaki: "cáqui", + lavender: "lavanda", + lavenderblush: "lavanda avermelhada", + lawngreen: "verde grama", + lemonchiffon: "limão chiffon", + lightblue: "azul claro", + lightcoral: "coral claro", + lightcyan: "ciano claro", + lightgoldenrodyellow: "amarelo goldenrod claro", + lightgray: "cinza claro", + lightgreen: "verde claro", + lightgrey: "cinza claro", // same as lightgray + lightpink: "rosa claro", + lightsalmon: "salmão claro", + lightseagreen: "verde marinho claro", + lightskyblue: "azul céu claro", + lightslategray: "cinza ardósia claro", + lightslategrey: "cinza ardósia claro", // same as lightslategray + lightsteelblue: "azul aço claro", + lightyellow: "amarelo claro", + lime: "lima", + limegreen: "verde lima", + linen: "linho", + magenta: "magenta", + maroon: "castanho", + mediumaquamarine: "água marinha médio", + mediumblue: "azul médio", + mediumorchid: "orquídea médio", + mediumpurple: "roxo médio", + mediumseagreen: "verde marinho médio", + mediumslateblue: "azul ardósia médio", + mediumspringgreen: "verde primavera médio", + mediumturquoise: "turquesa médio", + mediumvioletred: "vermelho violeta médio", + midnightblue: "azul meia-noite", + mintcream: "creme de menta", + mistyrose: "rosa enevoado", + moccasin: "moccasin", + navajowhite: "branco navajo", + navy: "marinho", + oldlace: "cadarço velho", + olive: "oliva", + olivedrab: "verde oliva", + orange: "laranja", + orangered: "vermelho alaranjado", + orchid: "orquídea", + palegoldenrod: "goldenrod esbranquiçado", + palegreen: "verde esbranquiçado", + paleturquoise: "turquesa esbranquiçado", + palevioletred: "vermelho violeta esbranquiçado", + papayawhip: "creme de papaya", + peachpuff: "peach puff", + peru: "peru", + pink: "rosa", + plum: "ameixa", + powderblue: "azul talco", + purple: "roxo", + red: "vermelho", + rosybrown: "marrom rosado", + royalblue: "azul royal", + saddlebrown: "marrom saddle", + salmon: "salmão", + sandybrown: "marrom cor de areia", + seagreen: "verde marinho", + seashell: "seashell", + sienna: "sienna", + silver: "prateado", + skyblue: "azul céu", + slateblue: "azul ardósia", + slategray: "cinza ardósia", + slategrey: "cinza ardósia", // same as slategray + snow: "branco neve", + springgreen: "verde primavera", + steelblue: "azul aço", + tan: "tan", + teal: "azul esverdeado", + thistle: "thistle", + tomato: "tomate", + transparent: "transparente", + turquoise: "turquesa", + violet: "violeta", + wheat: "trigo", + white: "branco", + whitesmoke: "fumaça branca", + yellow: "amarelo", + yellowgreen: "verde amarelado" +}) +); diff --git a/lib/dojo/nls/ro/colors.js b/lib/dojo/nls/ro/colors.js index 9652ce59..87e6682c 100644 --- a/lib/dojo/nls/ro/colors.js +++ b/lib/dojo/nls/ro/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"light steel blue","orangered":"roşu portocaliu","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"cochilie","slategrey":"gri ardezie","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"somon","darkgrey":"gri închis","ivory":"ivoriu","greenyellow":"verde-galben","mistyrose":"trandafiriu obscur","lightsalmon":"somon deschis","silver":"argintiu","dimgrey":"dim gray","orange":"portocaliu","white":"alb","navajowhite":"navajo white","royalblue":"albastru regal","deeppink":"roz închis","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"cyan închis","yellow":"galben","linen":"linen","olive":"oliv","gold":"auriu","lawngreen":"lawn green","lightyellow":"galben deschis","tan":"tan","darkviolet":"violet închis","lightslategrey":"light slate gray","grey":"gri","darkkhaki":"kaki închis","green":"verde","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"maro trandafiriu","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"verde marin deschis","cyan":"cyan","olivedrab":"maron-gălbui oliv","darkgoldenrod":"goldenrod închis","slateblue":"albastru ardezie","mediumaquamarine":"medium aquamarine","lavender":"levănţică","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"albastru închis","mediumvioletred":"medium violet-red","brown":"maro","lightgray":"gri deschis","sandybrown":"maro nisipiu","pink":"roz","firebrick":"fire brick","indigo":"indigo","snow":"zăpadă","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"ciocolată","springgreen":"verde de primăvară","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"lişiţă","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"turquoise pal","purple":"purpură","gainsboro":"gainsboro","plum":"prună","red":"roşu","blue":"albastru","forestgreen":"verde pădure","darkgreen":"verde închis","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"coral deschis","palevioletred":"roşu violet pal","mediumpurple":"medium purple","saddlebrown":"maro de şa","darkmagenta":"magenta închis","thistle":"ciulin","whitesmoke":"fum alb","wheat":"grâu","violet":"violet","lightskyblue":"albastru cer deschis","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"albastru de cer","crimson":"crimson","darksalmon":"dark salmon","darkred":"roşu închis","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"gri deschis","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"gri ardezie","palegoldenrod":"solidago pal","darkorange":"portocaliu închis","aquamarine":"aquamarine","lightgreen":"verde deschis","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"cenuşiu închis","lightcyan":"cyan deschis","powderblue":"albastru pudră","blueviolet":"albastru-violet","orchid":"orhidee","dimgray":"dim gray","beige":"bej","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"roz aprins","steelblue":"albastru metalic","tomato":"roşie","lightpink":"roz deschis","limegreen":"verde lime","indianred":"roşu indian","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"cenuşiu","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"negru","seagreen":"verde marin","darkslateblue":"dark slate blue","khaki":"kaki","lightblue":"albastru deschis","palegreen":"verde pal","azure":"azuriu","peachpuff":"puf de piersică","darkolivegreen":"verde oliv închis","yellowgreen":"verde galben"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/ro/colors",({aliceblue:"alice blue",antiquewhite:"antique white",aqua:"aqua",aquamarine:"aquamarine",azure:"azuriu",beige:"bej",bisque:"bisque",black:"negru",blanchedalmond:"blanched almond",blue:"albastru",blueviolet:"albastru-violet",brown:"brun",burlywood:"burlywood",cadetblue:"albastru cadet",chartreuse:"chartreuse",chocolate:"ciocolată",coral:"coral",cornflowerblue:"cornflower blue",cornsilk:"cornsilk",crimson:"stacojiu",cyan:"cyan",darkblue:"albastru închis",darkcyan:"cyan închis",darkgoldenrod:"goldenrod închis",darkgray:"gri închis",darkgreen:"verde închis",darkgrey:"gri închis",darkkhaki:"kaki închis",darkmagenta:"magenta închis",darkolivegreen:"verde măslină închis",darkorange:"portocaliu închis",darkorchid:"orchid închis",darkred:"roşu închis",darksalmon:"somon închis",darkseagreen:"verde marin închis",darkslateblue:"albastru ardezie închis",darkslategray:"gri ardezie închis",darkslategrey:"gri ardezie închis",darkturquoise:"turcoaz închis",darkviolet:"violet închis",deeppink:"roz profund",deepskyblue:"albastru cer profund",dimgray:"dim gray",dimgrey:"dim gray",dodgerblue:"dodger blue",firebrick:"cărămiziu aprins",floralwhite:"floral white",forestgreen:"forest green",fuchsia:"fuchsia",gainsboro:"gainsboro",ghostwhite:"ghost white",gold:"auriu",goldenrod:"goldenrod",gray:"gri",green:"verde",greenyellow:"verde-gălbui",grey:"gri",honeydew:"honeydew",hotpink:"roz aprins",indianred:"roşu indian",indigo:"indigo",ivory:"ivoriu",khaki:"kaki",lavender:"lavandă",lavenderblush:"lavender blush",lawngreen:"lawn green",lemonchiffon:"lemon chiffon",lightblue:"albastru deschis",lightcoral:"coral deschis",lightcyan:"cyan deschis",lightgoldenrodyellow:"goldenrod gălbui deschis",lightgray:"gri deschis",lightgreen:"verde dschis",lightgrey:"gri deschis",lightpink:"roz deschis",lightsalmon:"somon deschis",lightseagreen:"verde marin deschis",lightskyblue:"albastru cer deschis",lightslategray:"gri ardezie deschis",lightslategrey:"gri ardezie deschis",lightsteelblue:"albastru metalic deschis",lightyellow:"galben deschis",lime:"lime",limegreen:"verde lime",linen:"linen",magenta:"magenta",maroon:"maro",mediumaquamarine:"aquamarin mediu",mediumblue:"albastru mediu",mediumorchid:"orchid mediu",mediumpurple:"purpuriu mediu",mediumseagreen:"verde marin mediu",mediumslateblue:"albastru ardezie mediu",mediumspringgreen:"verde primăvară mediu",mediumturquoise:"turcoaz mediu",mediumvioletred:"roşu-violet mediu",midnightblue:"midnight blue",mintcream:"mint cream",mistyrose:"misty rose",moccasin:"moccasin",navajowhite:"navajo white",navy:"navy",oldlace:"old lace",olive:"oliv",olivedrab:"oliv şters",orange:"portocaliu",orangered:"roşu portocaliu",orchid:"orchid",palegoldenrod:"goldenrod pal",palegreen:"verde pal",paleturquoise:"turcoaz pal",palevioletred:"roşu-violet pal",papayawhip:"papaya whip",peachpuff:"peach puff",peru:"peru",pink:"roz",plum:"plum",powderblue:"powder blue",purple:"purpuriu",red:"roşu",rosybrown:"rosy brown",royalblue:"albastru regal",saddlebrown:"saddle brown",salmon:"somon",sandybrown:"sandy brown",seagreen:"verde marin",seashell:"seashell",sienna:"sienna",silver:"argintiu",skyblue:"albastru cer",slateblue:"albastru ardezie",slategray:"gri ardezie",slategrey:"gri ardezie",snow:"zăpadă",springgreen:"verde primăvară",steelblue:"albastru metalic",tan:"tan",teal:"teal",thistle:"thistle",tomato:"tomato",transparent:"transparent",turquoise:"turcoaz",violet:"violet",wheat:"wheat",white:"alb",whitesmoke:"white smoke",yellow:"galben",yellowgreen:"verde gălbui"})); \ No newline at end of file diff --git a/lib/dojo/nls/ro/colors.js.uncompressed.js b/lib/dojo/nls/ro/colors.js.uncompressed.js new file mode 100644 index 00000000..5b0d11b6 --- /dev/null +++ b/lib/dojo/nls/ro/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/ro/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "alice blue", + antiquewhite: "antique white", + aqua: "aqua", + aquamarine: "aquamarine", + azure: "azuriu", + beige: "bej", + bisque: "bisque", + black: "negru", + blanchedalmond: "blanched almond", + blue: "albastru", + blueviolet: "albastru-violet", + brown: "brun", + burlywood: "burlywood", + cadetblue: "albastru cadet", + chartreuse: "chartreuse", + chocolate: "ciocolată", + coral: "coral", + cornflowerblue: "cornflower blue", + cornsilk: "cornsilk", + crimson: "stacojiu", + cyan: "cyan", + darkblue: "albastru închis", + darkcyan: "cyan închis", + darkgoldenrod: "goldenrod închis", + darkgray: "gri închis", + darkgreen: "verde închis", + darkgrey: "gri închis", // same as darkgray + darkkhaki: "kaki închis", + darkmagenta: "magenta închis", + darkolivegreen: "verde măslină închis", + darkorange: "portocaliu închis", + darkorchid: "orchid închis", + darkred: "roşu închis", + darksalmon: "somon închis", + darkseagreen: "verde marin închis", + darkslateblue: "albastru ardezie închis", + darkslategray: "gri ardezie închis", + darkslategrey: "gri ardezie închis", // same as darkslategray + darkturquoise: "turcoaz închis", + darkviolet: "violet închis", + deeppink: "roz profund", + deepskyblue: "albastru cer profund", + dimgray: "dim gray", + dimgrey: "dim gray", // same as dimgray + dodgerblue: "dodger blue", + firebrick: "cărămiziu aprins", + floralwhite: "floral white", + forestgreen: "forest green", + fuchsia: "fuchsia", + gainsboro: "gainsboro", + ghostwhite: "ghost white", + gold: "auriu", + goldenrod: "goldenrod", + gray: "gri", + green: "verde", + greenyellow: "verde-gălbui", + grey: "gri", // same as gray + honeydew: "honeydew", + hotpink: "roz aprins", + indianred: "roşu indian", + indigo: "indigo", + ivory: "ivoriu", + khaki: "kaki", + lavender: "lavandă", + lavenderblush: "lavender blush", + lawngreen: "lawn green", + lemonchiffon: "lemon chiffon", + lightblue: "albastru deschis", + lightcoral: "coral deschis", + lightcyan: "cyan deschis", + lightgoldenrodyellow: "goldenrod gălbui deschis", + lightgray: "gri deschis", + lightgreen: "verde dschis", + lightgrey: "gri deschis", // same as lightgray + lightpink: "roz deschis", + lightsalmon: "somon deschis", + lightseagreen: "verde marin deschis", + lightskyblue: "albastru cer deschis", + lightslategray: "gri ardezie deschis", + lightslategrey: "gri ardezie deschis", // same as lightslategray + lightsteelblue: "albastru metalic deschis", + lightyellow: "galben deschis", + lime: "lime", + limegreen: "verde lime", + linen: "linen", + magenta: "magenta", + maroon: "maro", + mediumaquamarine: "aquamarin mediu", + mediumblue: "albastru mediu", + mediumorchid: "orchid mediu", + mediumpurple: "purpuriu mediu", + mediumseagreen: "verde marin mediu", + mediumslateblue: "albastru ardezie mediu", + mediumspringgreen: "verde primăvară mediu", + mediumturquoise: "turcoaz mediu", + mediumvioletred: "roşu-violet mediu", + midnightblue: "midnight blue", + mintcream: "mint cream", + mistyrose: "misty rose", + moccasin: "moccasin", + navajowhite: "navajo white", + navy: "navy", + oldlace: "old lace", + olive: "oliv", + olivedrab: "oliv şters", + orange: "portocaliu", + orangered: "roşu portocaliu", + orchid: "orchid", + palegoldenrod: "goldenrod pal", + palegreen: "verde pal", + paleturquoise: "turcoaz pal", + palevioletred: "roşu-violet pal", + papayawhip: "papaya whip", + peachpuff: "peach puff", + peru: "peru", + pink: "roz", + plum: "plum", + powderblue: "powder blue", + purple: "purpuriu", + red: "roşu", + rosybrown: "rosy brown", + royalblue: "albastru regal", + saddlebrown: "saddle brown", + salmon: "somon", + sandybrown: "sandy brown", + seagreen: "verde marin", + seashell: "seashell", + sienna: "sienna", + silver: "argintiu", + skyblue: "albastru cer", + slateblue: "albastru ardezie", + slategray: "gri ardezie", + slategrey: "gri ardezie", // same as slategray + snow: "zăpadă", + springgreen: "verde primăvară", + steelblue: "albastru metalic", + tan: "tan", + teal: "teal", + thistle: "thistle", + tomato: "tomato", + transparent: "transparent", + turquoise: "turcoaz", + violet: "violet", + wheat: "wheat", + white: "alb", + whitesmoke: "white smoke", + yellow: "galben", + yellowgreen: "verde gălbui" +}) +); diff --git a/lib/dojo/nls/ru/colors.js b/lib/dojo/nls/ru/colors.js index 4b67053d..a0e7ce75 100644 --- a/lib/dojo/nls/ru/colors.js +++ b/lib/dojo/nls/ru/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"светлый стальной","orangered":"оранжево-красный","midnightblue":"полуночно-синий","cadetblue":"серо-синий","seashell":"морская раковина","slategrey":"грифельно-серый","coral":"коралловый","darkturquoise":"темный бирюзовый","antiquewhite":"белый антик","mediumspringgreen":"нейтральный весенне-зеленый","salmon":"лососевый","darkgrey":"темно-серый","ivory":"слоновой кости","greenyellow":"зелено-желтый","mistyrose":"блекло-розовый","lightsalmon":"светло-лососевый","silver":"серебристый","dimgrey":"тускло-серый","orange":"оранжевый","white":"белый","navajowhite":"белый навахо","royalblue":"королевский голубой","deeppink":"темно-розовый","lime":"лайм","oldlace":"матово-белый","chartreuse":"желто-салатный","darkcyan":"темный циан","yellow":"желтый","linen":"хлопковый","olive":"оливковый","gold":"золотой","lawngreen":"зеленая лужайка","lightyellow":"светло-желтый","tan":"рыжевато-коричневый","darkviolet":"темно-фиолетовый","lightslategrey":"светлый грифельно-серый","grey":"серый","darkkhaki":"темный хаки","green":"зеленый","deepskyblue":"темный небесно-голубой","aqua":"зеленовато-голубой","sienna":"охра","mintcream":"мятно-кремовый","rosybrown":"розово-коричневый","mediumslateblue":"нейтральный грифельно-синий","magenta":"пурпурный","lightseagreen":"светлый морской волны","cyan":"циан","olivedrab":"желтовато-серый","darkgoldenrod":"темно-золотистый","slateblue":"грифельно-синий","mediumaquamarine":"нейтральный аквамарин","lavender":"бледно-лиловый","mediumseagreen":"нейтральный морской волны","maroon":"темно-бордовый","darkslategray":"темный грифельно-серый","mediumturquoise":"нейтральный бирюзовый","ghostwhite":"призрачно-белый","darkblue":"темно-синий","mediumvioletred":"нейтральный фиолетово-красный","brown":"коричневый","lightgray":"светло-серый","sandybrown":"коричнево-песчаный","pink":"розовый","firebrick":"кирпичный","indigo":"индиго","snow":"белоснежный","darkorchid":"темный орсель","turquoise":"бирюзовый","chocolate":"шоколадный","springgreen":"весенний зеленый","moccasin":"мокасин","navy":"темно-синий","lemonchiffon":"бледно-лимонный","teal":"чирок","floralwhite":"цветочно-белый","cornflowerblue":"фиолетово-синий","paleturquoise":"бледно-бирюзовый","purple":"фиолетовый","gainsboro":"бледно-серый","plum":"сливовый","red":"красный","blue":"синий","forestgreen":"зеленый лесной","darkgreen":"темно-зеленый","honeydew":"медовый","darkseagreen":"темный морской волны","lightcoral":"светло-коралловый","palevioletred":"бледный фиолетово-красный","mediumpurple":"нейтральный фиолетовый","saddlebrown":"кожано-коричневый","darkmagenta":"темно-пурпурный","thistle":"чертополох","whitesmoke":"дымчато-белый","wheat":"пшеница","violet":"фиолетовый","lightskyblue":"светлый небесно-голубой","goldenrod":"золотистый","mediumblue":"нейтральный синий","skyblue":"небесно-голубой","crimson":"малиновый","darksalmon":"темно-лососевый","darkred":"темно-красный","darkslategrey":"темный грифельно-серый","peru":"перу","lightgrey":"светло-серый","lightgoldenrodyellow":"светло-золотистый","blanchedalmond":"светло-миндальный","aliceblue":"серо-голубой","bisque":"бисквитный","slategray":"грифельно-серый","palegoldenrod":"бледно-золотистый","darkorange":"темно-оранжевый","aquamarine":"аквамарин","lightgreen":"светло-зеленый","burlywood":"светло-коричневый","dodgerblue":"бледно-синий","darkgray":"темно-серый","lightcyan":"светлый циан","powderblue":"пороховой","blueviolet":"сине-фиолетовый","orchid":"орсель","dimgray":"тускло-серый","beige":"бежевый","fuchsia":"фуксин","lavenderblush":"розовато-лиловый","hotpink":"красно-розовый","steelblue":"стальной","tomato":"помидор","lightpink":"светло-розовый","limegreen":"зеленый лайм","indianred":"индийский красный","papayawhip":"черенок папайи","lightslategray":"светлый грифельно-серый","gray":"серый","mediumorchid":"нейтральный орсель","cornsilk":"шелковый оттенок","black":"черный","seagreen":"морской волны","darkslateblue":"темный грифельно-синий","khaki":"хаки","lightblue":"светло-синий","palegreen":"бледно-зеленый","azure":"лазурный","peachpuff":"персиковый","darkolivegreen":"темно-оливковый","yellowgreen":"желто-зеленый"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/ru/colors",({aliceblue:"серо-голубой",antiquewhite:"белый антик",aqua:"зеленовато-голубой",aquamarine:"аквамарин",azure:"лазурный",beige:"бежевый",bisque:"бисквитный",black:"черный",blanchedalmond:"светло-миндальный",blue:"синий",blueviolet:"сине-фиолетовый",brown:"коричневый",burlywood:"светло-коричневый",cadetblue:"серо-синий",chartreuse:"желто-салатный",chocolate:"шоколадный",coral:"коралловый",cornflowerblue:"фиолетово-синий",cornsilk:"шелковый оттенок",crimson:"малиновый",cyan:"циан",darkblue:"темно-синий",darkcyan:"темный циан",darkgoldenrod:"темно-золотистый",darkgray:"темно-серый",darkgreen:"темно-зеленый",darkgrey:"темно-серый",darkkhaki:"темный хаки",darkmagenta:"темно-пурпурный",darkolivegreen:"темно-оливковый",darkorange:"темно-оранжевый",darkorchid:"темный орсель",darkred:"темно-красный",darksalmon:"темно-лососевый",darkseagreen:"темный морской волны",darkslateblue:"темный грифельно-синий",darkslategray:"темный грифельно-серый",darkslategrey:"темный грифельно-серый",darkturquoise:"темный бирюзовый",darkviolet:"темно-фиолетовый",deeppink:"темно-розовый",deepskyblue:"темный небесно-голубой",dimgray:"тускло-серый",dimgrey:"тускло-серый",dodgerblue:"бледно-синий",firebrick:"кирпичный",floralwhite:"цветочно-белый",forestgreen:"зеленый лесной",fuchsia:"фуксин",gainsboro:"бледно-серый",ghostwhite:"призрачно-белый",gold:"золотой",goldenrod:"золотистый",gray:"серый",green:"зеленый",greenyellow:"зелено-желтый",grey:"серый",honeydew:"медовый",hotpink:"красно-розовый",indianred:"индийский красный",indigo:"индиго",ivory:"слоновой кости",khaki:"хаки",lavender:"бледно-лиловый",lavenderblush:"розовато-лиловый",lawngreen:"зеленая лужайка",lemonchiffon:"бледно-лимонный",lightblue:"светло-синий",lightcoral:"светло-коралловый",lightcyan:"светлый циан",lightgoldenrodyellow:"светло-золотистый",lightgray:"светло-серый",lightgreen:"светло-зеленый",lightgrey:"светло-серый",lightpink:"светло-розовый",lightsalmon:"светло-лососевый",lightseagreen:"светлый морской волны",lightskyblue:"светлый небесно-голубой",lightslategray:"светлый грифельно-серый",lightslategrey:"светлый грифельно-серый",lightsteelblue:"светлый стальной",lightyellow:"светло-желтый",lime:"лайм",limegreen:"зеленый лайм",linen:"хлопковый",magenta:"пурпурный",maroon:"темно-бордовый",mediumaquamarine:"нейтральный аквамарин",mediumblue:"нейтральный синий",mediumorchid:"нейтральный орсель",mediumpurple:"нейтральный фиолетовый",mediumseagreen:"нейтральный морской волны",mediumslateblue:"нейтральный грифельно-синий",mediumspringgreen:"нейтральный весенне-зеленый",mediumturquoise:"нейтральный бирюзовый",mediumvioletred:"нейтральный фиолетово-красный",midnightblue:"полуночно-синий",mintcream:"мятно-кремовый",mistyrose:"блекло-розовый",moccasin:"мокасин",navajowhite:"белый навахо",navy:"темно-синий",oldlace:"матово-белый",olive:"оливковый",olivedrab:"желтовато-серый",orange:"оранжевый",orangered:"оранжево-красный",orchid:"орсель",palegoldenrod:"бледно-золотистый",palegreen:"бледно-зеленый",paleturquoise:"бледно-бирюзовый",palevioletred:"бледный фиолетово-красный",papayawhip:"черенок папайи",peachpuff:"персиковый",peru:"перу",pink:"розовый",plum:"сливовый",powderblue:"пороховой",purple:"фиолетовый",red:"красный",rosybrown:"розово-коричневый",royalblue:"королевский голубой",saddlebrown:"кожано-коричневый",salmon:"лососевый",sandybrown:"коричнево-песчаный",seagreen:"морской волны",seashell:"морская раковина",sienna:"охра",silver:"серебристый",skyblue:"небесно-голубой",slateblue:"грифельно-синий",slategray:"грифельно-серый",slategrey:"грифельно-серый",snow:"белоснежный",springgreen:"весенний зеленый",steelblue:"стальной",tan:"рыжевато-коричневый",teal:"чирок",thistle:"чертополох",tomato:"помидор",transparent:"прозрачный",turquoise:"бирюзовый",violet:"фиолетовый",wheat:"пшеница",white:"белый",whitesmoke:"дымчато-белый",yellow:"желтый",yellowgreen:"желто-зеленый"})); \ No newline at end of file diff --git a/lib/dojo/nls/ru/colors.js.uncompressed.js b/lib/dojo/nls/ru/colors.js.uncompressed.js new file mode 100644 index 00000000..902d07ba --- /dev/null +++ b/lib/dojo/nls/ru/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/ru/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "серо-голубой", + antiquewhite: "белый антик", + aqua: "зеленовато-голубой", + aquamarine: "аквамарин", + azure: "лазурный", + beige: "бежевый", + bisque: "бисквитный", + black: "черный", + blanchedalmond: "светло-миндальный", + blue: "синий", + blueviolet: "сине-фиолетовый", + brown: "коричневый", + burlywood: "светло-коричневый", + cadetblue: "серо-синий", + chartreuse: "желто-салатный", + chocolate: "шоколадный", + coral: "коралловый", + cornflowerblue: "фиолетово-синий", + cornsilk: "шелковый оттенок", + crimson: "малиновый", + cyan: "циан", + darkblue: "темно-синий", + darkcyan: "темный циан", + darkgoldenrod: "темно-золотистый", + darkgray: "темно-серый", + darkgreen: "темно-зеленый", + darkgrey: "темно-серый", // same as darkgray + darkkhaki: "темный хаки", + darkmagenta: "темно-пурпурный", + darkolivegreen: "темно-оливковый", + darkorange: "темно-оранжевый", + darkorchid: "темный орсель", + darkred: "темно-красный", + darksalmon: "темно-лососевый", + darkseagreen: "темный морской волны", + darkslateblue: "темный грифельно-синий", + darkslategray: "темный грифельно-серый", + darkslategrey: "темный грифельно-серый", // same as darkslategray + darkturquoise: "темный бирюзовый", + darkviolet: "темно-фиолетовый", + deeppink: "темно-розовый", + deepskyblue: "темный небесно-голубой", + dimgray: "тускло-серый", + dimgrey: "тускло-серый", // same as dimgray + dodgerblue: "бледно-синий", + firebrick: "кирпичный", + floralwhite: "цветочно-белый", + forestgreen: "зеленый лесной", + fuchsia: "фуксин", + gainsboro: "бледно-серый", + ghostwhite: "призрачно-белый", + gold: "золотой", + goldenrod: "золотистый", + gray: "серый", + green: "зеленый", + greenyellow: "зелено-желтый", + grey: "серый", // same as gray + honeydew: "медовый", + hotpink: "красно-розовый", + indianred: "индийский красный", + indigo: "индиго", + ivory: "слоновой кости", + khaki: "хаки", + lavender: "бледно-лиловый", + lavenderblush: "розовато-лиловый", + lawngreen: "зеленая лужайка", + lemonchiffon: "бледно-лимонный", + lightblue: "светло-синий", + lightcoral: "светло-коралловый", + lightcyan: "светлый циан", + lightgoldenrodyellow: "светло-золотистый", + lightgray: "светло-серый", + lightgreen: "светло-зеленый", + lightgrey: "светло-серый", // same as lightgray + lightpink: "светло-розовый", + lightsalmon: "светло-лососевый", + lightseagreen: "светлый морской волны", + lightskyblue: "светлый небесно-голубой", + lightslategray: "светлый грифельно-серый", + lightslategrey: "светлый грифельно-серый", // same as lightslategray + lightsteelblue: "светлый стальной", + lightyellow: "светло-желтый", + lime: "лайм", + limegreen: "зеленый лайм", + linen: "хлопковый", + magenta: "пурпурный", + maroon: "темно-бордовый", + mediumaquamarine: "нейтральный аквамарин", + mediumblue: "нейтральный синий", + mediumorchid: "нейтральный орсель", + mediumpurple: "нейтральный фиолетовый", + mediumseagreen: "нейтральный морской волны", + mediumslateblue: "нейтральный грифельно-синий", + mediumspringgreen: "нейтральный весенне-зеленый", + mediumturquoise: "нейтральный бирюзовый", + mediumvioletred: "нейтральный фиолетово-красный", + midnightblue: "полуночно-синий", + mintcream: "мятно-кремовый", + mistyrose: "блекло-розовый", + moccasin: "мокасин", + navajowhite: "белый навахо", + navy: "темно-синий", + oldlace: "матово-белый", + olive: "оливковый", + olivedrab: "желтовато-серый", + orange: "оранжевый", + orangered: "оранжево-красный", + orchid: "орсель", + palegoldenrod: "бледно-золотистый", + palegreen: "бледно-зеленый", + paleturquoise: "бледно-бирюзовый", + palevioletred: "бледный фиолетово-красный", + papayawhip: "черенок папайи", + peachpuff: "персиковый", + peru: "перу", + pink: "розовый", + plum: "сливовый", + powderblue: "пороховой", + purple: "фиолетовый", + red: "красный", + rosybrown: "розово-коричневый", + royalblue: "королевский голубой", + saddlebrown: "кожано-коричневый", + salmon: "лососевый", + sandybrown: "коричнево-песчаный", + seagreen: "морской волны", + seashell: "морская раковина", + sienna: "охра", + silver: "серебристый", + skyblue: "небесно-голубой", + slateblue: "грифельно-синий", + slategray: "грифельно-серый", + slategrey: "грифельно-серый", // same as slategray + snow: "белоснежный", + springgreen: "весенний зеленый", + steelblue: "стальной", + tan: "рыжевато-коричневый", + teal: "чирок", + thistle: "чертополох", + tomato: "помидор", + transparent: "прозрачный", + turquoise: "бирюзовый", + violet: "фиолетовый", + wheat: "пшеница", + white: "белый", + whitesmoke: "дымчато-белый", + yellow: "желтый", + yellowgreen: "желто-зеленый" +}) +); diff --git a/lib/dojo/nls/sk/colors.js b/lib/dojo/nls/sk/colors.js index 9dbd8e60..709aaff3 100644 --- a/lib/dojo/nls/sk/colors.js +++ b/lib/dojo/nls/sk/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"oceľovo modrá svetlá","orangered":"oranžovo červená","midnightblue":"nočná modrá","cadetblue":"sivomodrá","seashell":"lastúrová","slategrey":"bridlicová sivá","coral":"koralová","darkturquoise":"tyrkysová tmavá","antiquewhite":"antická biela","mediumspringgreen":"jarná zelená stredná","salmon":"lososovo ružová","darkgrey":"tmavosivá","ivory":"slonovinová","greenyellow":"žltozelená","mistyrose":"zahmlená ruža","lightsalmon":"lososovo ružová svetlá","silver":"strieborná","dimgrey":"sivá matná","orange":"oranžová","white":"biela","navajowhite":"navajská biela","royalblue":"kráľovská modrá","deeppink":"hlboká ružová","lime":"lipová","oldlace":"stará čipka","chartreuse":"kartúza","darkcyan":"tmavozelenomodrá","yellow":"žltá","linen":"ľan","olive":"olivovo zelená","gold":"zlatá","lawngreen":"zelená tráva","lightyellow":"svetložltá","tan":"žltohnedá","darkviolet":"tmavofialová","lightslategrey":"bridlicová sivá svetlá","grey":"sivá","darkkhaki":"žltohnedá tmavá","green":"zelená","deepskyblue":"hlboká blankytná modrá","aqua":"svetlá zelenomodrá","sienna":"sienská","mintcream":"mätová krémová","rosybrown":"ružovo hnedá","mediumslateblue":"bridlicová modrá stredná","magenta":"purpurová","lightseagreen":"morská zelená svetlá","cyan":"zelenomodrá","olivedrab":"olivovo zelená fádna","darkgoldenrod":"zlatobyľová tmavá","slateblue":"bridlicová modrá","mediumaquamarine":"akvamarínová stredná","lavender":"levanduľová","mediumseagreen":"morská zelená stredná","maroon":"gaštanovo hnedá","darkslategray":"bridlicová sivá tmavá","mediumturquoise":"tyrkysová stredná","ghostwhite":"biely tieň","darkblue":"tmavomodrá","mediumvioletred":"fialovočervená stredná","brown":"hnedá","lightgray":"svetlosivá","sandybrown":"pieskovo hnedá","pink":"ružová","firebrick":"pálená tehla","indigo":"fialovo modrá","snow":"snehobiela","darkorchid":"orchideovo ružová tmavá","turquoise":"tyrkysová","chocolate":"čokoládovo hnedá","springgreen":"jarná zelená","moccasin":"črievičníková","navy":"vojenská zelená","lemonchiffon":"citrónový šifón","teal":"tyrkysová","floralwhite":"kvetinová biela","cornflowerblue":"nevädzovo modrá","paleturquoise":"bledo tyrkysová","purple":"purpurová","gainsboro":"sivomodrá svetlá","plum":"slivková","red":"červená","blue":"modrá","forestgreen":"lesná zelená","darkgreen":"tmavozelená","honeydew":"ambrózia","darkseagreen":"morská zelená tmavá","lightcoral":"koralová svetlá","palevioletred":"bledá fialovo červená","mediumpurple":"purpurová stredná","saddlebrown":"sedlová hnedá","darkmagenta":"tmavopurpurová","thistle":"bodliaková fialová","whitesmoke":"biely dym","wheat":"pšeničná","violet":"fialová","lightskyblue":"blankytná modrá svetlá","goldenrod":"zlatobyľ","mediumblue":"stredne modrá","skyblue":"blankytná modrá","crimson":"karmínová","darksalmon":"lososovo ružová tmavá","darkred":"tmavočervená","darkslategrey":"bridlicová sivá tmavá","peru":"peru","lightgrey":"svetlosivá","lightgoldenrodyellow":"zlatobyľová svetlá","blanchedalmond":"lúpané mandle","aliceblue":"modrá alice","bisque":"biskvitová","slategray":"bridlicová sivá","palegoldenrod":"bledá zlatobyľová","darkorange":"tmavooranžová","aquamarine":"akvamarínová","lightgreen":"svetlozelená","burlywood":"pieskovo hnedá","dodgerblue":"modrá dodger","darkgray":"tmavosivá","lightcyan":"zelenomodrá svetlá","powderblue":"prášková modrá","blueviolet":"modrofialová","orchid":"orchideovo ružová","dimgray":"sivá matná","beige":"béžová","fuchsia":"purpurová","lavenderblush":"levanduľový rumenec","hotpink":"teplá ružová","steelblue":"oceľovo modrá","tomato":"paradajková červená","lightpink":"svetloružová","limegreen":"lipová zelená","indianred":"indická červená","papayawhip":"papájový krém","lightslategray":"bridlicová sivá svetlá","gray":"sivá","mediumorchid":"orchideovo ružová stredná","cornsilk":"hodvábna žltá","black":"čierna","seagreen":"morská zelená","darkslateblue":"bridlicová modrá tmavá","khaki":"khaki","lightblue":"svetlomodrá","palegreen":"bledozelená","azure":"azúrová","peachpuff":"broskyňová pena","darkolivegreen":"olivovozelená tmavá","yellowgreen":"žltozelená"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/sk/colors",({aliceblue:"modrá (alice)",antiquewhite:"antická biela",aqua:"vodová",aquamarine:"akvamarínová",azure:"azúrová",beige:"béžová",bisque:"porcelánová",black:"čierna",blanchedalmond:"bledá mandľová",blue:"modrá",blueviolet:"modro-fialová",brown:"hnedá",burlywood:"drevená hnedá",cadetblue:"červeno modrá",chartreuse:"kartúzska",chocolate:"čokoládová",coral:"koralová",cornflowerblue:"nevädzová modrá",cornsilk:"ôstie kukurice",crimson:"karmínová",cyan:"zelenomodrá",darkblue:"tmavomodrá",darkcyan:"tmavá zelenomodrá",darkgoldenrod:"tmavá zlatobyľ",darkgray:"tmavosivá",darkgreen:"tmavozelená",darkgrey:"tmavosivá",darkkhaki:"tmavá žltohnedá",darkmagenta:"tmavá purpurová",darkolivegreen:"tmavá olivovo zelená",darkorange:"tmavá oranžová",darkorchid:"tmavá orchidea",darkred:"tmavočervená",darksalmon:"tmavá lososová",darkseagreen:"tmavá morská zelená",darkslateblue:"tmavá bridlicová modrá",darkslategray:"tmavá bridlicová sivá",darkslategrey:"tmavá bridlicová sivá",darkturquoise:"tmavá tyrkysová",darkviolet:"tmavofialová",deeppink:"hlboká ružová",deepskyblue:"hlboká modrá obloha",dimgray:"matná sivá",dimgrey:"matná sivá",dodgerblue:"modrá (dodger)",firebrick:"pálená tehla",floralwhite:"biely kvet",forestgreen:"lesná zelená",fuchsia:"fuchsia",gainsboro:"sivá - gainsboro",ghostwhite:"biela (ghost white)",gold:"zlatá",goldenrod:"zlatobyľ",gray:"sivá",green:"zelená",greenyellow:"zelenožltá",grey:"sivá",honeydew:"ambrózia",hotpink:"horúca ružová",indianred:"indiánska červená",indigo:"indigo",ivory:"slonovina",khaki:"kaki",lavender:"levanduľa",lavenderblush:"rumencová levanduľa",lawngreen:"trávová zelená",lemonchiffon:"citrónový šifón",lightblue:"svetlomodrá",lightcoral:"svetlá koralová",lightcyan:"svetlá zelenomodrá",lightgoldenrodyellow:"svetlá zlatobyľová žltá",lightgray:"svetlosivá",lightgreen:"svetlozelená",lightgrey:"svetlosivá",lightpink:"svetloružová",lightsalmon:"svetlá lososová",lightseagreen:"svetlá morská zelená",lightskyblue:"svetlá modrá obloha",lightslategray:"svetlá bridlicová sivá",lightslategrey:"svetlá bridlicová sivá",lightsteelblue:"svetlá oceľovomodrá",lightyellow:"svetložltá",lime:"limetková",limegreen:"limetková zelená",linen:"ľan",magenta:"purpurová",maroon:"gaštanová hnedá",mediumaquamarine:"stredná akvamarínová",mediumblue:"stredná modrá",mediumorchid:"stredná orchideová",mediumpurple:"stredná purpurová",mediumseagreen:"stredná morská zelená",mediumslateblue:"stredná bridlicová modrá",mediumspringgreen:"stredná jarná zelená",mediumturquoise:"stredná tyrkysová",mediumvioletred:"stredná fialovočervená",midnightblue:"polnočná modrá",mintcream:"mätová krémová",mistyrose:"zahmlená ruža",moccasin:"mokasínová",navajowhite:"navajská biela",navy:"námornícka",oldlace:"stará čipka",olive:"olivová",olivedrab:"fádna olivová",orange:"oranžová",orangered:"oranžovo červená",orchid:"orchideová",palegoldenrod:"bledá zlatobyľová",palegreen:"bledá zelená",paleturquoise:"bledá tyrkysová",palevioletred:"bledá fialovo červená",papayawhip:"papájový krém",peachpuff:"broskyňový nádych",peru:"peru",pink:"ružová",plum:"slivková",powderblue:"prášková modrá",purple:"purpurová",red:"červená",rosybrown:"ružovo hnedá",royalblue:"kráľovská modrá",saddlebrown:"sedlová hnedá",salmon:"lososová",sandybrown:"piesková hnedá",seagreen:"morská zelená",seashell:"lastúrová",sienna:"sienská",silver:"strieborná",skyblue:"modré nebo",slateblue:"bridlicová modrá",slategray:"bridlicová sivá",slategrey:"bridlicová sivá",snow:"snehová",springgreen:"jarná zelená",steelblue:"oceľovomodrá",tan:"žltohnedá",teal:"zelenomodrá",thistle:"bodliaková",tomato:"paradajková",transparent:"priesvitná",turquoise:"tyrkysová",violet:"fialová",wheat:"pšeničná",white:"biela",whitesmoke:"biely dym",yellow:"žltá",yellowgreen:"žltozelená"})); \ No newline at end of file diff --git a/lib/dojo/nls/sk/colors.js.uncompressed.js b/lib/dojo/nls/sk/colors.js.uncompressed.js new file mode 100644 index 00000000..700f727a --- /dev/null +++ b/lib/dojo/nls/sk/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/sk/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "modrá (alice)", + antiquewhite: "antická biela", + aqua: "vodová", + aquamarine: "akvamarínová", + azure: "azúrová", + beige: "béžová", + bisque: "porcelánová", + black: "čierna", + blanchedalmond: "bledá mandľová", + blue: "modrá", + blueviolet: "modro-fialová", + brown: "hnedá", + burlywood: "drevená hnedá", + cadetblue: "červeno modrá", + chartreuse: "kartúzska", + chocolate: "čokoládová", + coral: "koralová", + cornflowerblue: "nevädzová modrá", + cornsilk: "ôstie kukurice", + crimson: "karmínová", + cyan: "zelenomodrá", + darkblue: "tmavomodrá", + darkcyan: "tmavá zelenomodrá", + darkgoldenrod: "tmavá zlatobyľ", + darkgray: "tmavosivá", + darkgreen: "tmavozelená", + darkgrey: "tmavosivá", // same as darkgray + darkkhaki: "tmavá žltohnedá", + darkmagenta: "tmavá purpurová", + darkolivegreen: "tmavá olivovo zelená", + darkorange: "tmavá oranžová", + darkorchid: "tmavá orchidea", + darkred: "tmavočervená", + darksalmon: "tmavá lososová", + darkseagreen: "tmavá morská zelená", + darkslateblue: "tmavá bridlicová modrá", + darkslategray: "tmavá bridlicová sivá", + darkslategrey: "tmavá bridlicová sivá", // same as darkslategray + darkturquoise: "tmavá tyrkysová", + darkviolet: "tmavofialová", + deeppink: "hlboká ružová", + deepskyblue: "hlboká modrá obloha", + dimgray: "matná sivá", + dimgrey: "matná sivá", // same as dimgray + dodgerblue: "modrá (dodger)", + firebrick: "pálená tehla", + floralwhite: "biely kvet", + forestgreen: "lesná zelená", + fuchsia: "fuchsia", + gainsboro: "sivá - gainsboro", + ghostwhite: "biela (ghost white)", + gold: "zlatá", + goldenrod: "zlatobyľ", + gray: "sivá", + green: "zelená", + greenyellow: "zelenožltá", + grey: "sivá", // same as gray + honeydew: "ambrózia", + hotpink: "horúca ružová", + indianred: "indiánska červená", + indigo: "indigo", + ivory: "slonovina", + khaki: "kaki", + lavender: "levanduľa", + lavenderblush: "rumencová levanduľa", + lawngreen: "trávová zelená", + lemonchiffon: "citrónový šifón", + lightblue: "svetlomodrá", + lightcoral: "svetlá koralová", + lightcyan: "svetlá zelenomodrá", + lightgoldenrodyellow: "svetlá zlatobyľová žltá", + lightgray: "svetlosivá", + lightgreen: "svetlozelená", + lightgrey: "svetlosivá", // same as lightgray + lightpink: "svetloružová", + lightsalmon: "svetlá lososová", + lightseagreen: "svetlá morská zelená", + lightskyblue: "svetlá modrá obloha", + lightslategray: "svetlá bridlicová sivá", + lightslategrey: "svetlá bridlicová sivá", // same as lightslategray + lightsteelblue: "svetlá oceľovomodrá", + lightyellow: "svetložltá", + lime: "limetková", + limegreen: "limetková zelená", + linen: "ľan", + magenta: "purpurová", + maroon: "gaštanová hnedá", + mediumaquamarine: "stredná akvamarínová", + mediumblue: "stredná modrá", + mediumorchid: "stredná orchideová", + mediumpurple: "stredná purpurová", + mediumseagreen: "stredná morská zelená", + mediumslateblue: "stredná bridlicová modrá", + mediumspringgreen: "stredná jarná zelená", + mediumturquoise: "stredná tyrkysová", + mediumvioletred: "stredná fialovočervená", + midnightblue: "polnočná modrá", + mintcream: "mätová krémová", + mistyrose: "zahmlená ruža", + moccasin: "mokasínová", + navajowhite: "navajská biela", + navy: "námornícka", + oldlace: "stará čipka", + olive: "olivová", + olivedrab: "fádna olivová", + orange: "oranžová", + orangered: "oranžovo červená", + orchid: "orchideová", + palegoldenrod: "bledá zlatobyľová", + palegreen: "bledá zelená", + paleturquoise: "bledá tyrkysová", + palevioletred: "bledá fialovo červená", + papayawhip: "papájový krém", + peachpuff: "broskyňový nádych", + peru: "peru", + pink: "ružová", + plum: "slivková", + powderblue: "prášková modrá", + purple: "purpurová", + red: "červená", + rosybrown: "ružovo hnedá", + royalblue: "kráľovská modrá", + saddlebrown: "sedlová hnedá", + salmon: "lososová", + sandybrown: "piesková hnedá", + seagreen: "morská zelená", + seashell: "lastúrová", + sienna: "sienská", + silver: "strieborná", + skyblue: "modré nebo", + slateblue: "bridlicová modrá", + slategray: "bridlicová sivá", + slategrey: "bridlicová sivá", // same as slategray + snow: "snehová", + springgreen: "jarná zelená", + steelblue: "oceľovomodrá", + tan: "žltohnedá", + teal: "zelenomodrá", + thistle: "bodliaková", + tomato: "paradajková", + transparent: "priesvitná", + turquoise: "tyrkysová", + violet: "fialová", + wheat: "pšeničná", + white: "biela", + whitesmoke: "biely dym", + yellow: "žltá", + yellowgreen: "žltozelená" +}) +); diff --git a/lib/dojo/nls/sl/colors.js b/lib/dojo/nls/sl/colors.js index 15d3ac7b..4f2f19e0 100644 --- a/lib/dojo/nls/sl/colors.js +++ b/lib/dojo/nls/sl/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"svetlo kovinsko modra","orangered":"oranžno-rdeča","midnightblue":"polnočno modra","cadetblue":"kadetsko modra","seashell":"morska lupina","slategrey":"skrilasto siva","coral":"koralna","darkturquoise":"temno turkizna","antiquewhite":"antično bela","mediumspringgreen":"srednje pomladno zelena","salmon":"lososova","darkgrey":"temno siva","ivory":"slonokoščena","greenyellow":"zeleno-rumena","mistyrose":"megleno rožnata","lightsalmon":"svetlo lososova","silver":"srebrna","dimgrey":"pepelnato siva","orange":"oranžna","white":"bela","navajowhite":"navajo bela","royalblue":"kraljevsko modra","deeppink":"temno rožnata","lime":"limetasta","oldlace":"stara čipka","chartreuse":"chartreuse","darkcyan":"temno cijan","yellow":"rumena","linen":"lanena","olive":"olivna","gold":"zlata","lawngreen":"travniško zelena","lightyellow":"svetlo rumena","tan":"rumeno-rjava","darkviolet":"temno vijolična","lightslategrey":"svetlo skrilasto siva","grey":"siva","darkkhaki":"temno kaki","green":"zelena","deepskyblue":"temno nebeško modra","aqua":"akva","sienna":"sienna","mintcream":"metina krema","rosybrown":"rožnato rjava","mediumslateblue":"srednje skrilasto modra","magenta":"magenta","lightseagreen":"svetlo morsko zelena","cyan":"cijan","olivedrab":"umazano olivna","darkgoldenrod":"temna zlata rozga","slateblue":"skrilasto modra","mediumaquamarine":"srednji akvamarin","lavender":"sivka","mediumseagreen":"srednje morsko zelena","maroon":"kostanjeva","darkslategray":"temno skrilasto siva","mediumturquoise":"srednje turkizna","ghostwhite":"senčnato bela","darkblue":"temno modra","mediumvioletred":"srednje vijolično rdeča","brown":"rjava","lightgray":"svetlo siva","sandybrown":"peščeno rjava","pink":"rožnata","firebrick":"opečnata","indigo":"indigo","snow":"snežena","darkorchid":"temno orhidejasta","turquoise":"turkizna","chocolate":"čokoladna","springgreen":"pomladno zelena","moccasin":"mokasinasta","navy":"mornarska","lemonchiffon":"limonast šifon","teal":"modrozelena","floralwhite":"cvetno bela","cornflowerblue":"plavičasto modra","paleturquoise":"bledo turkizna","purple":"škrlatna","gainsboro":"gainsboro","plum":"slivova","red":"rdeča","blue":"modra","forestgreen":"gozdno zelena","darkgreen":"temno zelena","honeydew":"medena rosa","darkseagreen":"temno morsko zelena","lightcoral":"svetlo koralna","palevioletred":"bledo vijolično-rdeča","mediumpurple":"srednje škrlatna","saddlebrown":"sedlasto rjava","darkmagenta":"temna magenta","thistle":"osatna","whitesmoke":"megleno bela","wheat":"pšenična","violet":"vijolična","lightskyblue":"svetlo nebeško modra","goldenrod":"zlata rozga","mediumblue":"srednje modra","skyblue":"nebeško modra","crimson":"karminasta","darksalmon":"temno lososova","darkred":"temno rdeča","darkslategrey":"temno skrilasto siva","peru":"perujska","lightgrey":"svetlo siva","lightgoldenrodyellow":"svetlo rumena zlata rozga","blanchedalmond":"obledelo mandljeva","aliceblue":"alice blue modra","bisque":"porcelanasta","slategray":"skrilasto siva","palegoldenrod":"bleda zlata rozga","darkorange":"temno oranžna","aquamarine":"akvamarin","lightgreen":"svetlo zelena","burlywood":"peščeno sivo-rjava","dodgerblue":"dodgersko modra","darkgray":"temno siva","lightcyan":"svetlo cijan","powderblue":"kobaltovo modra","blueviolet":"modro vijolična","orchid":"orhidejasta","dimgray":"pepelnato siva","beige":"bež","fuchsia":"fuksija","lavenderblush":"rožnato sivka","hotpink":"kričeče rožnata","steelblue":"kovinsko modra","tomato":"paradižnikova","lightpink":"svetlo rožnata","limegreen":"apneno zelena","indianred":"indijansko rdeča","papayawhip":"papaja","lightslategray":"svetlo skrilasto siva","gray":"siva","mediumorchid":"srednje orhidejasta","cornsilk":"koruzna","black":"črna","seagreen":"morsko zelena","darkslateblue":"temno skrilasto modra","khaki":"kaki","lightblue":"svetlo modra","palegreen":"bledo zelena","azure":"azurno modra","peachpuff":"breskova","darkolivegreen":"temna olivno zelena","yellowgreen":"rumeno-zelena"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/sl/colors",({aliceblue:"alice blue modra",antiquewhite:"antično bela",aqua:"akva",aquamarine:"akvamarin",azure:"azurno modra",beige:"bež",bisque:"porcelanasta",black:"črna",blanchedalmond:"obledelo mandljeva",blue:"modra",blueviolet:"modro vijolična",brown:"rjava",burlywood:"peščeno sivo-rjava",cadetblue:"kadetsko modra",chartreuse:"chartreuse",chocolate:"čokoladna",coral:"koralna",cornflowerblue:"plavičasto modra",cornsilk:"koruzna",crimson:"karminasta",cyan:"cijan",darkblue:"temno modra",darkcyan:"temno cijan",darkgoldenrod:"temna zlata rozga",darkgray:"temno siva",darkgreen:"temno zelena",darkgrey:"temno siva",darkkhaki:"temno kaki",darkmagenta:"temna magenta",darkolivegreen:"temna olivno zelena",darkorange:"temno oranžna",darkorchid:"temno orhidejasta",darkred:"temno rdeča",darksalmon:"temno lososova",darkseagreen:"temno morsko zelena",darkslateblue:"temno skrilasto modra",darkslategray:"temno skrilasto siva",darkslategrey:"temno skrilasto siva",darkturquoise:"temno turkizna",darkviolet:"temno vijolična",deeppink:"temno rožnata",deepskyblue:"temno nebeško modra",dimgray:"pepelnato siva",dimgrey:"pepelnato siva",dodgerblue:"dodgersko modra",firebrick:"opečnata",floralwhite:"cvetno bela",forestgreen:"gozdno zelena",fuchsia:"fuksija",gainsboro:"gainsboro",ghostwhite:"senčnato bela",gold:"zlata",goldenrod:"zlata rozga",gray:"siva",green:"zelena",greenyellow:"zeleno-rumena",grey:"siva",honeydew:"medena rosa",hotpink:"kričeče rožnata",indianred:"indijansko rdeča",indigo:"indigo",ivory:"slonokoščena",khaki:"kaki",lavender:"sivka",lavenderblush:"rožnato sivka",lawngreen:"travniško zelena",lemonchiffon:"limonast šifon",lightblue:"svetlo modra",lightcoral:"svetlo koralna",lightcyan:"svetlo cijan",lightgoldenrodyellow:"svetlo rumena zlata rozga",lightgray:"svetlo siva",lightgreen:"svetlo zelena",lightgrey:"svetlo siva",lightpink:"svetlo rožnata",lightsalmon:"svetlo lososova",lightseagreen:"svetlo morsko zelena",lightskyblue:"svetlo nebeško modra",lightslategray:"svetlo skrilasto siva",lightslategrey:"svetlo skrilasto siva",lightsteelblue:"svetlo kovinsko modra",lightyellow:"svetlo rumena",lime:"limetasta",limegreen:"apneno zelena",linen:"lanena",magenta:"magenta",maroon:"kostanjeva",mediumaquamarine:"srednji akvamarin",mediumblue:"srednje modra",mediumorchid:"srednje orhidejasta",mediumpurple:"srednje škrlatna",mediumseagreen:"srednje morsko zelena",mediumslateblue:"srednje skrilasto modra",mediumspringgreen:"srednje pomladno zelena",mediumturquoise:"srednje turkizna",mediumvioletred:"srednje vijolično rdeča",midnightblue:"polnočno modra",mintcream:"metina krema",mistyrose:"megleno rožnata",moccasin:"mokasinasta",navajowhite:"navajo bela",navy:"mornarska",oldlace:"stara čipka",olive:"olivna",olivedrab:"umazano olivna",orange:"oranžna",orangered:"oranžno-rdeča",orchid:"orhidejasta",palegoldenrod:"bleda zlata rozga",palegreen:"bledo zelena",paleturquoise:"bledo turkizna",palevioletred:"bledo vijolično-rdeča",papayawhip:"papaja",peachpuff:"breskova",peru:"perujska",pink:"rožnata",plum:"slivova",powderblue:"kobaltovo modra",purple:"škrlatna",red:"rdeča",rosybrown:"rožnato rjava",royalblue:"kraljevsko modra",saddlebrown:"sedlasto rjava",salmon:"lososova",sandybrown:"peščeno rjava",seagreen:"morsko zelena",seashell:"morska lupina",sienna:"sienna",silver:"srebrna",skyblue:"nebeško modra",slateblue:"skrilasto modra",slategray:"skrilasto siva",slategrey:"skrilasto siva",snow:"snežena",springgreen:"pomladno zelena",steelblue:"kovinsko modra",tan:"rumeno-rjava",teal:"modrozelena",thistle:"osatna",tomato:"paradižnikova",transparent:"prosojno",turquoise:"turkizna",violet:"vijolična",wheat:"pšenična",white:"bela",whitesmoke:"megleno bela",yellow:"rumena",yellowgreen:"rumeno-zelena"})); \ No newline at end of file diff --git a/lib/dojo/nls/sl/colors.js.uncompressed.js b/lib/dojo/nls/sl/colors.js.uncompressed.js new file mode 100644 index 00000000..74b0547c --- /dev/null +++ b/lib/dojo/nls/sl/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/sl/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "alice blue modra", + antiquewhite: "antično bela", + aqua: "akva", + aquamarine: "akvamarin", + azure: "azurno modra", + beige: "bež", + bisque: "porcelanasta", + black: "črna", + blanchedalmond: "obledelo mandljeva", + blue: "modra", + blueviolet: "modro vijolična", + brown: "rjava", + burlywood: "peščeno sivo-rjava", + cadetblue: "kadetsko modra", + chartreuse: "chartreuse", + chocolate: "čokoladna", + coral: "koralna", + cornflowerblue: "plavičasto modra", + cornsilk: "koruzna", + crimson: "karminasta", + cyan: "cijan", + darkblue: "temno modra", + darkcyan: "temno cijan", + darkgoldenrod: "temna zlata rozga", + darkgray: "temno siva", + darkgreen: "temno zelena", + darkgrey: "temno siva", // same as darkgray + darkkhaki: "temno kaki", + darkmagenta: "temna magenta", + darkolivegreen: "temna olivno zelena", + darkorange: "temno oranžna", + darkorchid: "temno orhidejasta", + darkred: "temno rdeča", + darksalmon: "temno lososova", + darkseagreen: "temno morsko zelena", + darkslateblue: "temno skrilasto modra", + darkslategray: "temno skrilasto siva", + darkslategrey: "temno skrilasto siva", // same as darkslategray + darkturquoise: "temno turkizna", + darkviolet: "temno vijolična", + deeppink: "temno rožnata", + deepskyblue: "temno nebeško modra", + dimgray: "pepelnato siva", + dimgrey: "pepelnato siva", // same as dimgray + dodgerblue: "dodgersko modra", + firebrick: "opečnata", + floralwhite: "cvetno bela", + forestgreen: "gozdno zelena", + fuchsia: "fuksija", + gainsboro: "gainsboro", + ghostwhite: "senčnato bela", + gold: "zlata", + goldenrod: "zlata rozga", + gray: "siva", + green: "zelena", + greenyellow: "zeleno-rumena", + grey: "siva", // same as gray + honeydew: "medena rosa", + hotpink: "kričeče rožnata", + indianred: "indijansko rdeča", + indigo: "indigo", + ivory: "slonokoščena", + khaki: "kaki", + lavender: "sivka", + lavenderblush: "rožnato sivka", + lawngreen: "travniško zelena", + lemonchiffon: "limonast šifon", + lightblue: "svetlo modra", + lightcoral: "svetlo koralna", + lightcyan: "svetlo cijan", + lightgoldenrodyellow: "svetlo rumena zlata rozga", + lightgray: "svetlo siva", + lightgreen: "svetlo zelena", + lightgrey: "svetlo siva", // same as lightgray + lightpink: "svetlo rožnata", + lightsalmon: "svetlo lososova", + lightseagreen: "svetlo morsko zelena", + lightskyblue: "svetlo nebeško modra", + lightslategray: "svetlo skrilasto siva", + lightslategrey: "svetlo skrilasto siva", // same as lightslategray + lightsteelblue: "svetlo kovinsko modra", + lightyellow: "svetlo rumena", + lime: "limetasta", + limegreen: "apneno zelena", + linen: "lanena", + magenta: "magenta", + maroon: "kostanjeva", + mediumaquamarine: "srednji akvamarin", + mediumblue: "srednje modra", + mediumorchid: "srednje orhidejasta", + mediumpurple: "srednje škrlatna", + mediumseagreen: "srednje morsko zelena", + mediumslateblue: "srednje skrilasto modra", + mediumspringgreen: "srednje pomladno zelena", + mediumturquoise: "srednje turkizna", + mediumvioletred: "srednje vijolično rdeča", + midnightblue: "polnočno modra", + mintcream: "metina krema", + mistyrose: "megleno rožnata", + moccasin: "mokasinasta", + navajowhite: "navajo bela", + navy: "mornarska", + oldlace: "stara čipka", + olive: "olivna", + olivedrab: "umazano olivna", + orange: "oranžna", + orangered: "oranžno-rdeča", + orchid: "orhidejasta", + palegoldenrod: "bleda zlata rozga", + palegreen: "bledo zelena", + paleturquoise: "bledo turkizna", + palevioletred: "bledo vijolično-rdeča", + papayawhip: "papaja", + peachpuff: "breskova", + peru: "perujska", + pink: "rožnata", + plum: "slivova", + powderblue: "kobaltovo modra", + purple: "škrlatna", + red: "rdeča", + rosybrown: "rožnato rjava", + royalblue: "kraljevsko modra", + saddlebrown: "sedlasto rjava", + salmon: "lososova", + sandybrown: "peščeno rjava", + seagreen: "morsko zelena", + seashell: "morska lupina", + sienna: "sienna", + silver: "srebrna", + skyblue: "nebeško modra", + slateblue: "skrilasto modra", + slategray: "skrilasto siva", + slategrey: "skrilasto siva", // same as slategray + snow: "snežena", + springgreen: "pomladno zelena", + steelblue: "kovinsko modra", + tan: "rumeno-rjava", + teal: "modrozelena", + thistle: "osatna", + tomato: "paradižnikova", + transparent: "prosojno", + turquoise: "turkizna", + violet: "vijolična", + wheat: "pšenična", + white: "bela", + whitesmoke: "megleno bela", + yellow: "rumena", + yellowgreen: "rumeno-zelena" +}) +); diff --git a/lib/dojo/nls/sv/colors.js b/lib/dojo/nls/sv/colors.js index 269e85c9..2269abbd 100644 --- a/lib/dojo/nls/sv/colors.js +++ b/lib/dojo/nls/sv/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"ljust stålblått","orangered":"orangerött","midnightblue":"midnattsblått","cadetblue":"kadettblått","seashell":"snäckskal","slategrey":"skiffergrått","coral":"korall","darkturquoise":"mörkturkost","antiquewhite":"antikvitt","mediumspringgreen":"mellanvårgrönt","salmon":"laxfärgat","darkgrey":"mörkgrått","ivory":"elfenbensvitt","greenyellow":"gröngult","mistyrose":"dunkelrosa","lightsalmon":"ljust laxfärgat","silver":"silver","dimgrey":"smutsgrått","orange":"orange","white":"vitt","navajowhite":"navajovitt","royalblue":"kungligt blått","deeppink":"djuprosa","lime":"lime","oldlace":"spetsvitt","chartreuse":"chartreuse","darkcyan":"mörkt cyan","yellow":"gult","linen":"linne","olive":"olivfärgat","gold":"guld","lawngreen":"gräsmattegrönt","lightyellow":"ljusgult","tan":"mellanbrunt","darkviolet":"mörkviolett","lightslategrey":"ljust skiffergrått","grey":"grått","darkkhaki":"mörkt kaki","green":"grönt","deepskyblue":"mörkt himmelsblått","aqua":"akvamarin","sienna":"sienna","mintcream":"mintgrädde","rosybrown":"rosenbrunt","mediumslateblue":"mellanskifferblått","magenta":"magenta","lightseagreen":"ljust havsgrönt","cyan":"cyan","olivedrab":"olivsmutsgult","darkgoldenrod":"mörkt gullris","slateblue":"skifferblått","mediumaquamarine":"mellanakvamarin","lavender":"lavendel","mediumseagreen":"mellanhavsgrönt","maroon":"rödbrunt","darkslategray":"mörkt skiffergrått","mediumturquoise":"mellanturkost","ghostwhite":"spökvitt","darkblue":"mörkblått","mediumvioletred":"mellanviolettrött","brown":"brunt","lightgray":"ljusgrått","sandybrown":"sandbrunt","pink":"rosa","firebrick":"tegelstensrött","indigo":"indigo","snow":"snö","darkorchid":"mörkt orkidé","turquoise":"turkost","chocolate":"choklad","springgreen":"vårgrönt","moccasin":"mockasin","navy":"marinblått","lemonchiffon":"citronchiffong","teal":"blågrönt","floralwhite":"blomvitt","cornflowerblue":"kornblått","paleturquoise":"blekturkost","purple":"lila","gainsboro":"gainsboro","plum":"plommon","red":"rött","blue":"blått","forestgreen":"skogsgrönt","darkgreen":"mörkgrönt","honeydew":"honungsdagg","darkseagreen":"mörkt havsgrönt","lightcoral":"ljuskorall","palevioletred":"blekviolettrött","mediumpurple":"mellanlila","saddlebrown":"sadelbrunt","darkmagenta":"mörk magenta","thistle":"tistel","whitesmoke":"vit rök","wheat":"vete","violet":"violett","lightskyblue":"ljust himmelsblått","goldenrod":"gullris","mediumblue":"mellanblått","skyblue":"himmelsblått","crimson":"karmosinrött","darksalmon":"mörkt laxfärgat","darkred":"mörkrött","darkslategrey":"mörkt skiffergrått","peru":"peru","lightgrey":"ljusgrått","lightgoldenrodyellow":"ljust gullrisgult","blanchedalmond":"skållad mandel","aliceblue":"aliceblå","bisque":"biskvi","slategray":"skiffergrått","palegoldenrod":"blekt gullris","darkorange":"mörkorange","aquamarine":"akvamarin","lightgreen":"ljusgrönt","burlywood":"träfärgat","dodgerblue":"dodgerblått","darkgray":"mörkgrått","lightcyan":"ljust cyan","powderblue":"pulverblått","blueviolet":"blåviolett","orchid":"orkidé","dimgray":"smutsgrått","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelskimrande","hotpink":"varmrosa","steelblue":"stålblått","tomato":"tomatrött","lightpink":"ljusrosa","limegreen":"limegrönt","indianred":"indianrött","papayawhip":"papayaröra","lightslategray":"ljust skiffergrått","gray":"grått","mediumorchid":"mellanorkidé","cornsilk":"gulvitt","black":"svart","seagreen":"havsgrönt","darkslateblue":"mörkt skifferblått","khaki":"kaki","lightblue":"ljusblått","palegreen":"blekgrönt","azure":"azurblått","peachpuff":"persika","darkolivegreen":"mörkt olivgrönt","yellowgreen":"gulgrönt"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/sv/colors",({aliceblue:"aliceblå",antiquewhite:"antikvitt",aqua:"akvamarin",aquamarine:"akvamarin",azure:"azurblått",beige:"beige",bisque:"biskvi",black:"svart",blanchedalmond:"skållad mandel",blue:"blått",blueviolet:"blåviolett",brown:"brunt",burlywood:"träfärgat",cadetblue:"kadettblått",chartreuse:"chartreuse",chocolate:"choklad",coral:"korall",cornflowerblue:"kornblått",cornsilk:"gulvitt",crimson:"karmosinrött",cyan:"cyan",darkblue:"mörkblått",darkcyan:"mörkt cyan",darkgoldenrod:"mörkt gullris",darkgray:"mörkgrått",darkgreen:"mörkgrönt",darkgrey:"mörkgrått",darkkhaki:"mörkt kaki",darkmagenta:"mörk magenta",darkolivegreen:"mörkt olivgrönt",darkorange:"mörkorange",darkorchid:"mörkt orkidé",darkred:"mörkrött",darksalmon:"mörkt laxfärgat",darkseagreen:"mörkt havsgrönt",darkslateblue:"mörkt skifferblått",darkslategray:"mörkt skiffergrått",darkslategrey:"mörkt skiffergrått",darkturquoise:"mörkturkost",darkviolet:"mörkviolett",deeppink:"djuprosa",deepskyblue:"mörkt himmelsblått",dimgray:"smutsgrått",dimgrey:"smutsgrått",dodgerblue:"dodgerblått",firebrick:"tegelstensrött",floralwhite:"blomvitt",forestgreen:"skogsgrönt",fuchsia:"fuchsia",gainsboro:"gainsboro",ghostwhite:"spökvitt",gold:"guld",goldenrod:"gullris",gray:"grått",green:"grönt",greenyellow:"gröngult",grey:"grått",honeydew:"honungsdagg",hotpink:"varmrosa",indianred:"indianrött",indigo:"indigo",ivory:"elfenbensvitt",khaki:"kaki",lavender:"lavendel",lavenderblush:"lavendelskimrande",lawngreen:"gräsmattegrönt",lemonchiffon:"citronchiffong",lightblue:"ljusblått",lightcoral:"ljuskorall",lightcyan:"ljust cyan",lightgoldenrodyellow:"ljust gullrisgult",lightgray:"ljusgrått",lightgreen:"ljusgrönt",lightgrey:"ljusgrått",lightpink:"ljusrosa",lightsalmon:"ljust laxfärgat",lightseagreen:"ljust havsgrönt",lightskyblue:"ljust himmelsblått",lightslategray:"ljust skiffergrått",lightslategrey:"ljust skiffergrått",lightsteelblue:"ljust stålblått",lightyellow:"ljusgult",lime:"lime",limegreen:"limegrönt",linen:"linne",magenta:"magenta",maroon:"rödbrunt",mediumaquamarine:"mellanakvamarin",mediumblue:"mellanblått",mediumorchid:"mellanorkidé",mediumpurple:"mellanlila",mediumseagreen:"mellanhavsgrönt",mediumslateblue:"mellanskifferblått",mediumspringgreen:"mellanvårgrönt",mediumturquoise:"mellanturkost",mediumvioletred:"mellanviolettrött",midnightblue:"midnattsblått",mintcream:"mintgrädde",mistyrose:"dunkelrosa",moccasin:"mockasin",navajowhite:"navajovitt",navy:"marinblått",oldlace:"spetsvitt",olive:"olivfärgat",olivedrab:"olivsmutsgult",orange:"orange",orangered:"orangerött",orchid:"orkidé",palegoldenrod:"blekt gullris",palegreen:"blekgrönt",paleturquoise:"blekturkost",palevioletred:"blekviolettrött",papayawhip:"papayaröra",peachpuff:"persika",peru:"peru",pink:"rosa",plum:"plommon",powderblue:"pulverblått",purple:"lila",red:"rött",rosybrown:"rosenbrunt",royalblue:"kungligt blått",saddlebrown:"sadelbrunt",salmon:"laxfärgat",sandybrown:"sandbrunt",seagreen:"havsgrönt",seashell:"snäckskal",sienna:"sienna",silver:"silver",skyblue:"himmelsblått",slateblue:"skifferblått",slategray:"skiffergrått",slategrey:"skiffergrått",snow:"snö",springgreen:"vårgrönt",steelblue:"stålblått",tan:"mellanbrunt",teal:"blågrönt",thistle:"tistel",tomato:"tomatrött",transparent:"transparent",turquoise:"turkost",violet:"violett",wheat:"vete",white:"vitt",whitesmoke:"vit rök",yellow:"gult",yellowgreen:"gulgrönt"})); \ No newline at end of file diff --git a/lib/dojo/nls/sv/colors.js.uncompressed.js b/lib/dojo/nls/sv/colors.js.uncompressed.js new file mode 100644 index 00000000..2aba2e33 --- /dev/null +++ b/lib/dojo/nls/sv/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/sv/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "aliceblå", + antiquewhite: "antikvitt", + aqua: "akvamarin", + aquamarine: "akvamarin", + azure: "azurblått", + beige: "beige", + bisque: "biskvi", + black: "svart", + blanchedalmond: "skållad mandel", + blue: "blått", + blueviolet: "blåviolett", + brown: "brunt", + burlywood: "träfärgat", + cadetblue: "kadettblått", + chartreuse: "chartreuse", + chocolate: "choklad", + coral: "korall", + cornflowerblue: "kornblått", + cornsilk: "gulvitt", + crimson: "karmosinrött", + cyan: "cyan", + darkblue: "mörkblått", + darkcyan: "mörkt cyan", + darkgoldenrod: "mörkt gullris", + darkgray: "mörkgrått", + darkgreen: "mörkgrönt", + darkgrey: "mörkgrått", // same as darkgray + darkkhaki: "mörkt kaki", + darkmagenta: "mörk magenta", + darkolivegreen: "mörkt olivgrönt", + darkorange: "mörkorange", + darkorchid: "mörkt orkidé", + darkred: "mörkrött", + darksalmon: "mörkt laxfärgat", + darkseagreen: "mörkt havsgrönt", + darkslateblue: "mörkt skifferblått", + darkslategray: "mörkt skiffergrått", + darkslategrey: "mörkt skiffergrått", // same as darkslategray + darkturquoise: "mörkturkost", + darkviolet: "mörkviolett", + deeppink: "djuprosa", + deepskyblue: "mörkt himmelsblått", + dimgray: "smutsgrått", + dimgrey: "smutsgrått", // same as dimgray + dodgerblue: "dodgerblått", + firebrick: "tegelstensrött", + floralwhite: "blomvitt", + forestgreen: "skogsgrönt", + fuchsia: "fuchsia", + gainsboro: "gainsboro", + ghostwhite: "spökvitt", + gold: "guld", + goldenrod: "gullris", + gray: "grått", + green: "grönt", + greenyellow: "gröngult", + grey: "grått", // same as gray + honeydew: "honungsdagg", + hotpink: "varmrosa", + indianred: "indianrött", + indigo: "indigo", + ivory: "elfenbensvitt", + khaki: "kaki", + lavender: "lavendel", + lavenderblush: "lavendelskimrande", + lawngreen: "gräsmattegrönt", + lemonchiffon: "citronchiffong", + lightblue: "ljusblått", + lightcoral: "ljuskorall", + lightcyan: "ljust cyan", + lightgoldenrodyellow: "ljust gullrisgult", + lightgray: "ljusgrått", + lightgreen: "ljusgrönt", + lightgrey: "ljusgrått", // same as lightgray + lightpink: "ljusrosa", + lightsalmon: "ljust laxfärgat", + lightseagreen: "ljust havsgrönt", + lightskyblue: "ljust himmelsblått", + lightslategray: "ljust skiffergrått", + lightslategrey: "ljust skiffergrått", // same as lightslategray + lightsteelblue: "ljust stålblått", + lightyellow: "ljusgult", + lime: "lime", + limegreen: "limegrönt", + linen: "linne", + magenta: "magenta", + maroon: "rödbrunt", + mediumaquamarine: "mellanakvamarin", + mediumblue: "mellanblått", + mediumorchid: "mellanorkidé", + mediumpurple: "mellanlila", + mediumseagreen: "mellanhavsgrönt", + mediumslateblue: "mellanskifferblått", + mediumspringgreen: "mellanvårgrönt", + mediumturquoise: "mellanturkost", + mediumvioletred: "mellanviolettrött", + midnightblue: "midnattsblått", + mintcream: "mintgrädde", + mistyrose: "dunkelrosa", + moccasin: "mockasin", + navajowhite: "navajovitt", + navy: "marinblått", + oldlace: "spetsvitt", + olive: "olivfärgat", + olivedrab: "olivsmutsgult", + orange: "orange", + orangered: "orangerött", + orchid: "orkidé", + palegoldenrod: "blekt gullris", + palegreen: "blekgrönt", + paleturquoise: "blekturkost", + palevioletred: "blekviolettrött", + papayawhip: "papayaröra", + peachpuff: "persika", + peru: "peru", + pink: "rosa", + plum: "plommon", + powderblue: "pulverblått", + purple: "lila", + red: "rött", + rosybrown: "rosenbrunt", + royalblue: "kungligt blått", + saddlebrown: "sadelbrunt", + salmon: "laxfärgat", + sandybrown: "sandbrunt", + seagreen: "havsgrönt", + seashell: "snäckskal", + sienna: "sienna", + silver: "silver", + skyblue: "himmelsblått", + slateblue: "skifferblått", + slategray: "skiffergrått", + slategrey: "skiffergrått", // same as slategray + snow: "snö", + springgreen: "vårgrönt", + steelblue: "stålblått", + tan: "mellanbrunt", + teal: "blågrönt", + thistle: "tistel", + tomato: "tomatrött", + transparent: "transparent", + turquoise: "turkost", + violet: "violett", + wheat: "vete", + white: "vitt", + whitesmoke: "vit rök", + yellow: "gult", + yellowgreen: "gulgrönt" +}) +); diff --git a/lib/dojo/nls/th/colors.js b/lib/dojo/nls/th/colors.js index 706ed8a6..be239a3b 100644 --- a/lib/dojo/nls/th/colors.js +++ b/lib/dojo/nls/th/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"light steel blue","orangered":"ส้มแกมแดง","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"เทาเข้ม","ivory":"งาช้าง","greenyellow":"เขียวแกมเหลือง","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"เงิน","dimgrey":"dim gray","orange":"ส้ม","white":"ขาว","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"ชมพูเข้ม","lime":"เหลืองมะนาว","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"เขียวแกมน้ำเงินเข้ม","yellow":"เหลือง","linen":"linen","olive":"โอลีฟ","gold":"ทอง","lawngreen":"lawn green","lightyellow":"เหลืองอ่อน","tan":"tan","darkviolet":"ม่วงเข้ม","lightslategrey":"light slate gray","grey":"เทา","darkkhaki":"dark khaki","green":"เขียว","deepskyblue":"deep sky blue","aqua":"ฟ้าน้ำทะเล","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"แดงแกมม่วง","lightseagreen":"light sea green","cyan":"เขียวแกมน้ำเงิน","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"ม่วงลาเวนเดอร์","mediumseagreen":"medium sea green","maroon":"น้ำตาลแดง","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"น้ำเงินเข้ม","mediumvioletred":"medium violet-red","brown":"น้ำตาล","lightgray":"เทาอ่อน","sandybrown":"sandy brown","pink":"ชมพู","firebrick":"สีอิฐ","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"ช็อกโกแลต","springgreen":"spring green","moccasin":"ม็อคค่า","navy":"น้ำเงินเข้ม","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"ม่วง","gainsboro":"gainsboro","plum":"plum","red":"แดง","blue":"น้ำเงิน","forestgreen":"forest green","darkgreen":"เขียวเข้ม","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"แดงแกมม่วงเข้ม","thistle":"thistle","whitesmoke":"ขาวควัน","wheat":"wheat","violet":"ม่วง","lightskyblue":"ฟ้าอ่อน","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"แดงเลือดหมู","darksalmon":"dark salmon","darkred":"แดงเข้ม","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"เทาอ่อน","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"ส้มเข้ม","aquamarine":"aquamarine","lightgreen":"เขียวอ่อน","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"เทาเข้ม","lightcyan":"เขียวแกมน้ำเงินอ่อน","powderblue":"powder blue","blueviolet":"น้ำเงินม่วง","orchid":"orchid","dimgray":"dim gray","beige":"น้ำตาลเบจ","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"ชมพูอ่อน","limegreen":"เขียวมะนาว","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"เทา","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"ดำ","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"น้ำเงินอ่อน","palegreen":"pale green","azure":"น้ำเงินฟ้า","peachpuff":"peach puff","darkolivegreen":"เขียวโอลีฟเข้ม","yellowgreen":"เหลืองแกมเขียว"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/th/colors",({aliceblue:"alice blue",antiquewhite:"antique white",aqua:"ฟ้าน้ำทะเล",aquamarine:"aquamarine",azure:"น้ำเงินฟ้า",beige:"น้ำตาลเบจ",bisque:"bisque",black:"ดำ",blanchedalmond:"blanched almond",blue:"น้ำเงิน",blueviolet:"น้ำเงินม่วง",brown:"น้ำตาล",burlywood:"burlywood",cadetblue:"cadet blue",chartreuse:"chartreuse",chocolate:"ช็อกโกแลต",coral:"coral",cornflowerblue:"cornflower blue",cornsilk:"cornsilk",crimson:"แดงเลือดหมู",cyan:"เขียวแกมน้ำเงิน",darkblue:"น้ำเงินเข้ม",darkcyan:"เขียวแกมน้ำเงินเข้ม",darkgoldenrod:"dark goldenrod",darkgray:"เทาเข้ม",darkgreen:"เขียวเข้ม",darkgrey:"เทาเข้ม",darkkhaki:"dark khaki",darkmagenta:"แดงแกมม่วงเข้ม",darkolivegreen:"เขียวโอลีฟเข้ม",darkorange:"ส้มเข้ม",darkorchid:"dark orchid",darkred:"แดงเข้ม",darksalmon:"dark salmon",darkseagreen:"dark sea green",darkslateblue:"dark slate blue",darkslategray:"dark slate gray",darkslategrey:"dark slate gray",darkturquoise:"dark turquoise",darkviolet:"ม่วงเข้ม",deeppink:"ชมพูเข้ม",deepskyblue:"deep sky blue",dimgray:"dim gray",dimgrey:"dim gray",dodgerblue:"dodger blue",firebrick:"สีอิฐ",floralwhite:"floral white",forestgreen:"forest green",fuchsia:"fuchsia",gainsboro:"gainsboro",ghostwhite:"ghost white",gold:"ทอง",goldenrod:"goldenrod",gray:"เทา",green:"เขียว",greenyellow:"เขียวแกมเหลือง",grey:"เทา",honeydew:"honeydew",hotpink:"hot pink",indianred:"indian red",indigo:"indigo",ivory:"งาช้าง",khaki:"khaki",lavender:"ม่วงลาเวนเดอร์",lavenderblush:"lavender blush",lawngreen:"lawn green",lemonchiffon:"lemon chiffon",lightblue:"น้ำเงินอ่อน",lightcoral:"light coral",lightcyan:"เขียวแกมน้ำเงินอ่อน",lightgoldenrodyellow:"light goldenrod yellow",lightgray:"เทาอ่อน",lightgreen:"เขียวอ่อน",lightgrey:"เทาอ่อน",lightpink:"ชมพูอ่อน",lightsalmon:"light salmon",lightseagreen:"light sea green",lightskyblue:"ฟ้าอ่อน",lightslategray:"light slate gray",lightslategrey:"light slate gray",lightsteelblue:"light steel blue",lightyellow:"เหลืองอ่อน",lime:"เหลืองมะนาว",limegreen:"เขียวมะนาว",linen:"linen",magenta:"แดงแกมม่วง",maroon:"น้ำตาลแดง",mediumaquamarine:"medium aquamarine",mediumblue:"medium blue",mediumorchid:"medium orchid",mediumpurple:"medium purple",mediumseagreen:"medium sea green",mediumslateblue:"medium slate blue",mediumspringgreen:"medium spring green",mediumturquoise:"medium turquoise",mediumvioletred:"medium violet-red",midnightblue:"midnight blue",mintcream:"mint cream",mistyrose:"misty rose",moccasin:"ม็อคค่า",navajowhite:"navajo white",navy:"น้ำเงินเข้ม",oldlace:"old lace",olive:"โอลีฟ",olivedrab:"olive drab",orange:"ส้ม",orangered:"ส้มแกมแดง",orchid:"orchid",palegoldenrod:"pale goldenrod",palegreen:"pale green",paleturquoise:"pale turquoise",palevioletred:"pale violet-red",papayawhip:"papaya whip",peachpuff:"peach puff",peru:"peru",pink:"ชมพู",plum:"plum",powderblue:"powder blue",purple:"ม่วง",red:"แดง",rosybrown:"rosy brown",royalblue:"royal blue",saddlebrown:"saddle brown",salmon:"salmon",sandybrown:"sandy brown",seagreen:"sea green",seashell:"seashell",sienna:"sienna",silver:"เงิน",skyblue:"sky blue",slateblue:"slate blue",slategray:"slate gray",slategrey:"slate gray",snow:"snow",springgreen:"spring green",steelblue:"steel blue",tan:"tan",teal:"teal",thistle:"thistle",tomato:"tomato",transparent:"สีใส",turquoise:"turquoise",violet:"ม่วง",wheat:"wheat",white:"ขาว",whitesmoke:"ขาวควัน",yellow:"เหลือง",yellowgreen:"เหลืองแกมเขียว"})); \ No newline at end of file diff --git a/lib/dojo/nls/th/colors.js.uncompressed.js b/lib/dojo/nls/th/colors.js.uncompressed.js new file mode 100644 index 00000000..3159be88 --- /dev/null +++ b/lib/dojo/nls/th/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/th/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "alice blue", + antiquewhite: "antique white", + aqua: "ฟ้าน้ำทะเล", + aquamarine: "aquamarine", + azure: "น้ำเงินฟ้า", + beige: "น้ำตาลเบจ", + bisque: "bisque", + black: "ดำ", + blanchedalmond: "blanched almond", + blue: "น้ำเงิน", + blueviolet: "น้ำเงินม่วง", + brown: "น้ำตาล", + burlywood: "burlywood", + cadetblue: "cadet blue", + chartreuse: "chartreuse", + chocolate: "ช็อกโกแลต", + coral: "coral", + cornflowerblue: "cornflower blue", + cornsilk: "cornsilk", + crimson: "แดงเลือดหมู", + cyan: "เขียวแกมน้ำเงิน", + darkblue: "น้ำเงินเข้ม", + darkcyan: "เขียวแกมน้ำเงินเข้ม", + darkgoldenrod: "dark goldenrod", + darkgray: "เทาเข้ม", + darkgreen: "เขียวเข้ม", + darkgrey: "เทาเข้ม", // same as darkgray + darkkhaki: "dark khaki", + darkmagenta: "แดงแกมม่วงเข้ม", + darkolivegreen: "เขียวโอลีฟเข้ม", + darkorange: "ส้มเข้ม", + darkorchid: "dark orchid", + darkred: "แดงเข้ม", + darksalmon: "dark salmon", + darkseagreen: "dark sea green", + darkslateblue: "dark slate blue", + darkslategray: "dark slate gray", + darkslategrey: "dark slate gray", // same as darkslategray + darkturquoise: "dark turquoise", + darkviolet: "ม่วงเข้ม", + deeppink: "ชมพูเข้ม", + deepskyblue: "deep sky blue", + dimgray: "dim gray", + dimgrey: "dim gray", // same as dimgray + dodgerblue: "dodger blue", + firebrick: "สีอิฐ", + floralwhite: "floral white", + forestgreen: "forest green", + fuchsia: "fuchsia", + gainsboro: "gainsboro", + ghostwhite: "ghost white", + gold: "ทอง", + goldenrod: "goldenrod", + gray: "เทา", + green: "เขียว", + greenyellow: "เขียวแกมเหลือง", + grey: "เทา", // same as gray + honeydew: "honeydew", + hotpink: "hot pink", + indianred: "indian red", + indigo: "indigo", + ivory: "งาช้าง", + khaki: "khaki", + lavender: "ม่วงลาเวนเดอร์", + lavenderblush: "lavender blush", + lawngreen: "lawn green", + lemonchiffon: "lemon chiffon", + lightblue: "น้ำเงินอ่อน", + lightcoral: "light coral", + lightcyan: "เขียวแกมน้ำเงินอ่อน", + lightgoldenrodyellow: "light goldenrod yellow", + lightgray: "เทาอ่อน", + lightgreen: "เขียวอ่อน", + lightgrey: "เทาอ่อน", // same as lightgray + lightpink: "ชมพูอ่อน", + lightsalmon: "light salmon", + lightseagreen: "light sea green", + lightskyblue: "ฟ้าอ่อน", + lightslategray: "light slate gray", + lightslategrey: "light slate gray", // same as lightslategray + lightsteelblue: "light steel blue", + lightyellow: "เหลืองอ่อน", + lime: "เหลืองมะนาว", + limegreen: "เขียวมะนาว", + linen: "linen", + magenta: "แดงแกมม่วง", + maroon: "น้ำตาลแดง", + mediumaquamarine: "medium aquamarine", + mediumblue: "medium blue", + mediumorchid: "medium orchid", + mediumpurple: "medium purple", + mediumseagreen: "medium sea green", + mediumslateblue: "medium slate blue", + mediumspringgreen: "medium spring green", + mediumturquoise: "medium turquoise", + mediumvioletred: "medium violet-red", + midnightblue: "midnight blue", + mintcream: "mint cream", + mistyrose: "misty rose", + moccasin: "ม็อคค่า", + navajowhite: "navajo white", + navy: "น้ำเงินเข้ม", + oldlace: "old lace", + olive: "โอลีฟ", + olivedrab: "olive drab", + orange: "ส้ม", + orangered: "ส้มแกมแดง", + orchid: "orchid", + palegoldenrod: "pale goldenrod", + palegreen: "pale green", + paleturquoise: "pale turquoise", + palevioletred: "pale violet-red", + papayawhip: "papaya whip", + peachpuff: "peach puff", + peru: "peru", + pink: "ชมพู", + plum: "plum", + powderblue: "powder blue", + purple: "ม่วง", + red: "แดง", + rosybrown: "rosy brown", + royalblue: "royal blue", + saddlebrown: "saddle brown", + salmon: "salmon", + sandybrown: "sandy brown", + seagreen: "sea green", + seashell: "seashell", + sienna: "sienna", + silver: "เงิน", + skyblue: "sky blue", + slateblue: "slate blue", + slategray: "slate gray", + slategrey: "slate gray", // same as slategray + snow: "snow", + springgreen: "spring green", + steelblue: "steel blue", + tan: "tan", + teal: "teal", + thistle: "thistle", + tomato: "tomato", + transparent: "สีใส", + turquoise: "turquoise", + violet: "ม่วง", + wheat: "wheat", + white: "ขาว", + whitesmoke: "ขาวควัน", + yellow: "เหลือง", + yellowgreen: "เหลืองแกมเขียว" +}) +); diff --git a/lib/dojo/nls/tr/colors.js b/lib/dojo/nls/tr/colors.js index a75f12ff..83ec98fd 100644 --- a/lib/dojo/nls/tr/colors.js +++ b/lib/dojo/nls/tr/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"açık metalik mavi","orangered":"turuncu kırmızı","midnightblue":"gece mavisi","cadetblue":"denizci mavisi","seashell":"deniz kabuğu","slategrey":"arduvaz grisi","coral":"mercan","darkturquoise":"koyu turkuaz","antiquewhite":"antik beyaz","mediumspringgreen":"orta bahar yeşili","salmon":"somon","darkgrey":"koyu gri","ivory":"fildişi","greenyellow":"yeşil-sarı","mistyrose":"gülkurusu","lightsalmon":"açık somon","silver":"gümüş","dimgrey":"soluk gri","orange":"turuncu","white":"beyaz","navajowhite":"navajo beyazı","royalblue":"parlak koyu mavi","deeppink":"koyu pembe","lime":"limon yeşili","oldlace":"eski dantel","chartreuse":"chartreuse","darkcyan":"koyu camgöbeği","yellow":"sarı","linen":"keten","olive":"zeytin","gold":"altın","lawngreen":"çimen yeşili","lightyellow":"açık sarı","tan":"güneş yanığı","darkviolet":"koyu eflatun","lightslategrey":"açık arduvaz grisi","grey":"gri","darkkhaki":"koyu haki","green":"yeşil","deepskyblue":"koyu gök mavisi","aqua":"deniz mavisi","sienna":"koyu kahve","mintcream":"naneli krem","rosybrown":"pembemsi kahverengi","mediumslateblue":"orta arduvaz mavisi","magenta":"macenta","lightseagreen":"açık deniz yeşili","cyan":"camgöbeği","olivedrab":"asker yeşili","darkgoldenrod":"koyu sarı","slateblue":"arduvaz mavisi","mediumaquamarine":"orta akuamarin","lavender":"lavanta","mediumseagreen":"orta deniz yeşili","maroon":"kestane","darkslategray":"koyu arduvaz grisi","mediumturquoise":"orta turkuaz","ghostwhite":"silik beyaz","darkblue":"koyu mavi","mediumvioletred":"orta menekşe kırmızısı","brown":"kahverengi","lightgray":"açık gri","sandybrown":"kum rengi","pink":"pembe","firebrick":"canlı kiremit","indigo":"çivit mavisi","snow":"kar","darkorchid":"koyu orkide","turquoise":"turkuaz","chocolate":"çikolata","springgreen":"bahar yeşili","moccasin":"mokosen","navy":"lacivert","lemonchiffon":"limoni","teal":"Teal mavi","floralwhite":"çiçek beyazı","cornflowerblue":"peygamber çiçeği mavisi","paleturquoise":"soluk turkuaz","purple":"mor","gainsboro":"gainsboro","plum":"erik","red":"kırmızı","blue":"mavi","forestgreen":"koyu deniz yeşili","darkgreen":"koyu yeşil","honeydew":"çam sakızı","darkseagreen":"koyu deniz yeşili","lightcoral":"açık mercan","palevioletred":"soluk menekşe kırmızısı","mediumpurple":"orta mor","saddlebrown":"açık kahve","darkmagenta":"koyu mor","thistle":"devedikeni","whitesmoke":"beyaz duman","wheat":"buğday","violet":"eflatun","lightskyblue":"açık gök mavisi","goldenrod":"sarısabır","mediumblue":"orta mavi","skyblue":"gök mavisi","crimson":"crimson","darksalmon":"koyu somon","darkred":"koyu kırmızı","darkslategrey":"koyu arduvaz grisi","peru":"peru","lightgrey":"açık gri","lightgoldenrodyellow":"açık sarısabır","blanchedalmond":"soluk badem","aliceblue":"alice mavisi","bisque":"bisküvi","slategray":"arduvaz grisi","palegoldenrod":"soluk sarısabır","darkorange":"koyu turuncu","aquamarine":"akuamarin","lightgreen":"açık yeşil","burlywood":"sarımsı kahverengi","dodgerblue":"toz mavisi","darkgray":"koyu gri","lightcyan":"açık camgöbeği","powderblue":"pudra mavisi","blueviolet":"mavi-mor","orchid":"orkide","dimgray":"soluk gri","beige":"bej","fuchsia":"fuşya","lavenderblush":"lavanta pembesi","hotpink":"sıcak pembe","steelblue":"metalik mavi","tomato":"domates","lightpink":"açık pembe","limegreen":"küf yeşili","indianred":"kızılderili kırmızısı","papayawhip":"papaya sapı","lightslategray":"açık arduvaz grisi","gray":"gri","mediumorchid":"orta orkide","cornsilk":"mısır rengi","black":"siyah","seagreen":"deniz yeşili","darkslateblue":"koyu arduvaz mavisi","khaki":"haki","lightblue":"açık mavi","palegreen":"soluk yeşil","azure":"azur mavisi","peachpuff":"açık şeftali","darkolivegreen":"koyu zeytin yeşili","yellowgreen":"sarı yeşil"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tr/colors",({aliceblue:"alice mavisi",antiquewhite:"antik beyaz",aqua:"deniz mavisi",aquamarine:"akuamarin",azure:"azur mavisi",beige:"bej",bisque:"bisküvi",black:"siyah",blanchedalmond:"soluk badem",blue:"mavi",blueviolet:"mavi-mor",brown:"kahverengi",burlywood:"sarımsı kahverengi",cadetblue:"denizci mavisi",chartreuse:"chartreuse",chocolate:"çikolata",coral:"mercan",cornflowerblue:"peygamber çiçeği mavisi",cornsilk:"mısır rengi",crimson:"crimson",cyan:"camgöbeği",darkblue:"koyu mavi",darkcyan:"koyu camgöbeği",darkgoldenrod:"koyu sarı",darkgray:"koyu gri",darkgreen:"koyu yeşil",darkgrey:"koyu gri",darkkhaki:"koyu haki",darkmagenta:"koyu mor",darkolivegreen:"koyu zeytin yeşili",darkorange:"koyu turuncu",darkorchid:"koyu orkide",darkred:"koyu kırmızı",darksalmon:"koyu somon",darkseagreen:"koyu deniz yeşili",darkslateblue:"koyu arduvaz mavisi",darkslategray:"koyu arduvaz grisi",darkslategrey:"koyu arduvaz grisi",darkturquoise:"koyu turkuaz",darkviolet:"koyu eflatun",deeppink:"koyu pembe",deepskyblue:"koyu gök mavisi",dimgray:"soluk gri",dimgrey:"soluk gri",dodgerblue:"toz mavisi",firebrick:"canlı kiremit",floralwhite:"çiçek beyazı",forestgreen:"koyu deniz yeşili",fuchsia:"fuşya",gainsboro:"gainsboro",ghostwhite:"silik beyaz",gold:"altın",goldenrod:"sarısabır",gray:"gri",green:"yeşil",greenyellow:"yeşil-sarı",grey:"gri",honeydew:"çam sakızı",hotpink:"sıcak pembe",indianred:"kızılderili kırmızısı",indigo:"çivit mavisi",ivory:"fildişi",khaki:"haki",lavender:"lavanta",lavenderblush:"lavanta pembesi",lawngreen:"çimen yeşili",lemonchiffon:"limoni",lightblue:"açık mavi",lightcoral:"açık mercan",lightcyan:"açık camgöbeği",lightgoldenrodyellow:"açık sarısabır",lightgray:"açık gri",lightgreen:"açık yeşil",lightgrey:"açık gri",lightpink:"açık pembe",lightsalmon:"açık somon",lightseagreen:"açık deniz yeşili",lightskyblue:"açık gök mavisi",lightslategray:"açık arduvaz grisi",lightslategrey:"açık arduvaz grisi",lightsteelblue:"açık metalik mavi",lightyellow:"açık sarı",lime:"limon yeşili",limegreen:"küf yeşili",linen:"keten",magenta:"macenta",maroon:"kestane",mediumaquamarine:"orta akuamarin",mediumblue:"orta mavi",mediumorchid:"orta orkide",mediumpurple:"orta mor",mediumseagreen:"orta deniz yeşili",mediumslateblue:"orta arduvaz mavisi",mediumspringgreen:"orta bahar yeşili",mediumturquoise:"orta turkuaz",mediumvioletred:"orta menekşe kırmızısı",midnightblue:"gece mavisi",mintcream:"naneli krem",mistyrose:"gülkurusu",moccasin:"mokosen",navajowhite:"navajo beyazı",navy:"lacivert",oldlace:"eski dantel",olive:"zeytin",olivedrab:"asker yeşili",orange:"turuncu",orangered:"turuncu kırmızı",orchid:"orkide",palegoldenrod:"soluk sarısabır",palegreen:"soluk yeşil",paleturquoise:"soluk turkuaz",palevioletred:"soluk menekşe kırmızısı",papayawhip:"papaya sapı",peachpuff:"açık şeftali",peru:"peru",pink:"pembe",plum:"erik",powderblue:"pudra mavisi",purple:"mor",red:"kırmızı",rosybrown:"pembemsi kahverengi",royalblue:"parlak koyu mavi",saddlebrown:"açık kahve",salmon:"somon",sandybrown:"kum rengi",seagreen:"deniz yeşili",seashell:"deniz kabuğu",sienna:"koyu kahve",silver:"gümüş",skyblue:"gök mavisi",slateblue:"arduvaz mavisi",slategray:"arduvaz grisi",slategrey:"arduvaz grisi",snow:"kar",springgreen:"bahar yeşili",steelblue:"metalik mavi",tan:"güneş yanığı",teal:"Teal mavi",thistle:"devedikeni",tomato:"domates",transparent:"saydam",turquoise:"turkuaz",violet:"eflatun",wheat:"buğday",white:"beyaz",whitesmoke:"beyaz duman",yellow:"sarı",yellowgreen:"sarı yeşil"})); \ No newline at end of file diff --git a/lib/dojo/nls/tr/colors.js.uncompressed.js b/lib/dojo/nls/tr/colors.js.uncompressed.js new file mode 100644 index 00000000..8b9020f0 --- /dev/null +++ b/lib/dojo/nls/tr/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/tr/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "alice mavisi", + antiquewhite: "antik beyaz", + aqua: "deniz mavisi", + aquamarine: "akuamarin", + azure: "azur mavisi", + beige: "bej", + bisque: "bisküvi", + black: "siyah", + blanchedalmond: "soluk badem", + blue: "mavi", + blueviolet: "mavi-mor", + brown: "kahverengi", + burlywood: "sarımsı kahverengi", + cadetblue: "denizci mavisi", + chartreuse: "chartreuse", + chocolate: "çikolata", + coral: "mercan", + cornflowerblue: "peygamber çiçeği mavisi", + cornsilk: "mısır rengi", + crimson: "crimson", + cyan: "camgöbeği", + darkblue: "koyu mavi", + darkcyan: "koyu camgöbeği", + darkgoldenrod: "koyu sarı", + darkgray: "koyu gri", + darkgreen: "koyu yeşil", + darkgrey: "koyu gri", // same as darkgray + darkkhaki: "koyu haki", + darkmagenta: "koyu mor", + darkolivegreen: "koyu zeytin yeşili", + darkorange: "koyu turuncu", + darkorchid: "koyu orkide", + darkred: "koyu kırmızı", + darksalmon: "koyu somon", + darkseagreen: "koyu deniz yeşili", + darkslateblue: "koyu arduvaz mavisi", + darkslategray: "koyu arduvaz grisi", + darkslategrey: "koyu arduvaz grisi", // same as darkslategray + darkturquoise: "koyu turkuaz", + darkviolet: "koyu eflatun", + deeppink: "koyu pembe", + deepskyblue: "koyu gök mavisi", + dimgray: "soluk gri", + dimgrey: "soluk gri", // same as dimgray + dodgerblue: "toz mavisi", + firebrick: "canlı kiremit", + floralwhite: "çiçek beyazı", + forestgreen: "koyu deniz yeşili", + fuchsia: "fuşya", + gainsboro: "gainsboro", + ghostwhite: "silik beyaz", + gold: "altın", + goldenrod: "sarısabır", + gray: "gri", + green: "yeşil", + greenyellow: "yeşil-sarı", + grey: "gri", // same as gray + honeydew: "çam sakızı", + hotpink: "sıcak pembe", + indianred: "kızılderili kırmızısı", + indigo: "çivit mavisi", + ivory: "fildişi", + khaki: "haki", + lavender: "lavanta", + lavenderblush: "lavanta pembesi", + lawngreen: "çimen yeşili", + lemonchiffon: "limoni", + lightblue: "açık mavi", + lightcoral: "açık mercan", + lightcyan: "açık camgöbeği", + lightgoldenrodyellow: "açık sarısabır", + lightgray: "açık gri", + lightgreen: "açık yeşil", + lightgrey: "açık gri", // same as lightgray + lightpink: "açık pembe", + lightsalmon: "açık somon", + lightseagreen: "açık deniz yeşili", + lightskyblue: "açık gök mavisi", + lightslategray: "açık arduvaz grisi", + lightslategrey: "açık arduvaz grisi", // same as lightslategray + lightsteelblue: "açık metalik mavi", + lightyellow: "açık sarı", + lime: "limon yeşili", + limegreen: "küf yeşili", + linen: "keten", + magenta: "macenta", + maroon: "kestane", + mediumaquamarine: "orta akuamarin", + mediumblue: "orta mavi", + mediumorchid: "orta orkide", + mediumpurple: "orta mor", + mediumseagreen: "orta deniz yeşili", + mediumslateblue: "orta arduvaz mavisi", + mediumspringgreen: "orta bahar yeşili", + mediumturquoise: "orta turkuaz", + mediumvioletred: "orta menekşe kırmızısı", + midnightblue: "gece mavisi", + mintcream: "naneli krem", + mistyrose: "gülkurusu", + moccasin: "mokosen", + navajowhite: "navajo beyazı", + navy: "lacivert", + oldlace: "eski dantel", + olive: "zeytin", + olivedrab: "asker yeşili", + orange: "turuncu", + orangered: "turuncu kırmızı", + orchid: "orkide", + palegoldenrod: "soluk sarısabır", + palegreen: "soluk yeşil", + paleturquoise: "soluk turkuaz", + palevioletred: "soluk menekşe kırmızısı", + papayawhip: "papaya sapı", + peachpuff: "açık şeftali", + peru: "peru", + pink: "pembe", + plum: "erik", + powderblue: "pudra mavisi", + purple: "mor", + red: "kırmızı", + rosybrown: "pembemsi kahverengi", + royalblue: "parlak koyu mavi", + saddlebrown: "açık kahve", + salmon: "somon", + sandybrown: "kum rengi", + seagreen: "deniz yeşili", + seashell: "deniz kabuğu", + sienna: "koyu kahve", + silver: "gümüş", + skyblue: "gök mavisi", + slateblue: "arduvaz mavisi", + slategray: "arduvaz grisi", + slategrey: "arduvaz grisi", // same as slategray + snow: "kar", + springgreen: "bahar yeşili", + steelblue: "metalik mavi", + tan: "güneş yanığı", + teal: "Teal mavi", + thistle: "devedikeni", + tomato: "domates", + transparent: "saydam", + turquoise: "turkuaz", + violet: "eflatun", + wheat: "buğday", + white: "beyaz", + whitesmoke: "beyaz duman", + yellow: "sarı", + yellowgreen: "sarı yeşil" +}) +); diff --git a/lib/dojo/nls/tt-rss-layer_ROOT.js b/lib/dojo/nls/tt-rss-layer_ROOT.js index 5cd71420..ebad6b97 100644 --- a/lib/dojo/nls/tt-rss-layer_ROOT.js +++ b/lib/dojo/nls/tt-rss-layer_ROOT.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_ROOT");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ROOT");dojo.nls.colors.ROOT={"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ROOT");dijit.nls.loading.ROOT={"loadingState":"Loading...","errorState":"Sorry, an error occurred"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ROOT");dijit.nls.common.ROOT={"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ROOT");dijit.form.nls.validate.ROOT={"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ROOT");dijit.form.nls.ComboBox.ROOT={"previousMessage":"Previous choices","nextMessage":"More choices"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ROOT");dojo.cldr.nls.number.ROOT={"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_ROOT",{"dijit/form/nls/validate":{"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."},"dijit/nls/loading":{"loadingState":"Loading...","errorState":"Sorry, an error occurred"},"dojo/nls/colors":{"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"transparent","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Previous choices","nextMessage":"More choices"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_ROOT.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_ROOT.js.uncompressed.js new file mode 100644 index 00000000..2ba5f2ac --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_ROOT.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_ROOT',{ +'dijit/form/nls/validate':{"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."} +, +'dijit/nls/loading':{"loadingState":"Loading...","errorState":"Sorry, an error occurred"} +, +'dojo/nls/colors':{"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"transparent","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Previous choices","nextMessage":"More choices"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_ar.js b/lib/dojo/nls/tt-rss-layer_ar.js index 464e3164..727ea2bb 100644 --- a/lib/dojo/nls/tt-rss-layer_ar.js +++ b/lib/dojo/nls/tt-rss-layer_ar.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_ar");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ar");dojo.nls.colors.ar={"lightsteelblue":"أزرق معدني فاتح","orangered":"أحمر مائل للبرتقالي","midnightblue":"أزرق بحري","cadetblue":"أزرق ملون بالرمادي","seashell":"أبيض مائل للأصفر فاتح","slategrey":"رمادي اردوازي","coral":"مرجاني","darkturquoise":"تركواز داكن","antiquewhite":"أبيض عتيق","mediumspringgreen":"أخضر ربيعي متوسط","salmon":"برتقالي وردي شاحب","darkgrey":"رمادي داكن","ivory":"عاجي","greenyellow":"أخضر مائل للأصفر","mistyrose":"وردي","lightsalmon":"فضي فاتح","silver":"فضي","dimgrey":"رمادي شاحب","orange":"برتقالي","white":"أبيض","navajowhite":"أبيض ملاحي","royalblue":"أزرق ملكي","deeppink":"أحمر وردي غامق","lime":"ليموني","oldlace":"برتقالي مائل للأصفر شاحب","chartreuse":"أخضر مائل للصفرة","darkcyan":"أزرق سماوي داكن","yellow":"أصفر","linen":"كتاني","olive":"أخضر زيتوني داكن","gold":"ذهبي","lawngreen":"أخضر بلون العشب","lightyellow":"أصفر فاتح","tan":"خمري","darkviolet":"بنفسجي داكن","lightslategrey":"رمادي اردوازي فاتح","grey":"رمادي","darkkhaki":"كاكي داكن","green":"أخضر","deepskyblue":"أزرق سماوي غامق","aqua":"أزرق مائي","sienna":"بني محروق","mintcream":"أصفر شاحب مائل للأخضر الزرعي","rosybrown":"بني وردي","mediumslateblue":"أزرق اردوازي متوسط","magenta":"أحمر قرمزي","lightseagreen":"أخضر مائل للأزرق فاتح","cyan":"أزرق سماوي","olivedrab":"أسود فاتح","darkgoldenrod":"أصفر ذهبي داكن","slateblue":"أزرق اردوازي","mediumaquamarine":"أزرق مائل للأخضر (زبرجد) متوسط","lavender":"أرجواني شاحب","mediumseagreen":"أخضر مائل للأزرق متوسط","maroon":"أحمر داكن","darkslategray":"رمادي اردوازي داكن","mediumturquoise":"تركواز متوسط","ghostwhite":"أبيض شفاف","darkblue":"أزرق داكن","mediumvioletred":"أحمر-بنفسجي متوسط","brown":"بني","lightgray":"رمادي فاتح","sandybrown":"بني مائل للصفرة","pink":"وردي","firebrick":"أصفر زاهي","indigo":"نيلي","snow":"أبيض ثلجي","darkorchid":"أرجواني داكن","turquoise":"تركواز","chocolate":"بني غامق","springgreen":"أخضر ربيعي","moccasin":"نحاسي أحمر","navy":"أزرق داكن","lemonchiffon":"أصفر شفاف","teal":"بترولي","floralwhite":"أبيض زهري","cornflowerblue":"أزرق عنبري","paleturquoise":"تركواز شاحب","purple":"ارجواني","gainsboro":"رمادي مائل للأزرق فاتح","plum":"أرجواني داكن","red":"أحمر","blue":"أزرق","forestgreen":"أخضر بلون أشجار الغابات","darkgreen":"أخضر داكن","honeydew":"أبيض مائل للأخضر","darkseagreen":"أخضر مائل للأزرق داكن","lightcoral":"مرجاني فاتح","palevioletred":"أحمر-بنفسجي شاحب","mediumpurple":"قرمزي متوسط","saddlebrown":"بني فاتح","darkmagenta":"قرمزي داكن","thistle":"ارجواني شاحب","whitesmoke":"دخان أبيض","wheat":"أخضر قمحي","violet":"بنفسجي","lightskyblue":"أزرق سماوي فاتح","goldenrod":"أصفر ذهبي","mediumblue":"أزرق متوسط","skyblue":"أزرق سماوي","crimson":"قرمزي","darksalmon":"فضي داكن","darkred":"أحمر داكن","darkslategrey":"رمادي اردوازي داكن","peru":"بني جملي","lightgrey":"رمادي فاتح","lightgoldenrodyellow":"أصفر ذهبي فاتح","blanchedalmond":"أخضر مائل للبياض","aliceblue":"أزرق فاتح","bisque":"أصفر برتقالي الى رمادي مصفر","slategray":"رمادي اردوازي","palegoldenrod":"أصفر ذهبي شاحب","darkorange":"برتقالي داكن","aquamarine":"أزرق مائل للأخضر (زبرجد)","lightgreen":"أخضر فاتح","burlywood":"خشبي","dodgerblue":"أزرق عنبري","darkgray":"رمادي داكن","lightcyan":"سماوي فاتح","powderblue":"أزرق مائل للأصفر","blueviolet":"أزرق-بنفسجي","orchid":"أرجواني فاتح","dimgray":"رمادي شاحب","beige":"بيج","fuchsia":"فوشيا","lavenderblush":"أحمر أرجواني","hotpink":"أحمر وردي زاهي","steelblue":"أزرق معدني","tomato":"أحمر مائل للأصفر","lightpink":"وردي فاتح","limegreen":"أخضر ليموني","indianred":"أحمر هندي","papayawhip":"خوخي فاتح","lightslategray":"رمادي اردوازي فاتح","gray":"رمادي","mediumorchid":"أرجواني متوسط","cornsilk":"حريري","black":"أسود","seagreen":"أخضر مائل للأزرق","darkslateblue":"أزرق اردوازي داكن","khaki":"كاكي","lightblue":"أزرق فاتح","palegreen":"أخضر شاحب","azure":"أزرق سماوي","peachpuff":"خوخي مائل للأصفر","darkolivegreen":"أخضر زيتوني داكن","yellowgreen":"أخضر مائل للأصفر"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ar");dijit.nls.loading.ar={"loadingState":"جاري التحميل...","errorState":"عفوا، حدث خطأ"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ar");dijit.nls.common.ar={"buttonOk":"حسنا","buttonCancel":"الغاء","buttonSave":"حفظ","itemClose":"اغلاق"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ar");dijit.form.nls.validate.ar={"rangeMessage":"هذه القيمة ليس بالمدى الصحيح.","invalidMessage":"القيمة التي تم ادخالها غير صحيحة.","missingMessage":"يجب ادخال هذه القيمة."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ar");dijit.form.nls.ComboBox.ar={"previousMessage":"الاختيارات السابقة","nextMessage":"مزيد من الاختيارات"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ar");dojo.cldr.nls.number.ar={"group":"٬","percentSign":"٪","exponential":"اس","list":"؛","infinity":"∞","minusSign":"-","decimal":"٫","nan":"ليس رقم","perMille":"؉","decimalFormat":"#,##0.###;#,##0.###-","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","plusSign":"+","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nativeZeroDigit":"0","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","percentFormat":"#,##0%","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_ar",{"dijit/form/nls/validate":{"rangeMessage":"هذه القيمة ليس بالمدى الصحيح.","invalidMessage":"القيمة التي تم ادخالها غير صحيحة.","missingMessage":"يجب ادخال هذه القيمة."},"dijit/nls/loading":{"loadingState":"جاري التحميل...","errorState":"عفوا، حدث خطأ"},"dojo/nls/colors":{"lightsteelblue":"أزرق معدني فاتح","orangered":"أحمر مائل للبرتقالي","midnightblue":"أزرق بحري","cadetblue":"أزرق ملون بالرمادي","seashell":"أبيض مائل للأصفر فاتح","slategrey":"رمادي اردوازي","coral":"مرجاني","darkturquoise":"تركواز داكن","antiquewhite":"أبيض عتيق","mediumspringgreen":"أخضر ربيعي متوسط","transparent":"شفاف","salmon":"برتقالي وردي شاحب","darkgrey":"رمادي داكن","ivory":"عاجي","greenyellow":"أخضر مائل للأصفر","mistyrose":"وردي","lightsalmon":"فضي فاتح","silver":"فضي","dimgrey":"رمادي شاحب","orange":"برتقالي","white":"أبيض","navajowhite":"أبيض ملاحي","royalblue":"أزرق ملكي","deeppink":"أحمر وردي غامق","lime":"ليموني","oldlace":"برتقالي مائل للأصفر شاحب","chartreuse":"أخضر مائل للصفرة","darkcyan":"أزرق سماوي داكن","yellow":"أصفر","linen":"كتاني","olive":"أخضر زيتوني داكن","gold":"ذهبي","lawngreen":"أخضر بلون العشب","lightyellow":"أصفر فاتح","tan":"خمري","darkviolet":"بنفسجي داكن","lightslategrey":"رمادي اردوازي فاتح","grey":"رمادي","darkkhaki":"كاكي داكن","green":"أخضر","deepskyblue":"أزرق سماوي غامق","aqua":"أزرق مائي","sienna":"بني محروق","mintcream":"أصفر شاحب مائل للأخضر الزرعي","rosybrown":"بني وردي","mediumslateblue":"أزرق اردوازي متوسط","magenta":"أحمر قرمزي","lightseagreen":"أخضر مائل للأزرق فاتح","cyan":"أزرق سماوي","olivedrab":"أسود فاتح","darkgoldenrod":"أصفر ذهبي داكن","slateblue":"أزرق اردوازي","mediumaquamarine":"أزرق مائل للأخضر (زبرجد) متوسط","lavender":"أرجواني شاحب","mediumseagreen":"أخضر مائل للأزرق متوسط","maroon":"أحمر داكن","darkslategray":"رمادي اردوازي داكن","mediumturquoise":"تركواز متوسط","ghostwhite":"أبيض شفاف","darkblue":"أزرق داكن","mediumvioletred":"أحمر-بنفسجي متوسط","brown":"بني","lightgray":"رمادي فاتح","sandybrown":"بني مائل للصفرة","pink":"وردي","firebrick":"أصفر زاهي","indigo":"نيلي","snow":"أبيض ثلجي","darkorchid":"أرجواني داكن","turquoise":"تركواز","chocolate":"بني غامق","springgreen":"أخضر ربيعي","moccasin":"نحاسي أحمر","navy":"أزرق داكن","lemonchiffon":"أصفر شفاف","teal":"بترولي","floralwhite":"أبيض زهري","cornflowerblue":"أزرق عنبري","paleturquoise":"تركواز شاحب","purple":"ارجواني","gainsboro":"رمادي مائل للأزرق فاتح","plum":"أرجواني داكن","red":"أحمر","blue":"أزرق","forestgreen":"أخضر بلون أشجار الغابات","darkgreen":"أخضر داكن","honeydew":"أبيض مائل للأخضر","darkseagreen":"أخضر مائل للأزرق داكن","lightcoral":"مرجاني فاتح","palevioletred":"أحمر-بنفسجي شاحب","mediumpurple":"قرمزي متوسط","saddlebrown":"بني فاتح","darkmagenta":"قرمزي داكن","thistle":"ارجواني شاحب","whitesmoke":"دخان أبيض","wheat":"أخضر قمحي","violet":"بنفسجي","lightskyblue":"أزرق سماوي فاتح","goldenrod":"أصفر ذهبي","mediumblue":"أزرق متوسط","skyblue":"أزرق سماوي","crimson":"قرمزي","darksalmon":"فضي داكن","darkred":"أحمر داكن","darkslategrey":"رمادي اردوازي داكن","peru":"بني جملي","lightgrey":"رمادي فاتح","lightgoldenrodyellow":"أصفر ذهبي فاتح","blanchedalmond":"أخضر مائل للبياض","aliceblue":"أزرق فاتح","bisque":"أصفر برتقالي الى رمادي مصفر","slategray":"رمادي اردوازي","palegoldenrod":"أصفر ذهبي شاحب","darkorange":"برتقالي داكن","aquamarine":"أزرق مائل للأخضر (زبرجد)","lightgreen":"أخضر فاتح","burlywood":"خشبي","dodgerblue":"أزرق عنبري","darkgray":"رمادي داكن","lightcyan":"سماوي فاتح","powderblue":"أزرق مائل للأصفر","blueviolet":"أزرق-بنفسجي","orchid":"أرجواني فاتح","dimgray":"رمادي شاحب","beige":"بيج","fuchsia":"فوشيا","lavenderblush":"أحمر أرجواني","hotpink":"أحمر وردي زاهي","steelblue":"أزرق معدني","tomato":"أحمر مائل للأصفر","lightpink":"وردي فاتح","limegreen":"أخضر ليموني","indianred":"أحمر هندي","papayawhip":"خوخي فاتح","lightslategray":"رمادي اردوازي فاتح","gray":"رمادي","mediumorchid":"أرجواني متوسط","cornsilk":"حريري","black":"أسود","seagreen":"أخضر مائل للأزرق","darkslateblue":"أزرق اردوازي داكن","khaki":"كاكي","lightblue":"أزرق فاتح","palegreen":"أخضر شاحب","azure":"أزرق سماوي","peachpuff":"خوخي مائل للأصفر","darkolivegreen":"أخضر زيتوني داكن","yellowgreen":"أخضر مائل للأصفر"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":"؛","percentSign":"٪","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"ليس رقم","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"؉","group":"٬","percentFormat":"#,##0%","decimalFormat":"#,##0.###;#,##0.###-","decimal":"٫","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"اس"},"dijit/form/nls/ComboBox":{"previousMessage":"الاختيارات السابقة","nextMessage":"مزيد من الاختيارات"},"dijit/nls/common":{"buttonOk":"حسنا","buttonCancel":"الغاء","buttonSave":"حفظ","itemClose":"اغلاق"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_ar.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_ar.js.uncompressed.js new file mode 100644 index 00000000..10b2df03 --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_ar.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_ar',{ +'dijit/form/nls/validate':{"rangeMessage":"هذه القيمة ليس بالمدى الصحيح.","invalidMessage":"القيمة التي تم ادخالها غير صحيحة.","missingMessage":"يجب ادخال هذه القيمة."} +, +'dijit/nls/loading':{"loadingState":"جاري التحميل...","errorState":"عفوا، حدث خطأ"} +, +'dojo/nls/colors':{"lightsteelblue":"أزرق معدني فاتح","orangered":"أحمر مائل للبرتقالي","midnightblue":"أزرق بحري","cadetblue":"أزرق ملون بالرمادي","seashell":"أبيض مائل للأصفر فاتح","slategrey":"رمادي اردوازي","coral":"مرجاني","darkturquoise":"تركواز داكن","antiquewhite":"أبيض عتيق","mediumspringgreen":"أخضر ربيعي متوسط","transparent":"شفاف","salmon":"برتقالي وردي شاحب","darkgrey":"رمادي داكن","ivory":"عاجي","greenyellow":"أخضر مائل للأصفر","mistyrose":"وردي","lightsalmon":"فضي فاتح","silver":"فضي","dimgrey":"رمادي شاحب","orange":"برتقالي","white":"أبيض","navajowhite":"أبيض ملاحي","royalblue":"أزرق ملكي","deeppink":"أحمر وردي غامق","lime":"ليموني","oldlace":"برتقالي مائل للأصفر شاحب","chartreuse":"أخضر مائل للصفرة","darkcyan":"أزرق سماوي داكن","yellow":"أصفر","linen":"كتاني","olive":"أخضر زيتوني داكن","gold":"ذهبي","lawngreen":"أخضر بلون العشب","lightyellow":"أصفر فاتح","tan":"خمري","darkviolet":"بنفسجي داكن","lightslategrey":"رمادي اردوازي فاتح","grey":"رمادي","darkkhaki":"كاكي داكن","green":"أخضر","deepskyblue":"أزرق سماوي غامق","aqua":"أزرق مائي","sienna":"بني محروق","mintcream":"أصفر شاحب مائل للأخضر الزرعي","rosybrown":"بني وردي","mediumslateblue":"أزرق اردوازي متوسط","magenta":"أحمر قرمزي","lightseagreen":"أخضر مائل للأزرق فاتح","cyan":"أزرق سماوي","olivedrab":"أسود فاتح","darkgoldenrod":"أصفر ذهبي داكن","slateblue":"أزرق اردوازي","mediumaquamarine":"أزرق مائل للأخضر (زبرجد) متوسط","lavender":"أرجواني شاحب","mediumseagreen":"أخضر مائل للأزرق متوسط","maroon":"أحمر داكن","darkslategray":"رمادي اردوازي داكن","mediumturquoise":"تركواز متوسط","ghostwhite":"أبيض شفاف","darkblue":"أزرق داكن","mediumvioletred":"أحمر-بنفسجي متوسط","brown":"بني","lightgray":"رمادي فاتح","sandybrown":"بني مائل للصفرة","pink":"وردي","firebrick":"أصفر زاهي","indigo":"نيلي","snow":"أبيض ثلجي","darkorchid":"أرجواني داكن","turquoise":"تركواز","chocolate":"بني غامق","springgreen":"أخضر ربيعي","moccasin":"نحاسي أحمر","navy":"أزرق داكن","lemonchiffon":"أصفر شفاف","teal":"بترولي","floralwhite":"أبيض زهري","cornflowerblue":"أزرق عنبري","paleturquoise":"تركواز شاحب","purple":"ارجواني","gainsboro":"رمادي مائل للأزرق فاتح","plum":"أرجواني داكن","red":"أحمر","blue":"أزرق","forestgreen":"أخضر بلون أشجار الغابات","darkgreen":"أخضر داكن","honeydew":"أبيض مائل للأخضر","darkseagreen":"أخضر مائل للأزرق داكن","lightcoral":"مرجاني فاتح","palevioletred":"أحمر-بنفسجي شاحب","mediumpurple":"قرمزي متوسط","saddlebrown":"بني فاتح","darkmagenta":"قرمزي داكن","thistle":"ارجواني شاحب","whitesmoke":"دخان أبيض","wheat":"أخضر قمحي","violet":"بنفسجي","lightskyblue":"أزرق سماوي فاتح","goldenrod":"أصفر ذهبي","mediumblue":"أزرق متوسط","skyblue":"أزرق سماوي","crimson":"قرمزي","darksalmon":"فضي داكن","darkred":"أحمر داكن","darkslategrey":"رمادي اردوازي داكن","peru":"بني جملي","lightgrey":"رمادي فاتح","lightgoldenrodyellow":"أصفر ذهبي فاتح","blanchedalmond":"أخضر مائل للبياض","aliceblue":"أزرق فاتح","bisque":"أصفر برتقالي الى رمادي مصفر","slategray":"رمادي اردوازي","palegoldenrod":"أصفر ذهبي شاحب","darkorange":"برتقالي داكن","aquamarine":"أزرق مائل للأخضر (زبرجد)","lightgreen":"أخضر فاتح","burlywood":"خشبي","dodgerblue":"أزرق عنبري","darkgray":"رمادي داكن","lightcyan":"سماوي فاتح","powderblue":"أزرق مائل للأصفر","blueviolet":"أزرق-بنفسجي","orchid":"أرجواني فاتح","dimgray":"رمادي شاحب","beige":"بيج","fuchsia":"فوشيا","lavenderblush":"أحمر أرجواني","hotpink":"أحمر وردي زاهي","steelblue":"أزرق معدني","tomato":"أحمر مائل للأصفر","lightpink":"وردي فاتح","limegreen":"أخضر ليموني","indianred":"أحمر هندي","papayawhip":"خوخي فاتح","lightslategray":"رمادي اردوازي فاتح","gray":"رمادي","mediumorchid":"أرجواني متوسط","cornsilk":"حريري","black":"أسود","seagreen":"أخضر مائل للأزرق","darkslateblue":"أزرق اردوازي داكن","khaki":"كاكي","lightblue":"أزرق فاتح","palegreen":"أخضر شاحب","azure":"أزرق سماوي","peachpuff":"خوخي مائل للأصفر","darkolivegreen":"أخضر زيتوني داكن","yellowgreen":"أخضر مائل للأصفر"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":"؛","percentSign":"٪","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"ليس رقم","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"؉","group":"٬","percentFormat":"#,##0%","decimalFormat":"#,##0.###;#,##0.###-","decimal":"٫","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"اس"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"الاختيارات السابقة","nextMessage":"مزيد من الاختيارات"} +, +'dijit/nls/common':{"buttonOk":"حسنا","buttonCancel":"الغاء","buttonSave":"حفظ","itemClose":"اغلاق"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_ca.js b/lib/dojo/nls/tt-rss-layer_ca.js index 4cc75904..43450691 100644 --- a/lib/dojo/nls/tt-rss-layer_ca.js +++ b/lib/dojo/nls/tt-rss-layer_ca.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_ca");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ca");dojo.nls.colors.ca={"lightsteelblue":"blau acer clar","orangered":"taronja vermellós","midnightblue":"blau mitjanit","cadetblue":"blau marí","seashell":"petxina marina","slategrey":"gris pissarra","coral":"corall","darkturquoise":"turquesa fosc","antiquewhite":"blanc antic","mediumspringgreen":"verd primavera mitjà","salmon":"salmó","darkgrey":"gris fosc","ivory":"marbre","greenyellow":"verd grogós","mistyrose":"rosa dens","lightsalmon":"salmó clar","silver":"argent","dimgrey":"gris fosc","orange":"taronja","white":"blanc","navajowhite":"blanc Navajo","royalblue":"blau marí intens","deeppink":"rosa profund","lime":"verd llimona","oldlace":"rosa cremós","chartreuse":"Llimona pàl·lid","darkcyan":"cian fosc","yellow":"groc","linen":"lli","olive":"oliva","gold":"daurat","lawngreen":"verd gespa","lightyellow":"groc clar","tan":"tan","darkviolet":"violeta fosc","lightslategrey":"gris pissarra clar","grey":"gris","darkkhaki":"caqui fosc","green":"verd","deepskyblue":"blau cel profund","aqua":"aigua","sienna":"siena","mintcream":"menta pàl·lid","rosybrown":"marró rosat","mediumslateblue":"blau pissarra mitjà","magenta":"magenta","lightseagreen":"verd marí clar","cyan":"cian","olivedrab":"gris oliva","darkgoldenrod":"ocre fosc","slateblue":"blau pissarra","mediumaquamarine":"aiguamarina mitjana","lavender":"lavanda","mediumseagreen":"verd marí mitjà","maroon":"marró vermellós","darkslategray":"gris pissarra fosc","mediumturquoise":"turquesa mitjana","ghostwhite":"blanc fantasma","darkblue":"blau fosc","mediumvioletred":"vermell violeta mitjà","brown":"marró","lightgray":"gris clar","sandybrown":"marró arenós","pink":"rosa","firebrick":"maó refractari","indigo":"índigo","snow":"neu","darkorchid":"orquídia fosc","turquoise":"turquesa","chocolate":"xocolata","springgreen":"verd de primavera","moccasin":"mocassí","navy":"blau marí","lemonchiffon":"groc brisa","teal":"verd blavós","floralwhite":"blanc floral","cornflowerblue":"blau blauet","paleturquoise":"turquesa pàl·lid","purple":"porpra","gainsboro":"gainsboro","plum":"pruna","red":"vermell","blue":"blau","forestgreen":"verd bosc","darkgreen":"verd fosc","honeydew":"rosada de mel","darkseagreen":"verd marí fosc","lightcoral":"corall clar","palevioletred":"vermell porpra pàl·lid","mediumpurple":"porpra mitjana","saddlebrown":"marró mitjà","darkmagenta":"magenta fosc","thistle":"card","whitesmoke":"blanc fumat","wheat":"blat","violet":"violeta","lightskyblue":"blau cel clar","goldenrod":"ocre","mediumblue":"blau mitjà","skyblue":"blau cel","crimson":"carmesí","darksalmon":"salmó fosc","darkred":"vermell fosc","darkslategrey":"gris pissarra fosc","peru":"Perú","lightgrey":"gris clar","lightgoldenrodyellow":"groc ocre clar","blanchedalmond":"ametlla pàl·lid","aliceblue":"blau cian clar","bisque":"crema","slategray":"gris pissarra","palegoldenrod":"ocre pàl·lid","darkorange":"taronja fosc","aquamarine":"aiguamarina","lightgreen":"verd clar","burlywood":"marró arenós","dodgerblue":"blau Dodger","darkgray":"gris fosc","lightcyan":"cian clar","powderblue":"blau grisós","blueviolet":"blau violeta","orchid":"orquídia","dimgray":"gris fosc","beige":"beix","fuchsia":"fúcsia","lavenderblush":"lavanda vermellosa","hotpink":"rosa fúcsia","steelblue":"blau acer","tomato":"tomàquet","lightpink":"rosa clar","limegreen":"verd llimona verda","indianred":"vermell indi","papayawhip":"préssec pastel","lightslategray":"gris pissarra clar","gray":"gris","mediumorchid":"orquídia mitjana","cornsilk":"cru","black":"negre","seagreen":"verd marí","darkslateblue":"blau pissarra fosc","khaki":"caqui","lightblue":"blau clar","palegreen":"verd pàl·lid","azure":"atzur","peachpuff":"préssec","darkolivegreen":"verd oliva fosc","yellowgreen":"verd grogós"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ca");dijit.nls.loading.ca={"loadingState":"S'està carregant...","errorState":"Ens sap greu. S'ha produït un error."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ca");dijit.nls.common.ca={"buttonOk":"D'acord","buttonCancel":"Cancel·la","buttonSave":"Desa","itemClose":"Tanca"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ca");dijit.form.nls.validate.ca={"rangeMessage":"Aquest valor és fora de l'interval","invalidMessage":"El valor introduït no és vàlid","missingMessage":"Aquest valor és necessari"};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ca");dijit.form.nls.ComboBox.ca={"previousMessage":"Opcions anteriors","nextMessage":"Més opcions"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ca");dojo.cldr.nls.number.ca={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_ca",{"dijit/form/nls/validate":{"rangeMessage":"Aquest valor és fora de l'interval","invalidMessage":"El valor introduït no és vàlid","missingMessage":"Aquest valor és necessari"},"dijit/nls/loading":{"loadingState":"S'està carregant...","errorState":"Ens sap greu. S'ha produït un error."},"dojo/nls/colors":{"lightsteelblue":"blau acer clar","orangered":"taronja vermellós","midnightblue":"blau mitjanit","cadetblue":"blau marí","seashell":"petxina marina","slategrey":"gris pissarra","coral":"corall","darkturquoise":"turquesa fosc","antiquewhite":"blanc antic","mediumspringgreen":"verd primavera mitjà","transparent":"transparent","salmon":"salmó","darkgrey":"gris fosc","ivory":"marbre","greenyellow":"verd grogós","mistyrose":"rosa dens","lightsalmon":"salmó clar","silver":"argent","dimgrey":"gris fosc","orange":"taronja","white":"blanc","navajowhite":"blanc Navajo","royalblue":"blau marí intens","deeppink":"rosa profund","lime":"verd llimona","oldlace":"rosa cremós","chartreuse":"Llimona pàl·lid","darkcyan":"cian fosc","yellow":"groc","linen":"lli","olive":"oliva","gold":"daurat","lawngreen":"verd gespa","lightyellow":"groc clar","tan":"tan","darkviolet":"violeta fosc","lightslategrey":"gris pissarra clar","grey":"gris","darkkhaki":"caqui fosc","green":"verd","deepskyblue":"blau cel profund","aqua":"aigua","sienna":"siena","mintcream":"menta pàl·lid","rosybrown":"marró rosat","mediumslateblue":"blau pissarra mitjà","magenta":"magenta","lightseagreen":"verd marí clar","cyan":"cian","olivedrab":"gris oliva","darkgoldenrod":"ocre fosc","slateblue":"blau pissarra","mediumaquamarine":"aiguamarina mitjana","lavender":"lavanda","mediumseagreen":"verd marí mitjà","maroon":"marró vermellós","darkslategray":"gris pissarra fosc","mediumturquoise":"turquesa mitjana","ghostwhite":"blanc fantasma","darkblue":"blau fosc","mediumvioletred":"vermell violeta mitjà","brown":"marró","lightgray":"gris clar","sandybrown":"marró arenós","pink":"rosa","firebrick":"maó refractari","indigo":"índigo","snow":"neu","darkorchid":"orquídia fosc","turquoise":"turquesa","chocolate":"xocolata","springgreen":"verd de primavera","moccasin":"mocassí","navy":"blau marí","lemonchiffon":"groc brisa","teal":"verd blavós","floralwhite":"blanc floral","cornflowerblue":"blau blauet","paleturquoise":"turquesa pàl·lid","purple":"porpra","gainsboro":"gainsboro","plum":"pruna","red":"vermell","blue":"blau","forestgreen":"verd bosc","darkgreen":"verd fosc","honeydew":"rosada de mel","darkseagreen":"verd marí fosc","lightcoral":"corall clar","palevioletred":"vermell porpra pàl·lid","mediumpurple":"porpra mitjana","saddlebrown":"marró mitjà","darkmagenta":"magenta fosc","thistle":"card","whitesmoke":"blanc fumat","wheat":"blat","violet":"violeta","lightskyblue":"blau cel clar","goldenrod":"ocre","mediumblue":"blau mitjà","skyblue":"blau cel","crimson":"carmesí","darksalmon":"salmó fosc","darkred":"vermell fosc","darkslategrey":"gris pissarra fosc","peru":"Perú","lightgrey":"gris clar","lightgoldenrodyellow":"groc ocre clar","blanchedalmond":"ametlla pàl·lid","aliceblue":"blau cian clar","bisque":"crema","slategray":"gris pissarra","palegoldenrod":"ocre pàl·lid","darkorange":"taronja fosc","aquamarine":"aiguamarina","lightgreen":"verd clar","burlywood":"marró arenós","dodgerblue":"blau Dodger","darkgray":"gris fosc","lightcyan":"cian clar","powderblue":"blau grisós","blueviolet":"blau violeta","orchid":"orquídia","dimgray":"gris fosc","beige":"beix","fuchsia":"fúcsia","lavenderblush":"lavanda vermellosa","hotpink":"rosa fúcsia","steelblue":"blau acer","tomato":"tomàquet","lightpink":"rosa clar","limegreen":"verd llimona verda","indianred":"vermell indi","papayawhip":"préssec pastel","lightslategray":"gris pissarra clar","gray":"gris","mediumorchid":"orquídia mitjana","cornsilk":"cru","black":"negre","seagreen":"verd marí","darkslateblue":"blau pissarra fosc","khaki":"caqui","lightblue":"blau clar","palegreen":"verd pàl·lid","azure":"atzur","peachpuff":"préssec","darkolivegreen":"verd oliva fosc","yellowgreen":"verd grogós"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Opcions anteriors","nextMessage":"Més opcions"},"dijit/nls/common":{"buttonOk":"D'acord","buttonCancel":"Cancel·la","buttonSave":"Desa","itemClose":"Tanca"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_ca.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_ca.js.uncompressed.js new file mode 100644 index 00000000..b12869c8 --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_ca.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_ca',{ +'dijit/form/nls/validate':{"rangeMessage":"Aquest valor és fora de l'interval","invalidMessage":"El valor introduït no és vàlid","missingMessage":"Aquest valor és necessari"} +, +'dijit/nls/loading':{"loadingState":"S'està carregant...","errorState":"Ens sap greu. S'ha produït un error."} +, +'dojo/nls/colors':{"lightsteelblue":"blau acer clar","orangered":"taronja vermellós","midnightblue":"blau mitjanit","cadetblue":"blau marí","seashell":"petxina marina","slategrey":"gris pissarra","coral":"corall","darkturquoise":"turquesa fosc","antiquewhite":"blanc antic","mediumspringgreen":"verd primavera mitjà","transparent":"transparent","salmon":"salmó","darkgrey":"gris fosc","ivory":"marbre","greenyellow":"verd grogós","mistyrose":"rosa dens","lightsalmon":"salmó clar","silver":"argent","dimgrey":"gris fosc","orange":"taronja","white":"blanc","navajowhite":"blanc Navajo","royalblue":"blau marí intens","deeppink":"rosa profund","lime":"verd llimona","oldlace":"rosa cremós","chartreuse":"Llimona pàl·lid","darkcyan":"cian fosc","yellow":"groc","linen":"lli","olive":"oliva","gold":"daurat","lawngreen":"verd gespa","lightyellow":"groc clar","tan":"tan","darkviolet":"violeta fosc","lightslategrey":"gris pissarra clar","grey":"gris","darkkhaki":"caqui fosc","green":"verd","deepskyblue":"blau cel profund","aqua":"aigua","sienna":"siena","mintcream":"menta pàl·lid","rosybrown":"marró rosat","mediumslateblue":"blau pissarra mitjà","magenta":"magenta","lightseagreen":"verd marí clar","cyan":"cian","olivedrab":"gris oliva","darkgoldenrod":"ocre fosc","slateblue":"blau pissarra","mediumaquamarine":"aiguamarina mitjana","lavender":"lavanda","mediumseagreen":"verd marí mitjà","maroon":"marró vermellós","darkslategray":"gris pissarra fosc","mediumturquoise":"turquesa mitjana","ghostwhite":"blanc fantasma","darkblue":"blau fosc","mediumvioletred":"vermell violeta mitjà","brown":"marró","lightgray":"gris clar","sandybrown":"marró arenós","pink":"rosa","firebrick":"maó refractari","indigo":"índigo","snow":"neu","darkorchid":"orquídia fosc","turquoise":"turquesa","chocolate":"xocolata","springgreen":"verd de primavera","moccasin":"mocassí","navy":"blau marí","lemonchiffon":"groc brisa","teal":"verd blavós","floralwhite":"blanc floral","cornflowerblue":"blau blauet","paleturquoise":"turquesa pàl·lid","purple":"porpra","gainsboro":"gainsboro","plum":"pruna","red":"vermell","blue":"blau","forestgreen":"verd bosc","darkgreen":"verd fosc","honeydew":"rosada de mel","darkseagreen":"verd marí fosc","lightcoral":"corall clar","palevioletred":"vermell porpra pàl·lid","mediumpurple":"porpra mitjana","saddlebrown":"marró mitjà","darkmagenta":"magenta fosc","thistle":"card","whitesmoke":"blanc fumat","wheat":"blat","violet":"violeta","lightskyblue":"blau cel clar","goldenrod":"ocre","mediumblue":"blau mitjà","skyblue":"blau cel","crimson":"carmesí","darksalmon":"salmó fosc","darkred":"vermell fosc","darkslategrey":"gris pissarra fosc","peru":"Perú","lightgrey":"gris clar","lightgoldenrodyellow":"groc ocre clar","blanchedalmond":"ametlla pàl·lid","aliceblue":"blau cian clar","bisque":"crema","slategray":"gris pissarra","palegoldenrod":"ocre pàl·lid","darkorange":"taronja fosc","aquamarine":"aiguamarina","lightgreen":"verd clar","burlywood":"marró arenós","dodgerblue":"blau Dodger","darkgray":"gris fosc","lightcyan":"cian clar","powderblue":"blau grisós","blueviolet":"blau violeta","orchid":"orquídia","dimgray":"gris fosc","beige":"beix","fuchsia":"fúcsia","lavenderblush":"lavanda vermellosa","hotpink":"rosa fúcsia","steelblue":"blau acer","tomato":"tomàquet","lightpink":"rosa clar","limegreen":"verd llimona verda","indianred":"vermell indi","papayawhip":"préssec pastel","lightslategray":"gris pissarra clar","gray":"gris","mediumorchid":"orquídia mitjana","cornsilk":"cru","black":"negre","seagreen":"verd marí","darkslateblue":"blau pissarra fosc","khaki":"caqui","lightblue":"blau clar","palegreen":"verd pàl·lid","azure":"atzur","peachpuff":"préssec","darkolivegreen":"verd oliva fosc","yellowgreen":"verd grogós"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Opcions anteriors","nextMessage":"Més opcions"} +, +'dijit/nls/common':{"buttonOk":"D'acord","buttonCancel":"Cancel·la","buttonSave":"Desa","itemClose":"Tanca"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_cs.js b/lib/dojo/nls/tt-rss-layer_cs.js index 8c008a46..be91c7d7 100644 --- a/lib/dojo/nls/tt-rss-layer_cs.js +++ b/lib/dojo/nls/tt-rss-layer_cs.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_cs");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.cs");dojo.nls.colors.cs={"lightsteelblue":"světlá ocelová modrá","orangered":"oranžovočervená","midnightblue":"temně modrá","cadetblue":"šedomodrá","seashell":"lasturová","slategrey":"břidlicová šedá","coral":"korálová červená","darkturquoise":"tmavě tyrkysová","antiquewhite":"krémově bílá","mediumspringgreen":"střední jarní zelená","salmon":"lososová","darkgrey":"tmavě šedá","ivory":"slonovinová","greenyellow":"zelenožlutá","mistyrose":"růžovobílá","lightsalmon":"světle lososová","silver":"stříbrná","dimgrey":"kouřově šedá","orange":"oranžová","white":"bílá","navajowhite":"světle krémová","royalblue":"královská modrá","deeppink":"sytě růžová","lime":"limetková","oldlace":"světle béžová","chartreuse":"chartreuska","darkcyan":"tmavě azurová","yellow":"žlutá","linen":"bledě šedobéžová","olive":"olivová","gold":"zlatá","lawngreen":"jasně zelená","lightyellow":"bledě žlutá","tan":"šedobéžová","darkviolet":"tmavě fialová","lightslategrey":"světlá břidlicová šedá","grey":"šedá","darkkhaki":"pískově hnědá","green":"zelená","deepskyblue":"sytá nebeská modrá","aqua":"azurová","sienna":"siena","mintcream":"mentolová","rosybrown":"růžovohnědá","mediumslateblue":"střední břidlicová modrá","magenta":"purpurová","lightseagreen":"světlá mořská zelená","cyan":"azurová","olivedrab":"khaki","darkgoldenrod":"tmavě béžová","slateblue":"břidlicová modrá","mediumaquamarine":"střední akvamarínová","lavender":"levandulová","mediumseagreen":"střední mořská zelená","maroon":"kaštanová","darkslategray":"tmavá břidlicová šedá","mediumturquoise":"středně tyrkysová","ghostwhite":"modravě bílá","darkblue":"tmavě modrá","mediumvioletred":"středně fialovočervená","brown":"červenohnědá","lightgray":"světle šedá","sandybrown":"oranžovohnědá","pink":"růžová","firebrick":"cihlová","indigo":"indigově modrá","snow":"sněhobílá","darkorchid":"tmavě orchidejová","turquoise":"tyrkysová","chocolate":"hnědobéžová","springgreen":"jarní zelená","moccasin":"bledě krémová","navy":"námořnická modrá","lemonchiffon":"světle citrónová","teal":"šedozelená","floralwhite":"květinově bílá","cornflowerblue":"chrpově modrá","paleturquoise":"bledě tyrkysová","purple":"nachová","gainsboro":"bledě šedá","plum":"švestková","red":"červená","blue":"modrá","forestgreen":"lesní zelená","darkgreen":"tmavě zelená","honeydew":"nazelenalá","darkseagreen":"tmavá mořská zelená","lightcoral":"světle korálová","palevioletred":"bledě fialovočervená","mediumpurple":"středně nachová","saddlebrown":"hnědá","darkmagenta":"tmavě purpurová","thistle":"bodláková","whitesmoke":"kouřově bílá","wheat":"zlatohnědá","violet":"fialová","lightskyblue":"světlá nebeská modrá","goldenrod":"béžová","mediumblue":"středně modrá","skyblue":"nebeská modrá","crimson":"karmínová","darksalmon":"tmavě lososová","darkred":"tmavě červená","darkslategrey":"tmavá břidlicová šedá","peru":"karamelová","lightgrey":"světle šedá","lightgoldenrodyellow":"světle žlutá","blanchedalmond":"mandlová","aliceblue":"modravá","bisque":"bledě oranžová","slategray":"břidlicová šedá","palegoldenrod":"bledě písková","darkorange":"tmavě oranžová","aquamarine":"akvamarínová","lightgreen":"světle zelená","burlywood":"krémová","dodgerblue":"jasně modrá","darkgray":"tmavě šedá","lightcyan":"světle azurová","powderblue":"bledě modrá","blueviolet":"modrofialová","orchid":"orchidejová","dimgray":"kouřově šedá","beige":"bledě béžová","fuchsia":"fuchsiová","lavenderblush":"levandulová růžová","hotpink":"jasně růžová","steelblue":"ocelová modrá","tomato":"tomatová","lightpink":"světle růžová","limegreen":"limetkově zelená","indianred":"indiánská červená","papayawhip":"papájová","lightslategray":"světlá břidlicová šedá","gray":"šedá","mediumorchid":"středně orchidejová","cornsilk":"režná","black":"černá","seagreen":"mořská zelená","darkslateblue":"tmavá břidlicová modrá","khaki":"písková","lightblue":"světle modrá","palegreen":"bledě zelená","azure":"bledě azurová","peachpuff":"broskvová","darkolivegreen":"tmavě olivová","yellowgreen":"žlutozelená"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.cs");dijit.nls.loading.cs={"loadingState":"Probíhá načítání...","errorState":"Omlouváme se, došlo k chybě"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.cs");dijit.nls.common.cs={"buttonOk":"OK","buttonCancel":"Storno","buttonSave":"Uložit","itemClose":"Zavřít"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.cs");dijit.form.nls.validate.cs={"rangeMessage":"Tato hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota není platná.","missingMessage":"Tato hodnota je vyžadována."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.cs");dijit.form.nls.ComboBox.cs={"previousMessage":"Předchozí volby","nextMessage":"Další volby"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.cs");dojo.cldr.nls.number.cs={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_cs",{"dijit/form/nls/validate":{"rangeMessage":"Tato hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota není platná.","missingMessage":"Tato hodnota je vyžadována."},"dijit/nls/loading":{"loadingState":"Probíhá načítání...","errorState":"Omlouváme se, došlo k chybě"},"dojo/nls/colors":{"lightsteelblue":"světlá ocelová modrá","orangered":"oranžovočervená","midnightblue":"temně modrá","cadetblue":"šedomodrá","seashell":"lasturová","slategrey":"břidlicová šedá","coral":"korálová červená","darkturquoise":"tmavě tyrkysová","antiquewhite":"krémově bílá","mediumspringgreen":"střední jarní zelená","transparent":"průhledná","salmon":"lososová","darkgrey":"tmavě šedá","ivory":"slonovinová","greenyellow":"zelenožlutá","mistyrose":"růžovobílá","lightsalmon":"světle lososová","silver":"stříbrná","dimgrey":"kouřově šedá","orange":"oranžová","white":"bílá","navajowhite":"světle krémová","royalblue":"královská modrá","deeppink":"sytě růžová","lime":"limetková","oldlace":"světle béžová","chartreuse":"chartreuska","darkcyan":"tmavě azurová","yellow":"žlutá","linen":"bledě šedobéžová","olive":"olivová","gold":"zlatá","lawngreen":"jasně zelená","lightyellow":"bledě žlutá","tan":"šedobéžová","darkviolet":"tmavě fialová","lightslategrey":"světlá břidlicová šedá","grey":"šedá","darkkhaki":"pískově hnědá","green":"zelená","deepskyblue":"sytá nebeská modrá","aqua":"azurová","sienna":"siena","mintcream":"mentolová","rosybrown":"růžovohnědá","mediumslateblue":"střední břidlicová modrá","magenta":"purpurová","lightseagreen":"světlá mořská zelená","cyan":"azurová","olivedrab":"khaki","darkgoldenrod":"tmavě béžová","slateblue":"břidlicová modrá","mediumaquamarine":"střední akvamarínová","lavender":"levandulová","mediumseagreen":"střední mořská zelená","maroon":"kaštanová","darkslategray":"tmavá břidlicová šedá","mediumturquoise":"středně tyrkysová","ghostwhite":"modravě bílá","darkblue":"tmavě modrá","mediumvioletred":"středně fialovočervená","brown":"červenohnědá","lightgray":"světle šedá","sandybrown":"oranžovohnědá","pink":"růžová","firebrick":"cihlová","indigo":"indigově modrá","snow":"sněhobílá","darkorchid":"tmavě orchidejová","turquoise":"tyrkysová","chocolate":"hnědobéžová","springgreen":"jarní zelená","moccasin":"bledě krémová","navy":"námořnická modrá","lemonchiffon":"světle citrónová","teal":"šedozelená","floralwhite":"květinově bílá","cornflowerblue":"chrpově modrá","paleturquoise":"bledě tyrkysová","purple":"nachová","gainsboro":"bledě šedá","plum":"švestková","red":"červená","blue":"modrá","forestgreen":"lesní zelená","darkgreen":"tmavě zelená","honeydew":"nazelenalá","darkseagreen":"tmavá mořská zelená","lightcoral":"světle korálová","palevioletred":"bledě fialovočervená","mediumpurple":"středně nachová","saddlebrown":"hnědá","darkmagenta":"tmavě purpurová","thistle":"bodláková","whitesmoke":"kouřově bílá","wheat":"zlatohnědá","violet":"fialová","lightskyblue":"světlá nebeská modrá","goldenrod":"béžová","mediumblue":"středně modrá","skyblue":"nebeská modrá","crimson":"karmínová","darksalmon":"tmavě lososová","darkred":"tmavě červená","darkslategrey":"tmavá břidlicová šedá","peru":"karamelová","lightgrey":"světle šedá","lightgoldenrodyellow":"světle žlutá","blanchedalmond":"mandlová","aliceblue":"modravá","bisque":"bledě oranžová","slategray":"břidlicová šedá","palegoldenrod":"bledě písková","darkorange":"tmavě oranžová","aquamarine":"akvamarínová","lightgreen":"světle zelená","burlywood":"krémová","dodgerblue":"jasně modrá","darkgray":"tmavě šedá","lightcyan":"světle azurová","powderblue":"bledě modrá","blueviolet":"modrofialová","orchid":"orchidejová","dimgray":"kouřově šedá","beige":"bledě béžová","fuchsia":"fuchsiová","lavenderblush":"levandulová růžová","hotpink":"jasně růžová","steelblue":"ocelová modrá","tomato":"tomatová","lightpink":"světle růžová","limegreen":"limetkově zelená","indianred":"indiánská červená","papayawhip":"papájová","lightslategray":"světlá břidlicová šedá","gray":"šedá","mediumorchid":"středně orchidejová","cornsilk":"režná","black":"černá","seagreen":"mořská zelená","darkslateblue":"tmavá břidlicová modrá","khaki":"písková","lightblue":"světle modrá","palegreen":"bledě zelená","azure":"bledě azurová","peachpuff":"broskvová","darkolivegreen":"tmavě olivová","yellowgreen":"žlutozelená"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Předchozí volby","nextMessage":"Další volby"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Storno","buttonSave":"Uložit","itemClose":"Zavřít"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_cs.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_cs.js.uncompressed.js new file mode 100644 index 00000000..35ef92ba --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_cs.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_cs',{ +'dijit/form/nls/validate':{"rangeMessage":"Tato hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota není platná.","missingMessage":"Tato hodnota je vyžadována."} +, +'dijit/nls/loading':{"loadingState":"Probíhá načítání...","errorState":"Omlouváme se, došlo k chybě"} +, +'dojo/nls/colors':{"lightsteelblue":"světlá ocelová modrá","orangered":"oranžovočervená","midnightblue":"temně modrá","cadetblue":"šedomodrá","seashell":"lasturová","slategrey":"břidlicová šedá","coral":"korálová červená","darkturquoise":"tmavě tyrkysová","antiquewhite":"krémově bílá","mediumspringgreen":"střední jarní zelená","transparent":"průhledná","salmon":"lososová","darkgrey":"tmavě šedá","ivory":"slonovinová","greenyellow":"zelenožlutá","mistyrose":"růžovobílá","lightsalmon":"světle lososová","silver":"stříbrná","dimgrey":"kouřově šedá","orange":"oranžová","white":"bílá","navajowhite":"světle krémová","royalblue":"královská modrá","deeppink":"sytě růžová","lime":"limetková","oldlace":"světle béžová","chartreuse":"chartreuska","darkcyan":"tmavě azurová","yellow":"žlutá","linen":"bledě šedobéžová","olive":"olivová","gold":"zlatá","lawngreen":"jasně zelená","lightyellow":"bledě žlutá","tan":"šedobéžová","darkviolet":"tmavě fialová","lightslategrey":"světlá břidlicová šedá","grey":"šedá","darkkhaki":"pískově hnědá","green":"zelená","deepskyblue":"sytá nebeská modrá","aqua":"azurová","sienna":"siena","mintcream":"mentolová","rosybrown":"růžovohnědá","mediumslateblue":"střední břidlicová modrá","magenta":"purpurová","lightseagreen":"světlá mořská zelená","cyan":"azurová","olivedrab":"khaki","darkgoldenrod":"tmavě béžová","slateblue":"břidlicová modrá","mediumaquamarine":"střední akvamarínová","lavender":"levandulová","mediumseagreen":"střední mořská zelená","maroon":"kaštanová","darkslategray":"tmavá břidlicová šedá","mediumturquoise":"středně tyrkysová","ghostwhite":"modravě bílá","darkblue":"tmavě modrá","mediumvioletred":"středně fialovočervená","brown":"červenohnědá","lightgray":"světle šedá","sandybrown":"oranžovohnědá","pink":"růžová","firebrick":"cihlová","indigo":"indigově modrá","snow":"sněhobílá","darkorchid":"tmavě orchidejová","turquoise":"tyrkysová","chocolate":"hnědobéžová","springgreen":"jarní zelená","moccasin":"bledě krémová","navy":"námořnická modrá","lemonchiffon":"světle citrónová","teal":"šedozelená","floralwhite":"květinově bílá","cornflowerblue":"chrpově modrá","paleturquoise":"bledě tyrkysová","purple":"nachová","gainsboro":"bledě šedá","plum":"švestková","red":"červená","blue":"modrá","forestgreen":"lesní zelená","darkgreen":"tmavě zelená","honeydew":"nazelenalá","darkseagreen":"tmavá mořská zelená","lightcoral":"světle korálová","palevioletred":"bledě fialovočervená","mediumpurple":"středně nachová","saddlebrown":"hnědá","darkmagenta":"tmavě purpurová","thistle":"bodláková","whitesmoke":"kouřově bílá","wheat":"zlatohnědá","violet":"fialová","lightskyblue":"světlá nebeská modrá","goldenrod":"béžová","mediumblue":"středně modrá","skyblue":"nebeská modrá","crimson":"karmínová","darksalmon":"tmavě lososová","darkred":"tmavě červená","darkslategrey":"tmavá břidlicová šedá","peru":"karamelová","lightgrey":"světle šedá","lightgoldenrodyellow":"světle žlutá","blanchedalmond":"mandlová","aliceblue":"modravá","bisque":"bledě oranžová","slategray":"břidlicová šedá","palegoldenrod":"bledě písková","darkorange":"tmavě oranžová","aquamarine":"akvamarínová","lightgreen":"světle zelená","burlywood":"krémová","dodgerblue":"jasně modrá","darkgray":"tmavě šedá","lightcyan":"světle azurová","powderblue":"bledě modrá","blueviolet":"modrofialová","orchid":"orchidejová","dimgray":"kouřově šedá","beige":"bledě béžová","fuchsia":"fuchsiová","lavenderblush":"levandulová růžová","hotpink":"jasně růžová","steelblue":"ocelová modrá","tomato":"tomatová","lightpink":"světle růžová","limegreen":"limetkově zelená","indianred":"indiánská červená","papayawhip":"papájová","lightslategray":"světlá břidlicová šedá","gray":"šedá","mediumorchid":"středně orchidejová","cornsilk":"režná","black":"černá","seagreen":"mořská zelená","darkslateblue":"tmavá břidlicová modrá","khaki":"písková","lightblue":"světle modrá","palegreen":"bledě zelená","azure":"bledě azurová","peachpuff":"broskvová","darkolivegreen":"tmavě olivová","yellowgreen":"žlutozelená"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Předchozí volby","nextMessage":"Další volby"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Storno","buttonSave":"Uložit","itemClose":"Zavřít"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_da.js b/lib/dojo/nls/tt-rss-layer_da.js index 365eb98d..39661f67 100644 --- a/lib/dojo/nls/tt-rss-layer_da.js +++ b/lib/dojo/nls/tt-rss-layer_da.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_da");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.da");dojo.nls.colors.da={"lightsteelblue":"lys stålblå","orangered":"orangerød","midnightblue":"midnatsblå","cadetblue":"kadetblå","seashell":"muslingeskal","slategrey":"skifergrå","coral":"koralrød","darkturquoise":"mørk turkis","antiquewhite":"antikhvid","mediumspringgreen":"mellemforårsgrøn","salmon":"laksefarvet","darkgrey":"mørkegrå","ivory":"elfenben","greenyellow":"grøngul","mistyrose":"blegrosa","lightsalmon":"lys laksefarvet","silver":"sølv","dimgrey":"svag grå","orange":"orange","white":"hvid","navajowhite":"navajo-hvid","royalblue":"kongeblå","deeppink":"dyb pink","lime":"lime","oldlace":"kniplingshvid","chartreuse":"chartreuse","darkcyan":"mørk cyan","yellow":"gul","linen":"lærred","olive":"olivengrøn","gold":"guld","lawngreen":"græsgrøn","lightyellow":"lysegul","tan":"tan","darkviolet":"mørkelilla","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grøn","deepskyblue":"dyb himmelblå","aqua":"akvablå","sienna":"sienna","mintcream":"pebermyntecreme","rosybrown":"rosabrun","mediumslateblue":"mellemskiferblå","magenta":"magenta","lightseagreen":"lys havgrøn","cyan":"cyan","olivedrab":"brungrøn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"mellem akvamarin","lavender":"lysviolet","mediumseagreen":"mellemhavgrøn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"mellemturkis","ghostwhite":"spøgelseshvid","darkblue":"mørkeblå","mediumvioletred":"mellemviolet","brown":"brun","lightgray":"lysegrå","sandybrown":"sandbrun","pink":"pink","firebrick":"chamottesten","indigo":"indigo","snow":"sne","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"rust","springgreen":"forårsgrøn","moccasin":"fruesko","navy":"marineblå","lemonchiffon":"citronfromage","teal":"blågrøn","floralwhite":"blomsterhvid","cornflowerblue":"kornblomstblå","paleturquoise":"bleg turkis","purple":"lilla","gainsboro":"gainsboro","plum":"blomme","red":"rød","blue":"blå","forestgreen":"skovgrøn","darkgreen":"mørkegrøn","honeydew":"honningdug","darkseagreen":"mørk havgrøn","lightcoral":"lys koralrød","palevioletred":"blegviolet","mediumpurple":"mellemlilla","saddlebrown":"saddelbrun","darkmagenta":"mørk magenta","thistle":"tidsel","whitesmoke":"hvid røg","wheat":"korngul","violet":"lilla","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellemblå","skyblue":"himmelblå","crimson":"blodrød","darksalmon":"mørk laksefarvet","darkred":"mørkerød","darkslategrey":"mørk skifergrå","peru":"peru","lightgrey":"lysegrå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"blanceret mandel","aliceblue":"babyblå","bisque":"gulgrå","slategray":"skifergrå","palegoldenrod":"bleg gyldenris","darkorange":"mørk orange","aquamarine":"akvamarin","lightgreen":"lysegrøn","burlywood":"tobak","dodgerblue":"dodgerblå","darkgray":"mørkegrå","lightcyan":"lys cyan","powderblue":"pudderblå","blueviolet":"blåviolet","orchid":"orkide","dimgray":"svag grå","beige":"beige","fuchsia":"lyslilla","lavenderblush":"lavendelrød","hotpink":"mørk rosa","steelblue":"metalblå","tomato":"tomat","lightpink":"lys pink","limegreen":"limegrøn","indianred":"lys rødbrun","papayawhip":"papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"mellem orkide","cornsilk":"majs","black":"sort","seagreen":"havgrøn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lyseblå","palegreen":"bleggrøn","azure":"azurblå","peachpuff":"fersken","darkolivegreen":"mørk olivengrøn","yellowgreen":"gulgrøn"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.da");dijit.nls.loading.da={"loadingState":"Indlæser...","errorState":"Der er opstået en fejl"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.da");dijit.nls.common.da={"buttonOk":"OK","buttonCancel":"Annullér","buttonSave":"Gem","itemClose":"Luk"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.da");dijit.form.nls.validate.da={"rangeMessage":"Værdien er uden for intervallet.","invalidMessage":"Den angivne værdi er ikke gyldig.","missingMessage":"Værdien er påkrævet."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.da");dijit.form.nls.ComboBox.da={"previousMessage":"Forrige valg","nextMessage":"Flere valg"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.da");dojo.cldr.nls.number.da={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":",","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_da",{"dijit/form/nls/validate":{"rangeMessage":"Værdien er uden for intervallet.","invalidMessage":"Den angivne værdi er ikke gyldig.","missingMessage":"Værdien er påkrævet."},"dijit/nls/loading":{"loadingState":"Indlæser...","errorState":"Der er opstået en fejl"},"dojo/nls/colors":{"lightsteelblue":"lys stålblå","orangered":"orangerød","midnightblue":"midnatsblå","cadetblue":"kadetblå","seashell":"muslingeskal","slategrey":"skifergrå","coral":"koralrød","darkturquoise":"mørk turkis","antiquewhite":"antikhvid","mediumspringgreen":"mellemforårsgrøn","transparent":"transparent","salmon":"laksefarvet","darkgrey":"mørkegrå","ivory":"elfenben","greenyellow":"grøngul","mistyrose":"blegrosa","lightsalmon":"lys laksefarvet","silver":"sølv","dimgrey":"svag grå","orange":"orange","white":"hvid","navajowhite":"navajo-hvid","royalblue":"kongeblå","deeppink":"dyb pink","lime":"lime","oldlace":"kniplingshvid","chartreuse":"chartreuse","darkcyan":"mørk cyan","yellow":"gul","linen":"lærred","olive":"olivengrøn","gold":"guld","lawngreen":"græsgrøn","lightyellow":"lysegul","tan":"tan","darkviolet":"mørkelilla","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grøn","deepskyblue":"dyb himmelblå","aqua":"akvablå","sienna":"sienna","mintcream":"pebermyntecreme","rosybrown":"rosabrun","mediumslateblue":"mellemskiferblå","magenta":"magenta","lightseagreen":"lys havgrøn","cyan":"cyan","olivedrab":"brungrøn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"mellem akvamarin","lavender":"lysviolet","mediumseagreen":"mellemhavgrøn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"mellemturkis","ghostwhite":"spøgelseshvid","darkblue":"mørkeblå","mediumvioletred":"mellemviolet","brown":"brun","lightgray":"lysegrå","sandybrown":"sandbrun","pink":"pink","firebrick":"chamottesten","indigo":"indigo","snow":"sne","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"rust","springgreen":"forårsgrøn","moccasin":"fruesko","navy":"marineblå","lemonchiffon":"citronfromage","teal":"blågrøn","floralwhite":"blomsterhvid","cornflowerblue":"kornblomstblå","paleturquoise":"bleg turkis","purple":"lilla","gainsboro":"gainsboro","plum":"blomme","red":"rød","blue":"blå","forestgreen":"skovgrøn","darkgreen":"mørkegrøn","honeydew":"honningdug","darkseagreen":"mørk havgrøn","lightcoral":"lys koralrød","palevioletred":"blegviolet","mediumpurple":"mellemlilla","saddlebrown":"saddelbrun","darkmagenta":"mørk magenta","thistle":"tidsel","whitesmoke":"hvid røg","wheat":"korngul","violet":"lilla","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellemblå","skyblue":"himmelblå","crimson":"blodrød","darksalmon":"mørk laksefarvet","darkred":"mørkerød","darkslategrey":"mørk skifergrå","peru":"peru","lightgrey":"lysegrå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"blanceret mandel","aliceblue":"babyblå","bisque":"gulgrå","slategray":"skifergrå","palegoldenrod":"bleg gyldenris","darkorange":"mørk orange","aquamarine":"akvamarin","lightgreen":"lysegrøn","burlywood":"tobak","dodgerblue":"dodgerblå","darkgray":"mørkegrå","lightcyan":"lys cyan","powderblue":"pudderblå","blueviolet":"blåviolet","orchid":"orkide","dimgray":"svag grå","beige":"beige","fuchsia":"lyslilla","lavenderblush":"lavendelrød","hotpink":"mørk rosa","steelblue":"metalblå","tomato":"tomat","lightpink":"lys pink","limegreen":"limegrøn","indianred":"lys rødbrun","papayawhip":"papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"mellem orkide","cornsilk":"majs","black":"sort","seagreen":"havgrøn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lyseblå","palegreen":"bleggrøn","azure":"azurblå","peachpuff":"fersken","darkolivegreen":"mørk olivengrøn","yellowgreen":"gulgrøn"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":",","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Forrige valg","nextMessage":"Flere valg"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Annullér","buttonSave":"Gem","itemClose":"Luk"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_da.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_da.js.uncompressed.js new file mode 100644 index 00000000..cfe00a01 --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_da.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_da',{ +'dijit/form/nls/validate':{"rangeMessage":"Værdien er uden for intervallet.","invalidMessage":"Den angivne værdi er ikke gyldig.","missingMessage":"Værdien er påkrævet."} +, +'dijit/nls/loading':{"loadingState":"Indlæser...","errorState":"Der er opstået en fejl"} +, +'dojo/nls/colors':{"lightsteelblue":"lys stålblå","orangered":"orangerød","midnightblue":"midnatsblå","cadetblue":"kadetblå","seashell":"muslingeskal","slategrey":"skifergrå","coral":"koralrød","darkturquoise":"mørk turkis","antiquewhite":"antikhvid","mediumspringgreen":"mellemforårsgrøn","transparent":"transparent","salmon":"laksefarvet","darkgrey":"mørkegrå","ivory":"elfenben","greenyellow":"grøngul","mistyrose":"blegrosa","lightsalmon":"lys laksefarvet","silver":"sølv","dimgrey":"svag grå","orange":"orange","white":"hvid","navajowhite":"navajo-hvid","royalblue":"kongeblå","deeppink":"dyb pink","lime":"lime","oldlace":"kniplingshvid","chartreuse":"chartreuse","darkcyan":"mørk cyan","yellow":"gul","linen":"lærred","olive":"olivengrøn","gold":"guld","lawngreen":"græsgrøn","lightyellow":"lysegul","tan":"tan","darkviolet":"mørkelilla","lightslategrey":"lys skifergrå","grey":"grå","darkkhaki":"mørk khaki","green":"grøn","deepskyblue":"dyb himmelblå","aqua":"akvablå","sienna":"sienna","mintcream":"pebermyntecreme","rosybrown":"rosabrun","mediumslateblue":"mellemskiferblå","magenta":"magenta","lightseagreen":"lys havgrøn","cyan":"cyan","olivedrab":"brungrøn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblå","mediumaquamarine":"mellem akvamarin","lavender":"lysviolet","mediumseagreen":"mellemhavgrøn","maroon":"rødbrun","darkslategray":"mørk skifergrå","mediumturquoise":"mellemturkis","ghostwhite":"spøgelseshvid","darkblue":"mørkeblå","mediumvioletred":"mellemviolet","brown":"brun","lightgray":"lysegrå","sandybrown":"sandbrun","pink":"pink","firebrick":"chamottesten","indigo":"indigo","snow":"sne","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"rust","springgreen":"forårsgrøn","moccasin":"fruesko","navy":"marineblå","lemonchiffon":"citronfromage","teal":"blågrøn","floralwhite":"blomsterhvid","cornflowerblue":"kornblomstblå","paleturquoise":"bleg turkis","purple":"lilla","gainsboro":"gainsboro","plum":"blomme","red":"rød","blue":"blå","forestgreen":"skovgrøn","darkgreen":"mørkegrøn","honeydew":"honningdug","darkseagreen":"mørk havgrøn","lightcoral":"lys koralrød","palevioletred":"blegviolet","mediumpurple":"mellemlilla","saddlebrown":"saddelbrun","darkmagenta":"mørk magenta","thistle":"tidsel","whitesmoke":"hvid røg","wheat":"korngul","violet":"lilla","lightskyblue":"lys himmelblå","goldenrod":"gyldenris","mediumblue":"mellemblå","skyblue":"himmelblå","crimson":"blodrød","darksalmon":"mørk laksefarvet","darkred":"mørkerød","darkslategrey":"mørk skifergrå","peru":"peru","lightgrey":"lysegrå","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"blanceret mandel","aliceblue":"babyblå","bisque":"gulgrå","slategray":"skifergrå","palegoldenrod":"bleg gyldenris","darkorange":"mørk orange","aquamarine":"akvamarin","lightgreen":"lysegrøn","burlywood":"tobak","dodgerblue":"dodgerblå","darkgray":"mørkegrå","lightcyan":"lys cyan","powderblue":"pudderblå","blueviolet":"blåviolet","orchid":"orkide","dimgray":"svag grå","beige":"beige","fuchsia":"lyslilla","lavenderblush":"lavendelrød","hotpink":"mørk rosa","steelblue":"metalblå","tomato":"tomat","lightpink":"lys pink","limegreen":"limegrøn","indianred":"lys rødbrun","papayawhip":"papaya","lightslategray":"lys skifergrå","gray":"grå","mediumorchid":"mellem orkide","cornsilk":"majs","black":"sort","seagreen":"havgrøn","darkslateblue":"mørk skiferblå","khaki":"khaki","lightblue":"lyseblå","palegreen":"bleggrøn","azure":"azurblå","peachpuff":"fersken","darkolivegreen":"mørk olivengrøn","yellowgreen":"gulgrøn"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":",","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Forrige valg","nextMessage":"Flere valg"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Annullér","buttonSave":"Gem","itemClose":"Luk"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_de-de.js b/lib/dojo/nls/tt-rss-layer_de-de.js index f43af10d..f29ec7ce 100644 --- a/lib/dojo/nls/tt-rss-layer_de-de.js +++ b/lib/dojo/nls/tt-rss-layer_de-de.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_de-de");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.de_de");dojo.nls.colors.de_de={"lightsteelblue":"Helles Stahlblau","orangered":"Orangerot","midnightblue":"Mitternachtblau","cadetblue":"Kadettenblau","seashell":"Muschelweiß","slategrey":"Schiefergrau","coral":"Koralle","darkturquoise":"Dunkeltürkis","antiquewhite":"Antikweiß","mediumspringgreen":"Mittelfrühlingsgrün","salmon":"Lachs","darkgrey":"Dunkelgrau","ivory":"Elfenbein","greenyellow":"Grüngelb","mistyrose":"Blassrose","lightsalmon":"Helllachs","silver":"Silbergrau","dimgrey":"Blassgrau","orange":"Orange","white":"Weiß","navajowhite":"Navajo-weiß","royalblue":"Königsblau","deeppink":"Tiefrosa","lime":"Limone","oldlace":"Alte Spitze","chartreuse":"Helles Gelbgrün","darkcyan":"Dunkelzyan","yellow":"Gelb","linen":"Leinen","olive":"Oliv","gold":"Gold","lawngreen":"Grasgrün","lightyellow":"Hellgelb","tan":"Hautfarben","darkviolet":"Dunkelviolett","lightslategrey":"Helles Schiefergrau","grey":"Grau","darkkhaki":"Dunkelkhaki","green":"Grün","deepskyblue":"Dunkles Himmelblau","aqua":"Wasserblau","sienna":"Sienna","mintcream":"Mintcreme","rosybrown":"Rosigbraun","mediumslateblue":"Mittelschieferblau ","magenta":"Magenta","lightseagreen":"Helles Meergrün","cyan":"Zyan","olivedrab":"Olivgrau","darkgoldenrod":"Dunkelgoldgelb","slateblue":"Schieferblau","mediumaquamarine":"Mittelaquamarin","lavender":"Lavendelblau","mediumseagreen":"Mittelmeeresgrün","maroon":"Kastanienbraun","darkslategray":"Dunkelschiefergrau","mediumturquoise":"Mitteltürkis ","ghostwhite":"Geisterweiß","darkblue":"Dunkelblau","mediumvioletred":"Mittelviolettrot ","brown":"Braun","lightgray":"Hellgrau","sandybrown":"Sandbraun","pink":"Rosa","firebrick":"Schamottestein","indigo":"Indigoblau","snow":"Schneeweiß","darkorchid":"Dunkelorchidee","turquoise":"Türkis","chocolate":"Schokoladenbraun","springgreen":"Frühlingsgrün","moccasin":"Mokassin","navy":"Marineblau","lemonchiffon":"Zitronenchiffon","teal":"Smaragdgrün","floralwhite":"Blütenweiß","cornflowerblue":"Kornblumenblau","paleturquoise":"Blasstürkis","purple":"Purpurrot","gainsboro":"Gainsboro","plum":"Pflaume","red":"Rot","blue":"Blau","forestgreen":"Forstgrün","darkgreen":"Dunkelgrün","honeydew":"Honigtau","darkseagreen":"Dunkles Meergrün","lightcoral":"Hellkoralle","palevioletred":"Blassviolettrot ","mediumpurple":"Mittelpurpur","saddlebrown":"Sattelbraun","darkmagenta":"Dunkelmagenta","thistle":"Distel","whitesmoke":"Rauchweiß","wheat":"Weizen","violet":"Violett","lightskyblue":"Helles Himmelblau","goldenrod":"Goldgelb","mediumblue":"Mittelblau","skyblue":"Himmelblau","crimson":"Karmesinrot","darksalmon":"Dunkellachs","darkred":"Dunkelrot","darkslategrey":"Dunkelschiefergrau","peru":"Peru","lightgrey":"Hellgrau","lightgoldenrodyellow":"Hellgoldgelb","blanchedalmond":"Mandelweiß","aliceblue":"Alice-blau","bisque":"Bisquit","slategray":"Schiefergrau","palegoldenrod":"Blassgoldgelb","darkorange":"Dunkelorange","aquamarine":"Aquamarin","lightgreen":"Hellgrün","burlywood":"Burlywood","dodgerblue":"Dodger-blau","darkgray":"Dunkelgrau","lightcyan":"Hellzyan","powderblue":"Pulverblau","blueviolet":"Blauviolett","orchid":"Orchidee","dimgray":"Blassgrau","beige":"Beige","fuchsia":"Fuchsia","lavenderblush":"Lavendelhauch","hotpink":"Knallrosa","steelblue":"Stahlblau","tomato":"Tomatenrot","lightpink":"Hellrosa","limegreen":"Limonengrün","indianred":"Indischrot","papayawhip":"Papayacreme","lightslategray":"Helles Schiefergrau","gray":"Grau","mediumorchid":"Mittelorchidee","cornsilk":"Kornseide","black":"Schwarz","seagreen":"Meeresgrün","darkslateblue":"Dunkelschieferblau","khaki":"Khaki","lightblue":"Hellblau","palegreen":"Blassgrün","azure":"Azur","peachpuff":"Pfirsich","darkolivegreen":"Dunkelolivgrün","yellowgreen":"Gelbgrün"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.de_de");dijit.nls.loading.de_de={"loadingState":"Wird geladen...","errorState":"Es ist ein Fehler aufgetreten."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.de_de");dijit.nls.common.de_de={"buttonOk":"OK","buttonCancel":"Abbrechen","buttonSave":"Speichern","itemClose":"Schließen"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.de_de");dijit.form.nls.validate.de_de={"rangeMessage":"Dieser Wert liegt außerhalb des gültigen Bereichs. ","invalidMessage":"Der eingegebene Wert ist ungültig. ","missingMessage":"Dieser Wert ist erforderlich."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.de_de");dijit.form.nls.ComboBox.de_de={"previousMessage":"Vorherige Auswahl","nextMessage":"Weitere Auswahlmöglichkeiten"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.de_de");dojo.cldr.nls.number.de_de={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_de-de",{"dijit/form/nls/validate":{"rangeMessage":"Dieser Wert liegt außerhalb des gültigen Bereichs. ","invalidMessage":"Der eingegebene Wert ist ungültig. ","missingMessage":"Dieser Wert ist erforderlich."},"dijit/nls/loading":{"loadingState":"Wird geladen...","errorState":"Es ist ein Fehler aufgetreten."},"dojo/nls/colors":{"lightsteelblue":"Helles Stahlblau","orangered":"Orangerot","midnightblue":"Mitternachtblau","cadetblue":"Kadettenblau","seashell":"Muschelweiß","slategrey":"Schiefergrau","coral":"Koralle","darkturquoise":"Dunkeltürkis","antiquewhite":"Antikweiß","mediumspringgreen":"Mittelfrühlingsgrün","transparent":"Transparent","salmon":"Lachs","darkgrey":"Dunkelgrau","ivory":"Elfenbein","greenyellow":"Grüngelb","mistyrose":"Blassrose","lightsalmon":"Helllachs","silver":"Silbergrau","dimgrey":"Blassgrau","orange":"Orange","white":"Weiß","navajowhite":"Navajo-weiß","royalblue":"Königsblau","deeppink":"Tiefrosa","lime":"Limone","oldlace":"Alte Spitze","chartreuse":"Helles Gelbgrün","darkcyan":"Dunkelzyan","yellow":"Gelb","linen":"Leinen","olive":"Oliv","gold":"Gold","lawngreen":"Grasgrün","lightyellow":"Hellgelb","tan":"Hautfarben","darkviolet":"Dunkelviolett","lightslategrey":"Helles Schiefergrau","grey":"Grau","darkkhaki":"Dunkelkhaki","green":"Grün","deepskyblue":"Dunkles Himmelblau","aqua":"Wasserblau","sienna":"Sienna","mintcream":"Mintcreme","rosybrown":"Rosigbraun","mediumslateblue":"Mittelschieferblau ","magenta":"Magenta","lightseagreen":"Helles Meergrün","cyan":"Zyan","olivedrab":"Olivgrau","darkgoldenrod":"Dunkelgoldgelb","slateblue":"Schieferblau","mediumaquamarine":"Mittelaquamarin","lavender":"Lavendelblau","mediumseagreen":"Mittelmeeresgrün","maroon":"Kastanienbraun","darkslategray":"Dunkelschiefergrau","mediumturquoise":"Mitteltürkis ","ghostwhite":"Geisterweiß","darkblue":"Dunkelblau","mediumvioletred":"Mittelviolettrot ","brown":"Braun","lightgray":"Hellgrau","sandybrown":"Sandbraun","pink":"Rosa","firebrick":"Schamottestein","indigo":"Indigoblau","snow":"Schneeweiß","darkorchid":"Dunkelorchidee","turquoise":"Türkis","chocolate":"Schokoladenbraun","springgreen":"Frühlingsgrün","moccasin":"Mokassin","navy":"Marineblau","lemonchiffon":"Zitronenchiffon","teal":"Smaragdgrün","floralwhite":"Blütenweiß","cornflowerblue":"Kornblumenblau","paleturquoise":"Blasstürkis","purple":"Purpurrot","gainsboro":"Gainsboro","plum":"Pflaume","red":"Rot","blue":"Blau","forestgreen":"Forstgrün","darkgreen":"Dunkelgrün","honeydew":"Honigtau","darkseagreen":"Dunkles Meergrün","lightcoral":"Hellkoralle","palevioletred":"Blassviolettrot ","mediumpurple":"Mittelpurpur","saddlebrown":"Sattelbraun","darkmagenta":"Dunkelmagenta","thistle":"Distel","whitesmoke":"Rauchweiß","wheat":"Weizen","violet":"Violett","lightskyblue":"Helles Himmelblau","goldenrod":"Goldgelb","mediumblue":"Mittelblau","skyblue":"Himmelblau","crimson":"Karmesinrot","darksalmon":"Dunkellachs","darkred":"Dunkelrot","darkslategrey":"Dunkelschiefergrau","peru":"Peru","lightgrey":"Hellgrau","lightgoldenrodyellow":"Hellgoldgelb","blanchedalmond":"Mandelweiß","aliceblue":"Alice-blau","bisque":"Bisquit","slategray":"Schiefergrau","palegoldenrod":"Blassgoldgelb","darkorange":"Dunkelorange","aquamarine":"Aquamarin","lightgreen":"Hellgrün","burlywood":"Burlywood","dodgerblue":"Dodger-blau","darkgray":"Dunkelgrau","lightcyan":"Hellzyan","powderblue":"Pulverblau","blueviolet":"Blauviolett","orchid":"Orchidee","dimgray":"Blassgrau","beige":"Beige","fuchsia":"Fuchsia","lavenderblush":"Lavendelhauch","hotpink":"Knallrosa","steelblue":"Stahlblau","tomato":"Tomatenrot","lightpink":"Hellrosa","limegreen":"Limonengrün","indianred":"Indischrot","papayawhip":"Papayacreme","lightslategray":"Helles Schiefergrau","gray":"Grau","mediumorchid":"Mittelorchidee","cornsilk":"Kornseide","black":"Schwarz","seagreen":"Meeresgrün","darkslateblue":"Dunkelschieferblau","khaki":"Khaki","lightblue":"Hellblau","palegreen":"Blassgrün","azure":"Azur","peachpuff":"Pfirsich","darkolivegreen":"Dunkelolivgrün","yellowgreen":"Gelbgrün"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Vorherige Auswahl","nextMessage":"Weitere Auswahlmöglichkeiten"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Abbrechen","buttonSave":"Speichern","itemClose":"Schließen"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_de-de.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_de-de.js.uncompressed.js new file mode 100644 index 00000000..dda51bad --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_de-de.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_de-de',{ +'dijit/form/nls/validate':{"rangeMessage":"Dieser Wert liegt außerhalb des gültigen Bereichs. ","invalidMessage":"Der eingegebene Wert ist ungültig. ","missingMessage":"Dieser Wert ist erforderlich."} +, +'dijit/nls/loading':{"loadingState":"Wird geladen...","errorState":"Es ist ein Fehler aufgetreten."} +, +'dojo/nls/colors':{"lightsteelblue":"Helles Stahlblau","orangered":"Orangerot","midnightblue":"Mitternachtblau","cadetblue":"Kadettenblau","seashell":"Muschelweiß","slategrey":"Schiefergrau","coral":"Koralle","darkturquoise":"Dunkeltürkis","antiquewhite":"Antikweiß","mediumspringgreen":"Mittelfrühlingsgrün","transparent":"Transparent","salmon":"Lachs","darkgrey":"Dunkelgrau","ivory":"Elfenbein","greenyellow":"Grüngelb","mistyrose":"Blassrose","lightsalmon":"Helllachs","silver":"Silbergrau","dimgrey":"Blassgrau","orange":"Orange","white":"Weiß","navajowhite":"Navajo-weiß","royalblue":"Königsblau","deeppink":"Tiefrosa","lime":"Limone","oldlace":"Alte Spitze","chartreuse":"Helles Gelbgrün","darkcyan":"Dunkelzyan","yellow":"Gelb","linen":"Leinen","olive":"Oliv","gold":"Gold","lawngreen":"Grasgrün","lightyellow":"Hellgelb","tan":"Hautfarben","darkviolet":"Dunkelviolett","lightslategrey":"Helles Schiefergrau","grey":"Grau","darkkhaki":"Dunkelkhaki","green":"Grün","deepskyblue":"Dunkles Himmelblau","aqua":"Wasserblau","sienna":"Sienna","mintcream":"Mintcreme","rosybrown":"Rosigbraun","mediumslateblue":"Mittelschieferblau ","magenta":"Magenta","lightseagreen":"Helles Meergrün","cyan":"Zyan","olivedrab":"Olivgrau","darkgoldenrod":"Dunkelgoldgelb","slateblue":"Schieferblau","mediumaquamarine":"Mittelaquamarin","lavender":"Lavendelblau","mediumseagreen":"Mittelmeeresgrün","maroon":"Kastanienbraun","darkslategray":"Dunkelschiefergrau","mediumturquoise":"Mitteltürkis ","ghostwhite":"Geisterweiß","darkblue":"Dunkelblau","mediumvioletred":"Mittelviolettrot ","brown":"Braun","lightgray":"Hellgrau","sandybrown":"Sandbraun","pink":"Rosa","firebrick":"Schamottestein","indigo":"Indigoblau","snow":"Schneeweiß","darkorchid":"Dunkelorchidee","turquoise":"Türkis","chocolate":"Schokoladenbraun","springgreen":"Frühlingsgrün","moccasin":"Mokassin","navy":"Marineblau","lemonchiffon":"Zitronenchiffon","teal":"Smaragdgrün","floralwhite":"Blütenweiß","cornflowerblue":"Kornblumenblau","paleturquoise":"Blasstürkis","purple":"Purpurrot","gainsboro":"Gainsboro","plum":"Pflaume","red":"Rot","blue":"Blau","forestgreen":"Forstgrün","darkgreen":"Dunkelgrün","honeydew":"Honigtau","darkseagreen":"Dunkles Meergrün","lightcoral":"Hellkoralle","palevioletred":"Blassviolettrot ","mediumpurple":"Mittelpurpur","saddlebrown":"Sattelbraun","darkmagenta":"Dunkelmagenta","thistle":"Distel","whitesmoke":"Rauchweiß","wheat":"Weizen","violet":"Violett","lightskyblue":"Helles Himmelblau","goldenrod":"Goldgelb","mediumblue":"Mittelblau","skyblue":"Himmelblau","crimson":"Karmesinrot","darksalmon":"Dunkellachs","darkred":"Dunkelrot","darkslategrey":"Dunkelschiefergrau","peru":"Peru","lightgrey":"Hellgrau","lightgoldenrodyellow":"Hellgoldgelb","blanchedalmond":"Mandelweiß","aliceblue":"Alice-blau","bisque":"Bisquit","slategray":"Schiefergrau","palegoldenrod":"Blassgoldgelb","darkorange":"Dunkelorange","aquamarine":"Aquamarin","lightgreen":"Hellgrün","burlywood":"Burlywood","dodgerblue":"Dodger-blau","darkgray":"Dunkelgrau","lightcyan":"Hellzyan","powderblue":"Pulverblau","blueviolet":"Blauviolett","orchid":"Orchidee","dimgray":"Blassgrau","beige":"Beige","fuchsia":"Fuchsia","lavenderblush":"Lavendelhauch","hotpink":"Knallrosa","steelblue":"Stahlblau","tomato":"Tomatenrot","lightpink":"Hellrosa","limegreen":"Limonengrün","indianred":"Indischrot","papayawhip":"Papayacreme","lightslategray":"Helles Schiefergrau","gray":"Grau","mediumorchid":"Mittelorchidee","cornsilk":"Kornseide","black":"Schwarz","seagreen":"Meeresgrün","darkslateblue":"Dunkelschieferblau","khaki":"Khaki","lightblue":"Hellblau","palegreen":"Blassgrün","azure":"Azur","peachpuff":"Pfirsich","darkolivegreen":"Dunkelolivgrün","yellowgreen":"Gelbgrün"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Vorherige Auswahl","nextMessage":"Weitere Auswahlmöglichkeiten"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Abbrechen","buttonSave":"Speichern","itemClose":"Schließen"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_de.js b/lib/dojo/nls/tt-rss-layer_de.js deleted file mode 100644 index 9d0939e4..00000000 --- a/lib/dojo/nls/tt-rss-layer_de.js +++ /dev/null @@ -1 +0,0 @@ -dojo.provide("dojo.nls.tt-rss-layer_de");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.de");dojo.nls.colors.de={"lightsteelblue":"Helles Stahlblau","orangered":"Orangerot","midnightblue":"Mitternachtblau","cadetblue":"Kadettenblau","seashell":"Muschelweiß","slategrey":"Schiefergrau","coral":"Koralle","darkturquoise":"Dunkeltürkis","antiquewhite":"Antikweiß","mediumspringgreen":"Mittelfrühlingsgrün","salmon":"Lachs","darkgrey":"Dunkelgrau","ivory":"Elfenbein","greenyellow":"Grüngelb","mistyrose":"Blassrose","lightsalmon":"Helllachs","silver":"Silbergrau","dimgrey":"Blassgrau","orange":"Orange","white":"Weiß","navajowhite":"Navajo-weiß","royalblue":"Königsblau","deeppink":"Tiefrosa","lime":"Limone","oldlace":"Alte Spitze","chartreuse":"Helles Gelbgrün","darkcyan":"Dunkelzyan","yellow":"Gelb","linen":"Leinen","olive":"Oliv","gold":"Gold","lawngreen":"Grasgrün","lightyellow":"Hellgelb","tan":"Hautfarben","darkviolet":"Dunkelviolett","lightslategrey":"Helles Schiefergrau","grey":"Grau","darkkhaki":"Dunkelkhaki","green":"Grün","deepskyblue":"Dunkles Himmelblau","aqua":"Wasserblau","sienna":"Sienna","mintcream":"Mintcreme","rosybrown":"Rosigbraun","mediumslateblue":"Mittelschieferblau ","magenta":"Magenta","lightseagreen":"Helles Meergrün","cyan":"Zyan","olivedrab":"Olivgrau","darkgoldenrod":"Dunkelgoldgelb","slateblue":"Schieferblau","mediumaquamarine":"Mittelaquamarin","lavender":"Lavendelblau","mediumseagreen":"Mittelmeeresgrün","maroon":"Kastanienbraun","darkslategray":"Dunkelschiefergrau","mediumturquoise":"Mitteltürkis ","ghostwhite":"Geisterweiß","darkblue":"Dunkelblau","mediumvioletred":"Mittelviolettrot ","brown":"Braun","lightgray":"Hellgrau","sandybrown":"Sandbraun","pink":"Rosa","firebrick":"Schamottestein","indigo":"Indigoblau","snow":"Schneeweiß","darkorchid":"Dunkelorchidee","turquoise":"Türkis","chocolate":"Schokoladenbraun","springgreen":"Frühlingsgrün","moccasin":"Mokassin","navy":"Marineblau","lemonchiffon":"Zitronenchiffon","teal":"Smaragdgrün","floralwhite":"Blütenweiß","cornflowerblue":"Kornblumenblau","paleturquoise":"Blasstürkis","purple":"Purpurrot","gainsboro":"Gainsboro","plum":"Pflaume","red":"Rot","blue":"Blau","forestgreen":"Forstgrün","darkgreen":"Dunkelgrün","honeydew":"Honigtau","darkseagreen":"Dunkles Meergrün","lightcoral":"Hellkoralle","palevioletred":"Blassviolettrot ","mediumpurple":"Mittelpurpur","saddlebrown":"Sattelbraun","darkmagenta":"Dunkelmagenta","thistle":"Distel","whitesmoke":"Rauchweiß","wheat":"Weizen","violet":"Violett","lightskyblue":"Helles Himmelblau","goldenrod":"Goldgelb","mediumblue":"Mittelblau","skyblue":"Himmelblau","crimson":"Karmesinrot","darksalmon":"Dunkellachs","darkred":"Dunkelrot","darkslategrey":"Dunkelschiefergrau","peru":"Peru","lightgrey":"Hellgrau","lightgoldenrodyellow":"Hellgoldgelb","blanchedalmond":"Mandelweiß","aliceblue":"Alice-blau","bisque":"Bisquit","slategray":"Schiefergrau","palegoldenrod":"Blassgoldgelb","darkorange":"Dunkelorange","aquamarine":"Aquamarin","lightgreen":"Hellgrün","burlywood":"Burlywood","dodgerblue":"Dodger-blau","darkgray":"Dunkelgrau","lightcyan":"Hellzyan","powderblue":"Pulverblau","blueviolet":"Blauviolett","orchid":"Orchidee","dimgray":"Blassgrau","beige":"Beige","fuchsia":"Fuchsia","lavenderblush":"Lavendelhauch","hotpink":"Knallrosa","steelblue":"Stahlblau","tomato":"Tomatenrot","lightpink":"Hellrosa","limegreen":"Limonengrün","indianred":"Indischrot","papayawhip":"Papayacreme","lightslategray":"Helles Schiefergrau","gray":"Grau","mediumorchid":"Mittelorchidee","cornsilk":"Kornseide","black":"Schwarz","seagreen":"Meeresgrün","darkslateblue":"Dunkelschieferblau","khaki":"Khaki","lightblue":"Hellblau","palegreen":"Blassgrün","azure":"Azur","peachpuff":"Pfirsich","darkolivegreen":"Dunkelolivgrün","yellowgreen":"Gelbgrün"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.de");dijit.nls.loading.de={"loadingState":"Wird geladen...","errorState":"Es ist ein Fehler aufgetreten."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.de");dijit.nls.common.de={"buttonOk":"OK","buttonCancel":"Abbrechen","buttonSave":"Speichern","itemClose":"Schließen"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.de");dijit.form.nls.validate.de={"rangeMessage":"Dieser Wert liegt außerhalb des gültigen Bereichs. ","invalidMessage":"Der eingegebene Wert ist ungültig. ","missingMessage":"Dieser Wert ist erforderlich."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.de");dijit.form.nls.ComboBox.de={"previousMessage":"Vorherige Auswahl","nextMessage":"Weitere Auswahlmöglichkeiten"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.de");dojo.cldr.nls.number.de={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; diff --git a/lib/dojo/nls/tt-rss-layer_el.js b/lib/dojo/nls/tt-rss-layer_el.js index 37975974..7279885a 100644 --- a/lib/dojo/nls/tt-rss-layer_el.js +++ b/lib/dojo/nls/tt-rss-layer_el.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_el");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.el");dojo.nls.colors.el={"lightsteelblue":"ανοιχτό μπλε ατσαλιού","orangered":"πορτοκαλοκόκκινο","midnightblue":"πολύ σκούρο μπλε","cadetblue":"μπλε του στρατού","seashell":"κοχύλι","slategrey":"μεταλλικό γκρι","coral":"κοραλί","darkturquoise":"σκούρο τυρκουάζ","antiquewhite":"ξεθωριασμένο λευκό","mediumspringgreen":"μεσαίο πράσινο της άνοιξης","salmon":"σομόν","darkgrey":"σκούρο γκρι","ivory":"ιβουάρ","greenyellow":"πρασινοκίτρινο","mistyrose":"τριανταφυλλί","lightsalmon":"ανοιχτό σομόν","silver":"ασημί","dimgrey":"αχνό γκρι","orange":"πορτοκαλί","white":"λευκό","navajowhite":"άσπρο Ναβάχο","royalblue":"έντονο μπλε","deeppink":"βαθύ ροζ","lime":"λαχανί","oldlace":"εκρού","chartreuse":"φωτεινό κιτρινοπράσινο","darkcyan":"σκούρο κυανό","yellow":"κίτρινο","linen":"σπαγγί","olive":"πράσινο λαδί","gold":"χρυσαφί","lawngreen":"σκούρο πράσινο","lightyellow":"ανοιχτό κίτρινο","tan":"ώχρα","darkviolet":"σκούρο βιολετί","lightslategrey":"ανοιχτό μεταλλικό γκρι","grey":"γκρι","darkkhaki":"σκούρο χακί","green":"πράσινο","deepskyblue":"βαθύ μπλε το ουρανού","aqua":"γαλάζιο","sienna":"καφεκίτρινο","mintcream":"βεραμάν","rosybrown":"καστανό","mediumslateblue":"μεσαίο μεταλλικό μπλε","magenta":"ματζέντα","lightseagreen":"ανοιχτό πράσινο της θάλασσας","cyan":"κυανό","olivedrab":"λαδί","darkgoldenrod":"σκούρο χρυσοκίτρινο","slateblue":"μεταλλικό μπλε","mediumaquamarine":"μεσαίο γαλαζοπράσινο","lavender":"λίλα","mediumseagreen":"μεσαίο πράσινο της θάλασσας","maroon":"βυσσινί","darkslategray":"σκούρο μεταλλικό γκρι","mediumturquoise":"μεσαίο τυρκουάζ","ghostwhite":"άσπρο","darkblue":"σκούρο μπλε","mediumvioletred":"μεσαίο κόκκινο βιολετί","brown":"καφέ","lightgray":"ανοιχτό γκρι","sandybrown":"μπεζ της άμμου","pink":"ροζ","firebrick":"κεραμιδί","indigo":"λουλακί","snow":"χιονί","darkorchid":"σκούρα ορχιδέα","turquoise":"τυρκουάζ","chocolate":"σοκολατί","springgreen":"πράσινο της άνοιξης","moccasin":"μόκα","navy":"μπλε του ναυτικού","lemonchiffon":"λεμονί","teal":"πετρόλ","floralwhite":"λευκό των ανθών","cornflowerblue":"μεσαίο μπλε","paleturquoise":"αχνό τυρκουάζ","purple":"μωβ","gainsboro":"γκρι σιέλ","plum":"δαμασκηνί","red":"κόκκινο","blue":"μπλε","forestgreen":"πράσινο του δάσους","darkgreen":"σκούρο πράσινο","honeydew":"μελί","darkseagreen":"σκούρο πράσινο της θάλασσας","lightcoral":"ανοιχτό κοραλί","palevioletred":"αχνό κόκκινο βιολετί","mediumpurple":"μεσαίο μωβ","saddlebrown":"βαθύ καφέ","darkmagenta":"σκούρο ματζέντα","thistle":"μωβ βιολετί","whitesmoke":"λευκός καπνός","wheat":"σταρένιο","violet":"βιολετί","lightskyblue":"ανοιχτό μπλε το ουρανού","goldenrod":"χρυσοκίτρινο","mediumblue":"μεσαίο μπλε","skyblue":"μπλε του ουρανού","crimson":"βαθύ κόκκινο","darksalmon":"σκούρο σομόν","darkred":"σκούρο κόκκινο","darkslategrey":"σκούρο μεταλλικό γκρι","peru":"περού","lightgrey":"ανοιχτό γκρι","lightgoldenrodyellow":"ανοιχτό χρυσοκίτρινο","blanchedalmond":"ζαχαρί","aliceblue":"σιέλ","bisque":"σκούρο κρεμ","slategray":"μεταλλικό γκρι","palegoldenrod":"αχνό χρυσοκίτρινο","darkorange":"σκούρο πορτοκαλί","aquamarine":"γαλαζοπράσινο","lightgreen":"ανοιχτό πράσινο","burlywood":"καφέ του ξύλου","dodgerblue":"σκούρο ελεκτρίκ","darkgray":"σκούρο γκρι","lightcyan":"ανοιχτό κυανό","powderblue":"αχνό μπλε","blueviolet":"βιολετί","orchid":"ορχιδέα","dimgray":"αχνό γκρι","beige":"μπεζ","fuchsia":"φούξια","lavenderblush":"μωβ λεβάντας","hotpink":"έντονο ροζ","steelblue":"μπλε ατσαλιού","tomato":"κόκκινο της ντομάτας","lightpink":"ανοιχτό ροζ","limegreen":"πράσινο λαχανί","indianred":"ινδικό κόκκινο","papayawhip":"αχνό ροζ","lightslategray":"ανοιχτό μεταλλικό γκρι","gray":"γκρι","mediumorchid":"μεσαία ορχιδέα","cornsilk":"ασημί του καλαμποκιού","black":"μαύρο","seagreen":"πράσινο της θάλασσας","darkslateblue":"σκούρο μεταλλικό μπλε","khaki":"χακί","lightblue":"ανοιχτό μπλε","palegreen":"αχνό πράσινο","azure":"μπλε του ουρανού","peachpuff":"ροδακινί","darkolivegreen":"σκούρο πράσινο λαδί","yellowgreen":"κιτρινοπράσινο"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.el");dijit.nls.loading.el={"loadingState":"Φόρτωση...","errorState":"Σας ζητούμε συγνώμη, παρουσιάστηκε σφάλμα"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.el");dijit.nls.common.el={"buttonOk":"ΟΚ","buttonCancel":"Ακύρωση","buttonSave":"Αποθήκευση","itemClose":"Κλείσιμο"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.el");dijit.form.nls.validate.el={"rangeMessage":"Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών.","invalidMessage":"Η τιμή που καταχωρήσατε δεν είναι έγκυρη.","missingMessage":"Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.el");dijit.form.nls.ComboBox.el={"previousMessage":"Προηγούμενες επιλογές","nextMessage":"Περισσότερες επιλογές"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.el");dojo.cldr.nls.number.el={"group":".","percentSign":"%","exponential":"e","percentFormat":"#,##0%","list":",","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","currencyFormat":"#,##0.00 ¤","plusSign":"+","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","decimalFormat":"#,##0.###","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_el",{"dijit/form/nls/validate":{"rangeMessage":"Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών.","invalidMessage":"Η τιμή που καταχωρήσατε δεν είναι έγκυρη.","missingMessage":"Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί."},"dijit/nls/loading":{"loadingState":"Φόρτωση...","errorState":"Σας ζητούμε συγνώμη, παρουσιάστηκε σφάλμα"},"dojo/nls/colors":{"lightsteelblue":"ανοιχτό μπλε ατσαλιού","orangered":"πορτοκαλοκόκκινο","midnightblue":"πολύ σκούρο μπλε","cadetblue":"μπλε του στρατού","seashell":"κοχύλι","slategrey":"μεταλλικό γκρι","coral":"κοραλί","darkturquoise":"σκούρο τυρκουάζ","antiquewhite":"ξεθωριασμένο λευκό","mediumspringgreen":"μεσαίο πράσινο της άνοιξης","transparent":"διαφανές","salmon":"σομόν","darkgrey":"σκούρο γκρι","ivory":"ιβουάρ","greenyellow":"πρασινοκίτρινο","mistyrose":"τριανταφυλλί","lightsalmon":"ανοιχτό σομόν","silver":"ασημί","dimgrey":"αχνό γκρι","orange":"πορτοκαλί","white":"λευκό","navajowhite":"άσπρο Ναβάχο","royalblue":"έντονο μπλε","deeppink":"βαθύ ροζ","lime":"λαχανί","oldlace":"εκρού","chartreuse":"φωτεινό κιτρινοπράσινο","darkcyan":"σκούρο κυανό","yellow":"κίτρινο","linen":"σπαγγί","olive":"πράσινο λαδί","gold":"χρυσαφί","lawngreen":"σκούρο πράσινο","lightyellow":"ανοιχτό κίτρινο","tan":"ώχρα","darkviolet":"σκούρο βιολετί","lightslategrey":"ανοιχτό μεταλλικό γκρι","grey":"γκρι","darkkhaki":"σκούρο χακί","green":"πράσινο","deepskyblue":"βαθύ μπλε το ουρανού","aqua":"γαλάζιο","sienna":"καφεκίτρινο","mintcream":"βεραμάν","rosybrown":"καστανό","mediumslateblue":"μεσαίο μεταλλικό μπλε","magenta":"ματζέντα","lightseagreen":"ανοιχτό πράσινο της θάλασσας","cyan":"κυανό","olivedrab":"λαδί","darkgoldenrod":"σκούρο χρυσοκίτρινο","slateblue":"μεταλλικό μπλε","mediumaquamarine":"μεσαίο γαλαζοπράσινο","lavender":"λίλα","mediumseagreen":"μεσαίο πράσινο της θάλασσας","maroon":"βυσσινί","darkslategray":"σκούρο μεταλλικό γκρι","mediumturquoise":"μεσαίο τυρκουάζ","ghostwhite":"άσπρο","darkblue":"σκούρο μπλε","mediumvioletred":"μεσαίο κόκκινο βιολετί","brown":"καφέ","lightgray":"ανοιχτό γκρι","sandybrown":"μπεζ της άμμου","pink":"ροζ","firebrick":"κεραμιδί","indigo":"λουλακί","snow":"χιονί","darkorchid":"σκούρα ορχιδέα","turquoise":"τυρκουάζ","chocolate":"σοκολατί","springgreen":"πράσινο της άνοιξης","moccasin":"μόκα","navy":"μπλε του ναυτικού","lemonchiffon":"λεμονί","teal":"πετρόλ","floralwhite":"λευκό των ανθών","cornflowerblue":"μεσαίο μπλε","paleturquoise":"αχνό τυρκουάζ","purple":"μωβ","gainsboro":"γκρι σιέλ","plum":"δαμασκηνί","red":"κόκκινο","blue":"μπλε","forestgreen":"πράσινο του δάσους","darkgreen":"σκούρο πράσινο","honeydew":"μελί","darkseagreen":"σκούρο πράσινο της θάλασσας","lightcoral":"ανοιχτό κοραλί","palevioletred":"αχνό κόκκινο βιολετί","mediumpurple":"μεσαίο μωβ","saddlebrown":"βαθύ καφέ","darkmagenta":"σκούρο ματζέντα","thistle":"μωβ βιολετί","whitesmoke":"λευκός καπνός","wheat":"σταρένιο","violet":"βιολετί","lightskyblue":"ανοιχτό μπλε το ουρανού","goldenrod":"χρυσοκίτρινο","mediumblue":"μεσαίο μπλε","skyblue":"μπλε του ουρανού","crimson":"βαθύ κόκκινο","darksalmon":"σκούρο σομόν","darkred":"σκούρο κόκκινο","darkslategrey":"σκούρο μεταλλικό γκρι","peru":"περού","lightgrey":"ανοιχτό γκρι","lightgoldenrodyellow":"ανοιχτό χρυσοκίτρινο","blanchedalmond":"ζαχαρί","aliceblue":"σιέλ","bisque":"σκούρο κρεμ","slategray":"μεταλλικό γκρι","palegoldenrod":"αχνό χρυσοκίτρινο","darkorange":"σκούρο πορτοκαλί","aquamarine":"γαλαζοπράσινο","lightgreen":"ανοιχτό πράσινο","burlywood":"καφέ του ξύλου","dodgerblue":"σκούρο ελεκτρίκ","darkgray":"σκούρο γκρι","lightcyan":"ανοιχτό κυανό","powderblue":"αχνό μπλε","blueviolet":"βιολετί","orchid":"ορχιδέα","dimgray":"αχνό γκρι","beige":"μπεζ","fuchsia":"φούξια","lavenderblush":"μωβ λεβάντας","hotpink":"έντονο ροζ","steelblue":"μπλε ατσαλιού","tomato":"κόκκινο της ντομάτας","lightpink":"ανοιχτό ροζ","limegreen":"πράσινο λαχανί","indianred":"ινδικό κόκκινο","papayawhip":"αχνό ροζ","lightslategray":"ανοιχτό μεταλλικό γκρι","gray":"γκρι","mediumorchid":"μεσαία ορχιδέα","cornsilk":"ασημί του καλαμποκιού","black":"μαύρο","seagreen":"πράσινο της θάλασσας","darkslateblue":"σκούρο μεταλλικό μπλε","khaki":"χακί","lightblue":"ανοιχτό μπλε","palegreen":"αχνό πράσινο","azure":"μπλε του ουρανού","peachpuff":"ροδακινί","darkolivegreen":"σκούρο πράσινο λαδί","yellowgreen":"κιτρινοπράσινο"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":",","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"e"},"dijit/form/nls/ComboBox":{"previousMessage":"Προηγούμενες επιλογές","nextMessage":"Περισσότερες επιλογές"},"dijit/nls/common":{"buttonOk":"ΟΚ","buttonCancel":"Ακύρωση","buttonSave":"Αποθήκευση","itemClose":"Κλείσιμο"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_el.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_el.js.uncompressed.js new file mode 100644 index 00000000..98ddc657 --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_el.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_el',{ +'dijit/form/nls/validate':{"rangeMessage":"Η τιμή αυτή δεν ανήκει στο εύρος έγκυρων τιμών.","invalidMessage":"Η τιμή που καταχωρήσατε δεν είναι έγκυρη.","missingMessage":"Η τιμή αυτή πρέπει απαραίτητα να καθοριστεί."} +, +'dijit/nls/loading':{"loadingState":"Φόρτωση...","errorState":"Σας ζητούμε συγνώμη, παρουσιάστηκε σφάλμα"} +, +'dojo/nls/colors':{"lightsteelblue":"ανοιχτό μπλε ατσαλιού","orangered":"πορτοκαλοκόκκινο","midnightblue":"πολύ σκούρο μπλε","cadetblue":"μπλε του στρατού","seashell":"κοχύλι","slategrey":"μεταλλικό γκρι","coral":"κοραλί","darkturquoise":"σκούρο τυρκουάζ","antiquewhite":"ξεθωριασμένο λευκό","mediumspringgreen":"μεσαίο πράσινο της άνοιξης","transparent":"διαφανές","salmon":"σομόν","darkgrey":"σκούρο γκρι","ivory":"ιβουάρ","greenyellow":"πρασινοκίτρινο","mistyrose":"τριανταφυλλί","lightsalmon":"ανοιχτό σομόν","silver":"ασημί","dimgrey":"αχνό γκρι","orange":"πορτοκαλί","white":"λευκό","navajowhite":"άσπρο Ναβάχο","royalblue":"έντονο μπλε","deeppink":"βαθύ ροζ","lime":"λαχανί","oldlace":"εκρού","chartreuse":"φωτεινό κιτρινοπράσινο","darkcyan":"σκούρο κυανό","yellow":"κίτρινο","linen":"σπαγγί","olive":"πράσινο λαδί","gold":"χρυσαφί","lawngreen":"σκούρο πράσινο","lightyellow":"ανοιχτό κίτρινο","tan":"ώχρα","darkviolet":"σκούρο βιολετί","lightslategrey":"ανοιχτό μεταλλικό γκρι","grey":"γκρι","darkkhaki":"σκούρο χακί","green":"πράσινο","deepskyblue":"βαθύ μπλε το ουρανού","aqua":"γαλάζιο","sienna":"καφεκίτρινο","mintcream":"βεραμάν","rosybrown":"καστανό","mediumslateblue":"μεσαίο μεταλλικό μπλε","magenta":"ματζέντα","lightseagreen":"ανοιχτό πράσινο της θάλασσας","cyan":"κυανό","olivedrab":"λαδί","darkgoldenrod":"σκούρο χρυσοκίτρινο","slateblue":"μεταλλικό μπλε","mediumaquamarine":"μεσαίο γαλαζοπράσινο","lavender":"λίλα","mediumseagreen":"μεσαίο πράσινο της θάλασσας","maroon":"βυσσινί","darkslategray":"σκούρο μεταλλικό γκρι","mediumturquoise":"μεσαίο τυρκουάζ","ghostwhite":"άσπρο","darkblue":"σκούρο μπλε","mediumvioletred":"μεσαίο κόκκινο βιολετί","brown":"καφέ","lightgray":"ανοιχτό γκρι","sandybrown":"μπεζ της άμμου","pink":"ροζ","firebrick":"κεραμιδί","indigo":"λουλακί","snow":"χιονί","darkorchid":"σκούρα ορχιδέα","turquoise":"τυρκουάζ","chocolate":"σοκολατί","springgreen":"πράσινο της άνοιξης","moccasin":"μόκα","navy":"μπλε του ναυτικού","lemonchiffon":"λεμονί","teal":"πετρόλ","floralwhite":"λευκό των ανθών","cornflowerblue":"μεσαίο μπλε","paleturquoise":"αχνό τυρκουάζ","purple":"μωβ","gainsboro":"γκρι σιέλ","plum":"δαμασκηνί","red":"κόκκινο","blue":"μπλε","forestgreen":"πράσινο του δάσους","darkgreen":"σκούρο πράσινο","honeydew":"μελί","darkseagreen":"σκούρο πράσινο της θάλασσας","lightcoral":"ανοιχτό κοραλί","palevioletred":"αχνό κόκκινο βιολετί","mediumpurple":"μεσαίο μωβ","saddlebrown":"βαθύ καφέ","darkmagenta":"σκούρο ματζέντα","thistle":"μωβ βιολετί","whitesmoke":"λευκός καπνός","wheat":"σταρένιο","violet":"βιολετί","lightskyblue":"ανοιχτό μπλε το ουρανού","goldenrod":"χρυσοκίτρινο","mediumblue":"μεσαίο μπλε","skyblue":"μπλε του ουρανού","crimson":"βαθύ κόκκινο","darksalmon":"σκούρο σομόν","darkred":"σκούρο κόκκινο","darkslategrey":"σκούρο μεταλλικό γκρι","peru":"περού","lightgrey":"ανοιχτό γκρι","lightgoldenrodyellow":"ανοιχτό χρυσοκίτρινο","blanchedalmond":"ζαχαρί","aliceblue":"σιέλ","bisque":"σκούρο κρεμ","slategray":"μεταλλικό γκρι","palegoldenrod":"αχνό χρυσοκίτρινο","darkorange":"σκούρο πορτοκαλί","aquamarine":"γαλαζοπράσινο","lightgreen":"ανοιχτό πράσινο","burlywood":"καφέ του ξύλου","dodgerblue":"σκούρο ελεκτρίκ","darkgray":"σκούρο γκρι","lightcyan":"ανοιχτό κυανό","powderblue":"αχνό μπλε","blueviolet":"βιολετί","orchid":"ορχιδέα","dimgray":"αχνό γκρι","beige":"μπεζ","fuchsia":"φούξια","lavenderblush":"μωβ λεβάντας","hotpink":"έντονο ροζ","steelblue":"μπλε ατσαλιού","tomato":"κόκκινο της ντομάτας","lightpink":"ανοιχτό ροζ","limegreen":"πράσινο λαχανί","indianred":"ινδικό κόκκινο","papayawhip":"αχνό ροζ","lightslategray":"ανοιχτό μεταλλικό γκρι","gray":"γκρι","mediumorchid":"μεσαία ορχιδέα","cornsilk":"ασημί του καλαμποκιού","black":"μαύρο","seagreen":"πράσινο της θάλασσας","darkslateblue":"σκούρο μεταλλικό μπλε","khaki":"χακί","lightblue":"ανοιχτό μπλε","palegreen":"αχνό πράσινο","azure":"μπλε του ουρανού","peachpuff":"ροδακινί","darkolivegreen":"σκούρο πράσινο λαδί","yellowgreen":"κιτρινοπράσινο"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":",","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"e"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Προηγούμενες επιλογές","nextMessage":"Περισσότερες επιλογές"} +, +'dijit/nls/common':{"buttonOk":"ΟΚ","buttonCancel":"Ακύρωση","buttonSave":"Αποθήκευση","itemClose":"Κλείσιμο"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_en-gb.js b/lib/dojo/nls/tt-rss-layer_en-gb.js index 729bd63b..72844ccc 100644 --- a/lib/dojo/nls/tt-rss-layer_en-gb.js +++ b/lib/dojo/nls/tt-rss-layer_en-gb.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_en-gb");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.en_gb");dojo.nls.colors.en_gb={"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.en_gb");dijit.nls.loading.en_gb={"loadingState":"Loading...","errorState":"Sorry, an error occurred"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.en_gb");dijit.nls.common.en_gb={"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.en_gb");dijit.form.nls.validate.en_gb={"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.en_gb");dijit.form.nls.ComboBox.en_gb={"previousMessage":"Previous choices","nextMessage":"More choices"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.en_gb");dojo.cldr.nls.number.en_gb={"currencyFormat":"¤#,##0.00","group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","plusSign":"+","decimalFormat-short":"000T","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_en-gb",{"dijit/form/nls/validate":{"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."},"dijit/nls/loading":{"loadingState":"Loading...","errorState":"Sorry, an error occurred"},"dojo/nls/colors":{"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"transparent","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Previous choices","nextMessage":"More choices"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_en-gb.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_en-gb.js.uncompressed.js new file mode 100644 index 00000000..ac3132c3 --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_en-gb.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_en-gb',{ +'dijit/form/nls/validate':{"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."} +, +'dijit/nls/loading':{"loadingState":"Loading...","errorState":"Sorry, an error occurred"} +, +'dojo/nls/colors':{"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"transparent","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Previous choices","nextMessage":"More choices"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_en-us.js b/lib/dojo/nls/tt-rss-layer_en-us.js index d8be077f..741517bf 100644 --- a/lib/dojo/nls/tt-rss-layer_en-us.js +++ b/lib/dojo/nls/tt-rss-layer_en-us.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_en-us");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.en_us");dojo.nls.colors.en_us={"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.en_us");dijit.nls.loading.en_us={"loadingState":"Loading...","errorState":"Sorry, an error occurred"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.en_us");dijit.nls.common.en_us={"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.en_us");dijit.form.nls.validate.en_us={"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.en_us");dijit.form.nls.ComboBox.en_us={"previousMessage":"Previous choices","nextMessage":"More choices"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.en_us");dojo.cldr.nls.number.en_us={"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;(¤#,##0.00)","plusSign":"+","decimalFormat-short":"000T","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_en-us",{"dijit/form/nls/validate":{"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."},"dijit/nls/loading":{"loadingState":"Loading...","errorState":"Sorry, an error occurred"},"dojo/nls/colors":{"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"transparent","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00;(¤#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Previous choices","nextMessage":"More choices"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_en-us.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_en-us.js.uncompressed.js new file mode 100644 index 00000000..c951cbd3 --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_en-us.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_en-us',{ +'dijit/form/nls/validate':{"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."} +, +'dijit/nls/loading':{"loadingState":"Loading...","errorState":"Sorry, an error occurred"} +, +'dojo/nls/colors':{"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"transparent","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00;(¤#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Previous choices","nextMessage":"More choices"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_en.js b/lib/dojo/nls/tt-rss-layer_en.js deleted file mode 100644 index 2cb4b573..00000000 --- a/lib/dojo/nls/tt-rss-layer_en.js +++ /dev/null @@ -1 +0,0 @@ -dojo.provide("dojo.nls.tt-rss-layer_en");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.en");dojo.nls.colors.en={"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.en");dijit.nls.loading.en={"loadingState":"Loading...","errorState":"Sorry, an error occurred"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.en");dijit.nls.common.en={"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.en");dijit.form.nls.validate.en={"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.en");dijit.form.nls.ComboBox.en={"previousMessage":"Previous choices","nextMessage":"More choices"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.en");dojo.cldr.nls.number.en={"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;(¤#,##0.00)","plusSign":"+","decimalFormat-short":"000T","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; diff --git a/lib/dojo/nls/tt-rss-layer_es-es.js b/lib/dojo/nls/tt-rss-layer_es-es.js index 832d1fbb..df857f92 100644 --- a/lib/dojo/nls/tt-rss-layer_es-es.js +++ b/lib/dojo/nls/tt-rss-layer_es-es.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_es-es");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.es_es");dojo.nls.colors.es_es={"lightsteelblue":"azul acero claro","orangered":"rojo anaranjado","midnightblue":"azul medianoche","cadetblue":"azul cadete","seashell":"blanco marfil","slategrey":"gris pizarra","coral":"coral","darkturquoise":"turquesa oscuro","antiquewhite":"blanco antiguo","mediumspringgreen":"verde primavera medio","salmon":"salmón","darkgrey":"gris oscuro","ivory":"marfil","greenyellow":"amarillo verdoso","mistyrose":"rosa difuminado","lightsalmon":"salmón claro","silver":"plateado","dimgrey":"gris marengo","orange":"naranja","white":"blanco","navajowhite":"blanco navajo","royalblue":"azul real","deeppink":"rosa fuerte","lime":"lima","oldlace":"encaje antiguo","chartreuse":"verde pálido 2","darkcyan":"cian oscuro","yellow":"amarillo","linen":"blanco arena","olive":"verde oliva","gold":"oro","lawngreen":"verde césped","lightyellow":"amarillo claro","tan":"canela","darkviolet":"violeta oscuro","lightslategrey":"gris pizarra claro","grey":"gris","darkkhaki":"caqui oscuro","green":"verde","deepskyblue":"azul cielo fuerte","aqua":"aguamarina","sienna":"siena","mintcream":"crema menta","rosybrown":"marrón rosáceo","mediumslateblue":"azul pizarra medio","magenta":"magenta","lightseagreen":"verde mar claro","cyan":"cian","olivedrab":"verde oliva pardusco","darkgoldenrod":"ocre oscuro","slateblue":"azul pizarra","mediumaquamarine":"aguamarina medio","lavender":"lavanda","mediumseagreen":"verde mar medio","maroon":"granate","darkslategray":"gris pizarra oscuro","mediumturquoise":"turquesa medio","ghostwhite":"blanco ligero","darkblue":"azul oscuro","mediumvioletred":"rojo violáceo medio","brown":"marrón","lightgray":"gris claro","sandybrown":"marrón arcilla","pink":"rosa","firebrick":"teja","indigo":"añil","snow":"nieve","darkorchid":"orquídea oscuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde fuerte","moccasin":"arena","navy":"azul marino","lemonchiffon":"amarillo pastel","teal":"verde azulado","floralwhite":"blanco manteca","cornflowerblue":"azul aciano","paleturquoise":"turquesa pálido","purple":"púrpura","gainsboro":"azul gainsboro","plum":"ciruela","red":"rojo","blue":"azul","forestgreen":"verde pino","darkgreen":"verde oscuro","honeydew":"flor de rocío","darkseagreen":"verde mar oscuro","lightcoral":"coral claro","palevioletred":"rojo violáceo pálido","mediumpurple":"púrpura medio","saddlebrown":"cuero","darkmagenta":"magenta oscuro","thistle":"cardo","whitesmoke":"blanco ahumado","wheat":"trigo","violet":"violeta","lightskyblue":"azul cielo claro","goldenrod":"ocre","mediumblue":"azul medio","skyblue":"azul cielo","crimson":"carmesí","darksalmon":"salmón oscuro","darkred":"rojo oscuro","darkslategrey":"gris pizarra oscuro","peru":"perú","lightgrey":"gris claro","lightgoldenrodyellow":"ocre claro","blanchedalmond":"almendra pálido","aliceblue":"blanco azulado","bisque":"miel","slategray":"gris pizarra","palegoldenrod":"ocre pálido","darkorange":"naranja oscuro","aquamarine":"aguamarina 2","lightgreen":"verde claro","burlywood":"madera","dodgerblue":"azul fuerte","darkgray":"gris oscuro","lightcyan":"cian claro","powderblue":"azul suave","blueviolet":"azul violáceo","orchid":"orquídea","dimgray":"gris marengo","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosácea","hotpink":"rosa oscuro","steelblue":"azul acero","tomato":"tomate","lightpink":"rosa claro","limegreen":"lima limón","indianred":"rojo teja","papayawhip":"papaya claro","lightslategray":"gris pizarra claro","gray":"gris","mediumorchid":"orquídea medio","cornsilk":"crudo","black":"negro","seagreen":"verde mar","darkslateblue":"azul pizarra oscuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"blanco cielo","peachpuff":"melocotón","darkolivegreen":"verde oliva oscuro","yellowgreen":"verde amarillento"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.es_es");dijit.nls.loading.es_es={"loadingState":"Cargando...","errorState":"Lo siento, se ha producido un error"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.es_es");dijit.nls.common.es_es={"buttonOk":"Aceptar","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Cerrar"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.es_es");dijit.form.nls.validate.es_es={"rangeMessage":"Este valor está fuera del intervalo.","invalidMessage":"El valor especificado no es válido.","missingMessage":"Este valor es necesario."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.es_es");dijit.form.nls.ComboBox.es_es={"previousMessage":"Opciones anteriores","nextMessage":"Más opciones"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.es_es");dojo.cldr.nls.number.es_es={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_es-es",{"dijit/form/nls/validate":{"rangeMessage":"Este valor está fuera del intervalo.","invalidMessage":"El valor especificado no es válido.","missingMessage":"Este valor es necesario."},"dijit/nls/loading":{"loadingState":"Cargando...","errorState":"Lo siento, se ha producido un error"},"dojo/nls/colors":{"lightsteelblue":"azul acero claro","orangered":"rojo anaranjado","midnightblue":"azul medianoche","cadetblue":"azul cadete","seashell":"blanco marfil","slategrey":"gris pizarra","coral":"coral","darkturquoise":"turquesa oscuro","antiquewhite":"blanco antiguo","mediumspringgreen":"verde primavera medio","transparent":"transparente","salmon":"salmón","darkgrey":"gris oscuro","ivory":"marfil","greenyellow":"amarillo verdoso","mistyrose":"rosa difuminado","lightsalmon":"salmón claro","silver":"plateado","dimgrey":"gris marengo","orange":"naranja","white":"blanco","navajowhite":"blanco navajo","royalblue":"azul real","deeppink":"rosa fuerte","lime":"lima","oldlace":"encaje antiguo","chartreuse":"verde pálido 2","darkcyan":"cian oscuro","yellow":"amarillo","linen":"blanco arena","olive":"verde oliva","gold":"oro","lawngreen":"verde césped","lightyellow":"amarillo claro","tan":"canela","darkviolet":"violeta oscuro","lightslategrey":"gris pizarra claro","grey":"gris","darkkhaki":"caqui oscuro","green":"verde","deepskyblue":"azul cielo fuerte","aqua":"aguamarina","sienna":"siena","mintcream":"crema menta","rosybrown":"marrón rosáceo","mediumslateblue":"azul pizarra medio","magenta":"magenta","lightseagreen":"verde mar claro","cyan":"cian","olivedrab":"verde oliva pardusco","darkgoldenrod":"ocre oscuro","slateblue":"azul pizarra","mediumaquamarine":"aguamarina medio","lavender":"lavanda","mediumseagreen":"verde mar medio","maroon":"granate","darkslategray":"gris pizarra oscuro","mediumturquoise":"turquesa medio","ghostwhite":"blanco ligero","darkblue":"azul oscuro","mediumvioletred":"rojo violáceo medio","brown":"marrón","lightgray":"gris claro","sandybrown":"marrón arcilla","pink":"rosa","firebrick":"teja","indigo":"añil","snow":"nieve","darkorchid":"orquídea oscuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde fuerte","moccasin":"arena","navy":"azul marino","lemonchiffon":"amarillo pastel","teal":"verde azulado","floralwhite":"blanco manteca","cornflowerblue":"azul aciano","paleturquoise":"turquesa pálido","purple":"púrpura","gainsboro":"azul gainsboro","plum":"ciruela","red":"rojo","blue":"azul","forestgreen":"verde pino","darkgreen":"verde oscuro","honeydew":"flor de rocío","darkseagreen":"verde mar oscuro","lightcoral":"coral claro","palevioletred":"rojo violáceo pálido","mediumpurple":"púrpura medio","saddlebrown":"cuero","darkmagenta":"magenta oscuro","thistle":"cardo","whitesmoke":"blanco ahumado","wheat":"trigo","violet":"violeta","lightskyblue":"azul cielo claro","goldenrod":"ocre","mediumblue":"azul medio","skyblue":"azul cielo","crimson":"carmesí","darksalmon":"salmón oscuro","darkred":"rojo oscuro","darkslategrey":"gris pizarra oscuro","peru":"perú","lightgrey":"gris claro","lightgoldenrodyellow":"ocre claro","blanchedalmond":"almendra pálido","aliceblue":"blanco azulado","bisque":"miel","slategray":"gris pizarra","palegoldenrod":"ocre pálido","darkorange":"naranja oscuro","aquamarine":"aguamarina 2","lightgreen":"verde claro","burlywood":"madera","dodgerblue":"azul fuerte","darkgray":"gris oscuro","lightcyan":"cian claro","powderblue":"azul suave","blueviolet":"azul violáceo","orchid":"orquídea","dimgray":"gris marengo","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosácea","hotpink":"rosa oscuro","steelblue":"azul acero","tomato":"tomate","lightpink":"rosa claro","limegreen":"lima limón","indianred":"rojo teja","papayawhip":"papaya claro","lightslategray":"gris pizarra claro","gray":"gris","mediumorchid":"orquídea medio","cornsilk":"crudo","black":"negro","seagreen":"verde mar","darkslateblue":"azul pizarra oscuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"blanco cielo","peachpuff":"melocotón","darkolivegreen":"verde oliva oscuro","yellowgreen":"verde amarillento"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Opciones anteriores","nextMessage":"Más opciones"},"dijit/nls/common":{"buttonOk":"Aceptar","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Cerrar"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_es-es.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_es-es.js.uncompressed.js new file mode 100644 index 00000000..e81ac1c3 --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_es-es.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_es-es',{ +'dijit/form/nls/validate':{"rangeMessage":"Este valor está fuera del intervalo.","invalidMessage":"El valor especificado no es válido.","missingMessage":"Este valor es necesario."} +, +'dijit/nls/loading':{"loadingState":"Cargando...","errorState":"Lo siento, se ha producido un error"} +, +'dojo/nls/colors':{"lightsteelblue":"azul acero claro","orangered":"rojo anaranjado","midnightblue":"azul medianoche","cadetblue":"azul cadete","seashell":"blanco marfil","slategrey":"gris pizarra","coral":"coral","darkturquoise":"turquesa oscuro","antiquewhite":"blanco antiguo","mediumspringgreen":"verde primavera medio","transparent":"transparente","salmon":"salmón","darkgrey":"gris oscuro","ivory":"marfil","greenyellow":"amarillo verdoso","mistyrose":"rosa difuminado","lightsalmon":"salmón claro","silver":"plateado","dimgrey":"gris marengo","orange":"naranja","white":"blanco","navajowhite":"blanco navajo","royalblue":"azul real","deeppink":"rosa fuerte","lime":"lima","oldlace":"encaje antiguo","chartreuse":"verde pálido 2","darkcyan":"cian oscuro","yellow":"amarillo","linen":"blanco arena","olive":"verde oliva","gold":"oro","lawngreen":"verde césped","lightyellow":"amarillo claro","tan":"canela","darkviolet":"violeta oscuro","lightslategrey":"gris pizarra claro","grey":"gris","darkkhaki":"caqui oscuro","green":"verde","deepskyblue":"azul cielo fuerte","aqua":"aguamarina","sienna":"siena","mintcream":"crema menta","rosybrown":"marrón rosáceo","mediumslateblue":"azul pizarra medio","magenta":"magenta","lightseagreen":"verde mar claro","cyan":"cian","olivedrab":"verde oliva pardusco","darkgoldenrod":"ocre oscuro","slateblue":"azul pizarra","mediumaquamarine":"aguamarina medio","lavender":"lavanda","mediumseagreen":"verde mar medio","maroon":"granate","darkslategray":"gris pizarra oscuro","mediumturquoise":"turquesa medio","ghostwhite":"blanco ligero","darkblue":"azul oscuro","mediumvioletred":"rojo violáceo medio","brown":"marrón","lightgray":"gris claro","sandybrown":"marrón arcilla","pink":"rosa","firebrick":"teja","indigo":"añil","snow":"nieve","darkorchid":"orquídea oscuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde fuerte","moccasin":"arena","navy":"azul marino","lemonchiffon":"amarillo pastel","teal":"verde azulado","floralwhite":"blanco manteca","cornflowerblue":"azul aciano","paleturquoise":"turquesa pálido","purple":"púrpura","gainsboro":"azul gainsboro","plum":"ciruela","red":"rojo","blue":"azul","forestgreen":"verde pino","darkgreen":"verde oscuro","honeydew":"flor de rocío","darkseagreen":"verde mar oscuro","lightcoral":"coral claro","palevioletred":"rojo violáceo pálido","mediumpurple":"púrpura medio","saddlebrown":"cuero","darkmagenta":"magenta oscuro","thistle":"cardo","whitesmoke":"blanco ahumado","wheat":"trigo","violet":"violeta","lightskyblue":"azul cielo claro","goldenrod":"ocre","mediumblue":"azul medio","skyblue":"azul cielo","crimson":"carmesí","darksalmon":"salmón oscuro","darkred":"rojo oscuro","darkslategrey":"gris pizarra oscuro","peru":"perú","lightgrey":"gris claro","lightgoldenrodyellow":"ocre claro","blanchedalmond":"almendra pálido","aliceblue":"blanco azulado","bisque":"miel","slategray":"gris pizarra","palegoldenrod":"ocre pálido","darkorange":"naranja oscuro","aquamarine":"aguamarina 2","lightgreen":"verde claro","burlywood":"madera","dodgerblue":"azul fuerte","darkgray":"gris oscuro","lightcyan":"cian claro","powderblue":"azul suave","blueviolet":"azul violáceo","orchid":"orquídea","dimgray":"gris marengo","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosácea","hotpink":"rosa oscuro","steelblue":"azul acero","tomato":"tomate","lightpink":"rosa claro","limegreen":"lima limón","indianred":"rojo teja","papayawhip":"papaya claro","lightslategray":"gris pizarra claro","gray":"gris","mediumorchid":"orquídea medio","cornsilk":"crudo","black":"negro","seagreen":"verde mar","darkslateblue":"azul pizarra oscuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"blanco cielo","peachpuff":"melocotón","darkolivegreen":"verde oliva oscuro","yellowgreen":"verde amarillento"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Opciones anteriores","nextMessage":"Más opciones"} +, +'dijit/nls/common':{"buttonOk":"Aceptar","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Cerrar"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_es.js b/lib/dojo/nls/tt-rss-layer_es.js deleted file mode 100644 index daec5d53..00000000 --- a/lib/dojo/nls/tt-rss-layer_es.js +++ /dev/null @@ -1 +0,0 @@ -dojo.provide("dojo.nls.tt-rss-layer_es");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.es");dojo.nls.colors.es={"lightsteelblue":"azul acero claro","orangered":"rojo anaranjado","midnightblue":"azul medianoche","cadetblue":"azul cadete","seashell":"blanco marfil","slategrey":"gris pizarra","coral":"coral","darkturquoise":"turquesa oscuro","antiquewhite":"blanco antiguo","mediumspringgreen":"verde primavera medio","salmon":"salmón","darkgrey":"gris oscuro","ivory":"marfil","greenyellow":"amarillo verdoso","mistyrose":"rosa difuminado","lightsalmon":"salmón claro","silver":"plateado","dimgrey":"gris marengo","orange":"naranja","white":"blanco","navajowhite":"blanco navajo","royalblue":"azul real","deeppink":"rosa fuerte","lime":"lima","oldlace":"encaje antiguo","chartreuse":"verde pálido 2","darkcyan":"cian oscuro","yellow":"amarillo","linen":"blanco arena","olive":"verde oliva","gold":"oro","lawngreen":"verde césped","lightyellow":"amarillo claro","tan":"canela","darkviolet":"violeta oscuro","lightslategrey":"gris pizarra claro","grey":"gris","darkkhaki":"caqui oscuro","green":"verde","deepskyblue":"azul cielo fuerte","aqua":"aguamarina","sienna":"siena","mintcream":"crema menta","rosybrown":"marrón rosáceo","mediumslateblue":"azul pizarra medio","magenta":"magenta","lightseagreen":"verde mar claro","cyan":"cian","olivedrab":"verde oliva pardusco","darkgoldenrod":"ocre oscuro","slateblue":"azul pizarra","mediumaquamarine":"aguamarina medio","lavender":"lavanda","mediumseagreen":"verde mar medio","maroon":"granate","darkslategray":"gris pizarra oscuro","mediumturquoise":"turquesa medio","ghostwhite":"blanco ligero","darkblue":"azul oscuro","mediumvioletred":"rojo violáceo medio","brown":"marrón","lightgray":"gris claro","sandybrown":"marrón arcilla","pink":"rosa","firebrick":"teja","indigo":"añil","snow":"nieve","darkorchid":"orquídea oscuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde fuerte","moccasin":"arena","navy":"azul marino","lemonchiffon":"amarillo pastel","teal":"verde azulado","floralwhite":"blanco manteca","cornflowerblue":"azul aciano","paleturquoise":"turquesa pálido","purple":"púrpura","gainsboro":"azul gainsboro","plum":"ciruela","red":"rojo","blue":"azul","forestgreen":"verde pino","darkgreen":"verde oscuro","honeydew":"flor de rocío","darkseagreen":"verde mar oscuro","lightcoral":"coral claro","palevioletred":"rojo violáceo pálido","mediumpurple":"púrpura medio","saddlebrown":"cuero","darkmagenta":"magenta oscuro","thistle":"cardo","whitesmoke":"blanco ahumado","wheat":"trigo","violet":"violeta","lightskyblue":"azul cielo claro","goldenrod":"ocre","mediumblue":"azul medio","skyblue":"azul cielo","crimson":"carmesí","darksalmon":"salmón oscuro","darkred":"rojo oscuro","darkslategrey":"gris pizarra oscuro","peru":"perú","lightgrey":"gris claro","lightgoldenrodyellow":"ocre claro","blanchedalmond":"almendra pálido","aliceblue":"blanco azulado","bisque":"miel","slategray":"gris pizarra","palegoldenrod":"ocre pálido","darkorange":"naranja oscuro","aquamarine":"aguamarina 2","lightgreen":"verde claro","burlywood":"madera","dodgerblue":"azul fuerte","darkgray":"gris oscuro","lightcyan":"cian claro","powderblue":"azul suave","blueviolet":"azul violáceo","orchid":"orquídea","dimgray":"gris marengo","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosácea","hotpink":"rosa oscuro","steelblue":"azul acero","tomato":"tomate","lightpink":"rosa claro","limegreen":"lima limón","indianred":"rojo teja","papayawhip":"papaya claro","lightslategray":"gris pizarra claro","gray":"gris","mediumorchid":"orquídea medio","cornsilk":"crudo","black":"negro","seagreen":"verde mar","darkslateblue":"azul pizarra oscuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"blanco cielo","peachpuff":"melocotón","darkolivegreen":"verde oliva oscuro","yellowgreen":"verde amarillento"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.es");dijit.nls.loading.es={"loadingState":"Cargando...","errorState":"Lo siento, se ha producido un error"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.es");dijit.nls.common.es={"buttonOk":"Aceptar","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Cerrar"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.es");dijit.form.nls.validate.es={"rangeMessage":"Este valor está fuera del intervalo.","invalidMessage":"El valor especificado no es válido.","missingMessage":"Este valor es necesario."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.es");dijit.form.nls.ComboBox.es={"previousMessage":"Opciones anteriores","nextMessage":"Más opciones"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.es");dojo.cldr.nls.number.es={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" "}; diff --git a/lib/dojo/nls/tt-rss-layer_fi-fi.js b/lib/dojo/nls/tt-rss-layer_fi-fi.js index 29f0b1a4..c8483189 100644 --- a/lib/dojo/nls/tt-rss-layer_fi-fi.js +++ b/lib/dojo/nls/tt-rss-layer_fi-fi.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_fi-fi");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.fi_fi");dojo.nls.colors.fi_fi={"lightsteelblue":"vaalea teräksensininen","orangered":"oranssinpunainen","midnightblue":"yönsininen","cadetblue":"meren vihreä","seashell":"simpukankuori","slategrey":"savenharmaa","coral":"koralli","darkturquoise":"tumma turkoosi","antiquewhite":"antiikinvalkoinen","mediumspringgreen":"keskivaalea keväänvihreä","salmon":"lohenpunainen","darkgrey":"tummanharmaa","ivory":"norsunluu","greenyellow":"vihreänkeltainen","mistyrose":"utuinen ruusu","lightsalmon":"vaalea lohenpunainen","silver":"hopea","dimgrey":"himmeänharmaa","orange":"oranssi","white":"valkoinen","navajowhite":"navajonvalkoinen","royalblue":"syvänsininen","deeppink":"syvä vaaleanpunainen","lime":"vaaleanvihreä","oldlace":"vanha pitsi","chartreuse":"kellanvihreä","darkcyan":"tumma turkoosi","yellow":"keltainen","linen":"pellavanvaalea","olive":"oliivinvihreä","gold":"kulta","lawngreen":"ruohonvihreä","lightyellow":"vaaleankeltainen","tan":"kellanruskea","darkviolet":"tummanvioletti","lightslategrey":"vaaleanharmaa","grey":"harmaa","darkkhaki":"tumma khaki","green":"vihreä","deepskyblue":"tumma taivaansininen","aqua":"sinivihreä","sienna":"siena","mintcream":"minttukreemi","rosybrown":"punertavanruskea","mediumslateblue":"keskivaalea siniharmaa","magenta":"magenta","lightseagreen":"vaalea merenvihreä","cyan":"syaani","olivedrab":"oliivinruskea","darkgoldenrod":"tumma kultapiisku","slateblue":"savensininen","mediumaquamarine":"keskivaalea vedenvihreä","lavender":"laventeli","mediumseagreen":"keskivaalea merenvihreä","maroon":"kastanjanruskea","darkslategray":"tummanharmaa","mediumturquoise":"keskivaalea turkoosi","ghostwhite":"lakananvalkoinen","darkblue":"tummansininen","mediumvioletred":"keskivaalea lila","brown":"ruskea","lightgray":"vaaleanharmaa","sandybrown":"hiekanruskea","pink":"vaaleanpunainen","firebrick":"poltetun tiilen punainen","indigo":"indigo","snow":"lumivalkoinen","darkorchid":"tumma orkidea","turquoise":"turkoosi","chocolate":"suklaanruskea","springgreen":"keväänvihreä","moccasin":"nahanruskea","navy":"laivastonsininen","lemonchiffon":"sitruunankeltainen","teal":"sinivihreä","floralwhite":"kukanvalkoinen","cornflowerblue":"syvänsininen","paleturquoise":"haalea turkoosi","purple":"violetti","gainsboro":"gainsboro","plum":"luumunpunainen","red":"punainen","blue":"sininen","forestgreen":"metsänvihreä","darkgreen":"tummanvihreä","honeydew":"hunajameloninvihreä","darkseagreen":"tumma merenvihreä","lightcoral":"vaalea koralli","palevioletred":"haalea lila","mediumpurple":"keskivaalea violetti","saddlebrown":"satulanruskea","darkmagenta":"tumma magenta","thistle":"ohdake","whitesmoke":"savunvalkea","wheat":"vehnänkeltainen","violet":"violetti","lightskyblue":"vaalea taivaansininen","goldenrod":"kullanruskea","mediumblue":"keskisininen","skyblue":"taivaansininen","crimson":"karmiininpunainen","darksalmon":"tumma lohenpunainen","darkred":"tummanpunainen","darkslategrey":"tummanharmaa","peru":"peru","lightgrey":"vaaleanharmaa","lightgoldenrodyellow":"vaalea kultapiiskunkeltainen","blanchedalmond":"kuorittu manteli","aliceblue":"vaaleanharmaansininen","bisque":"vaaleanruskea","slategray":"savenharmaa","palegoldenrod":"haalea kultapiisku","darkorange":"tummanoranssi","aquamarine":"vedenvihreä","lightgreen":"vaaleanvihreä","burlywood":"puunruskea","dodgerblue":"Dodger-sininen","darkgray":"tummanharmaa","lightcyan":"vaalea syaani","powderblue":"harmaansininen","blueviolet":"sinivioletti","orchid":"orkidea","dimgray":"himmeänharmaa","beige":"vaaleanruskea","fuchsia":"purppura","lavenderblush":"laventelinpunainen","hotpink":"pinkki","steelblue":"teräksensininen","tomato":"tomaatinpunainen","lightpink":"vaaleanpunainen","limegreen":"limetinvihreä","indianred":"kirkkaanpunainen","papayawhip":"papaijavaahto","lightslategray":"vaaleanharmaa","gray":"harmaa","mediumorchid":"keskivaalea orkidea","cornsilk":"maissinkeltainen","black":"musta","seagreen":"merenvihreä","darkslateblue":"tumma siniharmaa","khaki":"khaki","lightblue":"vaaleansininen","palegreen":"haalea vihreä","azure":"taivaansininen","peachpuff":"persikka","darkolivegreen":"tummanoliivinvihreä","yellowgreen":"kellanvihreä"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.fi_fi");dijit.nls.loading.fi_fi={"loadingState":"Lataus on meneillään...","errorState":"On ilmennyt virhe."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.fi_fi");dijit.nls.common.fi_fi={"buttonOk":"OK","buttonCancel":"Peruuta","buttonSave":"Tallenna","itemClose":"Sulje"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.fi_fi");dijit.form.nls.validate.fi_fi={"rangeMessage":"Tämä arvo on sallitun alueen ulkopuolella.","invalidMessage":"Annettu arvo ei kelpaa.","missingMessage":"Tämä arvo on pakollinen."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.fi_fi");dijit.form.nls.ComboBox.fi_fi={"previousMessage":"Edelliset valinnat","nextMessage":"Lisää valintoja"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.fi_fi");dojo.cldr.nls.number.fi_fi={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"epäluku","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_fi-fi",{"dijit/form/nls/validate":{"rangeMessage":"Tämä arvo on sallitun alueen ulkopuolella.","invalidMessage":"Annettu arvo ei kelpaa.","missingMessage":"Tämä arvo on pakollinen."},"dijit/nls/loading":{"loadingState":"Lataus on meneillään...","errorState":"On ilmennyt virhe."},"dojo/nls/colors":{"lightsteelblue":"vaalea teräksensininen","orangered":"oranssinpunainen","midnightblue":"yönsininen","cadetblue":"meren vihreä","seashell":"simpukankuori","slategrey":"savenharmaa","coral":"koralli","darkturquoise":"tumma turkoosi","antiquewhite":"antiikinvalkoinen","mediumspringgreen":"keskivaalea keväänvihreä","transparent":"läpinäkyvä","salmon":"lohenpunainen","darkgrey":"tummanharmaa","ivory":"norsunluu","greenyellow":"vihreänkeltainen","mistyrose":"utuinen ruusu","lightsalmon":"vaalea lohenpunainen","silver":"hopea","dimgrey":"himmeänharmaa","orange":"oranssi","white":"valkoinen","navajowhite":"navajonvalkoinen","royalblue":"syvänsininen","deeppink":"syvä vaaleanpunainen","lime":"vaaleanvihreä","oldlace":"vanha pitsi","chartreuse":"kellanvihreä","darkcyan":"tumma turkoosi","yellow":"keltainen","linen":"pellavanvaalea","olive":"oliivinvihreä","gold":"kulta","lawngreen":"ruohonvihreä","lightyellow":"vaaleankeltainen","tan":"kellanruskea","darkviolet":"tummanvioletti","lightslategrey":"vaaleanharmaa","grey":"harmaa","darkkhaki":"tumma khaki","green":"vihreä","deepskyblue":"tumma taivaansininen","aqua":"sinivihreä","sienna":"siena","mintcream":"minttukreemi","rosybrown":"punertavanruskea","mediumslateblue":"keskivaalea siniharmaa","magenta":"magenta","lightseagreen":"vaalea merenvihreä","cyan":"syaani","olivedrab":"oliivinruskea","darkgoldenrod":"tumma kultapiisku","slateblue":"savensininen","mediumaquamarine":"keskivaalea vedenvihreä","lavender":"laventeli","mediumseagreen":"keskivaalea merenvihreä","maroon":"kastanjanruskea","darkslategray":"tummanharmaa","mediumturquoise":"keskivaalea turkoosi","ghostwhite":"lakananvalkoinen","darkblue":"tummansininen","mediumvioletred":"keskivaalea lila","brown":"ruskea","lightgray":"vaaleanharmaa","sandybrown":"hiekanruskea","pink":"vaaleanpunainen","firebrick":"poltetun tiilen punainen","indigo":"indigo","snow":"lumivalkoinen","darkorchid":"tumma orkidea","turquoise":"turkoosi","chocolate":"suklaanruskea","springgreen":"keväänvihreä","moccasin":"nahanruskea","navy":"laivastonsininen","lemonchiffon":"sitruunankeltainen","teal":"sinivihreä","floralwhite":"kukanvalkoinen","cornflowerblue":"syvänsininen","paleturquoise":"haalea turkoosi","purple":"violetti","gainsboro":"gainsboro","plum":"luumunpunainen","red":"punainen","blue":"sininen","forestgreen":"metsänvihreä","darkgreen":"tummanvihreä","honeydew":"hunajameloninvihreä","darkseagreen":"tumma merenvihreä","lightcoral":"vaalea koralli","palevioletred":"haalea lila","mediumpurple":"keskivaalea violetti","saddlebrown":"satulanruskea","darkmagenta":"tumma magenta","thistle":"ohdake","whitesmoke":"savunvalkea","wheat":"vehnänkeltainen","violet":"violetti","lightskyblue":"vaalea taivaansininen","goldenrod":"kullanruskea","mediumblue":"keskisininen","skyblue":"taivaansininen","crimson":"karmiininpunainen","darksalmon":"tumma lohenpunainen","darkred":"tummanpunainen","darkslategrey":"tummanharmaa","peru":"peru","lightgrey":"vaaleanharmaa","lightgoldenrodyellow":"vaalea kultapiiskunkeltainen","blanchedalmond":"kuorittu manteli","aliceblue":"vaaleanharmaansininen","bisque":"vaaleanruskea","slategray":"savenharmaa","palegoldenrod":"haalea kultapiisku","darkorange":"tummanoranssi","aquamarine":"vedenvihreä","lightgreen":"vaaleanvihreä","burlywood":"puunruskea","dodgerblue":"Dodger-sininen","darkgray":"tummanharmaa","lightcyan":"vaalea syaani","powderblue":"harmaansininen","blueviolet":"sinivioletti","orchid":"orkidea","dimgray":"himmeänharmaa","beige":"vaaleanruskea","fuchsia":"purppura","lavenderblush":"laventelinpunainen","hotpink":"pinkki","steelblue":"teräksensininen","tomato":"tomaatinpunainen","lightpink":"vaaleanpunainen","limegreen":"limetinvihreä","indianred":"kirkkaanpunainen","papayawhip":"papaijavaahto","lightslategray":"vaaleanharmaa","gray":"harmaa","mediumorchid":"keskivaalea orkidea","cornsilk":"maissinkeltainen","black":"musta","seagreen":"merenvihreä","darkslateblue":"tumma siniharmaa","khaki":"khaki","lightblue":"vaaleansininen","palegreen":"haalea vihreä","azure":"taivaansininen","peachpuff":"persikka","darkolivegreen":"tummanoliivinvihreä","yellowgreen":"kellanvihreä"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"epäluku","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Edelliset valinnat","nextMessage":"Lisää valintoja"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Peruuta","buttonSave":"Tallenna","itemClose":"Sulje"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_fi-fi.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_fi-fi.js.uncompressed.js new file mode 100644 index 00000000..0426c20e --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_fi-fi.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_fi-fi',{ +'dijit/form/nls/validate':{"rangeMessage":"Tämä arvo on sallitun alueen ulkopuolella.","invalidMessage":"Annettu arvo ei kelpaa.","missingMessage":"Tämä arvo on pakollinen."} +, +'dijit/nls/loading':{"loadingState":"Lataus on meneillään...","errorState":"On ilmennyt virhe."} +, +'dojo/nls/colors':{"lightsteelblue":"vaalea teräksensininen","orangered":"oranssinpunainen","midnightblue":"yönsininen","cadetblue":"meren vihreä","seashell":"simpukankuori","slategrey":"savenharmaa","coral":"koralli","darkturquoise":"tumma turkoosi","antiquewhite":"antiikinvalkoinen","mediumspringgreen":"keskivaalea keväänvihreä","transparent":"läpinäkyvä","salmon":"lohenpunainen","darkgrey":"tummanharmaa","ivory":"norsunluu","greenyellow":"vihreänkeltainen","mistyrose":"utuinen ruusu","lightsalmon":"vaalea lohenpunainen","silver":"hopea","dimgrey":"himmeänharmaa","orange":"oranssi","white":"valkoinen","navajowhite":"navajonvalkoinen","royalblue":"syvänsininen","deeppink":"syvä vaaleanpunainen","lime":"vaaleanvihreä","oldlace":"vanha pitsi","chartreuse":"kellanvihreä","darkcyan":"tumma turkoosi","yellow":"keltainen","linen":"pellavanvaalea","olive":"oliivinvihreä","gold":"kulta","lawngreen":"ruohonvihreä","lightyellow":"vaaleankeltainen","tan":"kellanruskea","darkviolet":"tummanvioletti","lightslategrey":"vaaleanharmaa","grey":"harmaa","darkkhaki":"tumma khaki","green":"vihreä","deepskyblue":"tumma taivaansininen","aqua":"sinivihreä","sienna":"siena","mintcream":"minttukreemi","rosybrown":"punertavanruskea","mediumslateblue":"keskivaalea siniharmaa","magenta":"magenta","lightseagreen":"vaalea merenvihreä","cyan":"syaani","olivedrab":"oliivinruskea","darkgoldenrod":"tumma kultapiisku","slateblue":"savensininen","mediumaquamarine":"keskivaalea vedenvihreä","lavender":"laventeli","mediumseagreen":"keskivaalea merenvihreä","maroon":"kastanjanruskea","darkslategray":"tummanharmaa","mediumturquoise":"keskivaalea turkoosi","ghostwhite":"lakananvalkoinen","darkblue":"tummansininen","mediumvioletred":"keskivaalea lila","brown":"ruskea","lightgray":"vaaleanharmaa","sandybrown":"hiekanruskea","pink":"vaaleanpunainen","firebrick":"poltetun tiilen punainen","indigo":"indigo","snow":"lumivalkoinen","darkorchid":"tumma orkidea","turquoise":"turkoosi","chocolate":"suklaanruskea","springgreen":"keväänvihreä","moccasin":"nahanruskea","navy":"laivastonsininen","lemonchiffon":"sitruunankeltainen","teal":"sinivihreä","floralwhite":"kukanvalkoinen","cornflowerblue":"syvänsininen","paleturquoise":"haalea turkoosi","purple":"violetti","gainsboro":"gainsboro","plum":"luumunpunainen","red":"punainen","blue":"sininen","forestgreen":"metsänvihreä","darkgreen":"tummanvihreä","honeydew":"hunajameloninvihreä","darkseagreen":"tumma merenvihreä","lightcoral":"vaalea koralli","palevioletred":"haalea lila","mediumpurple":"keskivaalea violetti","saddlebrown":"satulanruskea","darkmagenta":"tumma magenta","thistle":"ohdake","whitesmoke":"savunvalkea","wheat":"vehnänkeltainen","violet":"violetti","lightskyblue":"vaalea taivaansininen","goldenrod":"kullanruskea","mediumblue":"keskisininen","skyblue":"taivaansininen","crimson":"karmiininpunainen","darksalmon":"tumma lohenpunainen","darkred":"tummanpunainen","darkslategrey":"tummanharmaa","peru":"peru","lightgrey":"vaaleanharmaa","lightgoldenrodyellow":"vaalea kultapiiskunkeltainen","blanchedalmond":"kuorittu manteli","aliceblue":"vaaleanharmaansininen","bisque":"vaaleanruskea","slategray":"savenharmaa","palegoldenrod":"haalea kultapiisku","darkorange":"tummanoranssi","aquamarine":"vedenvihreä","lightgreen":"vaaleanvihreä","burlywood":"puunruskea","dodgerblue":"Dodger-sininen","darkgray":"tummanharmaa","lightcyan":"vaalea syaani","powderblue":"harmaansininen","blueviolet":"sinivioletti","orchid":"orkidea","dimgray":"himmeänharmaa","beige":"vaaleanruskea","fuchsia":"purppura","lavenderblush":"laventelinpunainen","hotpink":"pinkki","steelblue":"teräksensininen","tomato":"tomaatinpunainen","lightpink":"vaaleanpunainen","limegreen":"limetinvihreä","indianred":"kirkkaanpunainen","papayawhip":"papaijavaahto","lightslategray":"vaaleanharmaa","gray":"harmaa","mediumorchid":"keskivaalea orkidea","cornsilk":"maissinkeltainen","black":"musta","seagreen":"merenvihreä","darkslateblue":"tumma siniharmaa","khaki":"khaki","lightblue":"vaaleansininen","palegreen":"haalea vihreä","azure":"taivaansininen","peachpuff":"persikka","darkolivegreen":"tummanoliivinvihreä","yellowgreen":"kellanvihreä"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"epäluku","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Edelliset valinnat","nextMessage":"Lisää valintoja"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Peruuta","buttonSave":"Tallenna","itemClose":"Sulje"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_fi.js b/lib/dojo/nls/tt-rss-layer_fi.js deleted file mode 100644 index 86fc0bcb..00000000 --- a/lib/dojo/nls/tt-rss-layer_fi.js +++ /dev/null @@ -1 +0,0 @@ -dojo.provide("dojo.nls.tt-rss-layer_fi");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.fi");dojo.nls.colors.fi={"lightsteelblue":"vaalea teräksensininen","orangered":"oranssinpunainen","midnightblue":"yönsininen","cadetblue":"meren vihreä","seashell":"simpukankuori","slategrey":"savenharmaa","coral":"koralli","darkturquoise":"tumma turkoosi","antiquewhite":"antiikinvalkoinen","mediumspringgreen":"keskivaalea keväänvihreä","salmon":"lohenpunainen","darkgrey":"tummanharmaa","ivory":"norsunluu","greenyellow":"vihreänkeltainen","mistyrose":"utuinen ruusu","lightsalmon":"vaalea lohenpunainen","silver":"hopea","dimgrey":"himmeänharmaa","orange":"oranssi","white":"valkoinen","navajowhite":"navajonvalkoinen","royalblue":"syvänsininen","deeppink":"syvä vaaleanpunainen","lime":"vaaleanvihreä","oldlace":"vanha pitsi","chartreuse":"kellanvihreä","darkcyan":"tumma turkoosi","yellow":"keltainen","linen":"pellavanvaalea","olive":"oliivinvihreä","gold":"kulta","lawngreen":"ruohonvihreä","lightyellow":"vaaleankeltainen","tan":"kellanruskea","darkviolet":"tummanvioletti","lightslategrey":"vaaleanharmaa","grey":"harmaa","darkkhaki":"tumma khaki","green":"vihreä","deepskyblue":"tumma taivaansininen","aqua":"sinivihreä","sienna":"siena","mintcream":"minttukreemi","rosybrown":"punertavanruskea","mediumslateblue":"keskivaalea siniharmaa","magenta":"magenta","lightseagreen":"vaalea merenvihreä","cyan":"syaani","olivedrab":"oliivinruskea","darkgoldenrod":"tumma kultapiisku","slateblue":"savensininen","mediumaquamarine":"keskivaalea vedenvihreä","lavender":"laventeli","mediumseagreen":"keskivaalea merenvihreä","maroon":"kastanjanruskea","darkslategray":"tummanharmaa","mediumturquoise":"keskivaalea turkoosi","ghostwhite":"lakananvalkoinen","darkblue":"tummansininen","mediumvioletred":"keskivaalea lila","brown":"ruskea","lightgray":"vaaleanharmaa","sandybrown":"hiekanruskea","pink":"vaaleanpunainen","firebrick":"poltetun tiilen punainen","indigo":"indigo","snow":"lumivalkoinen","darkorchid":"tumma orkidea","turquoise":"turkoosi","chocolate":"suklaanruskea","springgreen":"keväänvihreä","moccasin":"nahanruskea","navy":"laivastonsininen","lemonchiffon":"sitruunankeltainen","teal":"sinivihreä","floralwhite":"kukanvalkoinen","cornflowerblue":"syvänsininen","paleturquoise":"haalea turkoosi","purple":"violetti","gainsboro":"gainsboro","plum":"luumunpunainen","red":"punainen","blue":"sininen","forestgreen":"metsänvihreä","darkgreen":"tummanvihreä","honeydew":"hunajameloninvihreä","darkseagreen":"tumma merenvihreä","lightcoral":"vaalea koralli","palevioletred":"haalea lila","mediumpurple":"keskivaalea violetti","saddlebrown":"satulanruskea","darkmagenta":"tumma magenta","thistle":"ohdake","whitesmoke":"savunvalkea","wheat":"vehnänkeltainen","violet":"violetti","lightskyblue":"vaalea taivaansininen","goldenrod":"kullanruskea","mediumblue":"keskisininen","skyblue":"taivaansininen","crimson":"karmiininpunainen","darksalmon":"tumma lohenpunainen","darkred":"tummanpunainen","darkslategrey":"tummanharmaa","peru":"peru","lightgrey":"vaaleanharmaa","lightgoldenrodyellow":"vaalea kultapiiskunkeltainen","blanchedalmond":"kuorittu manteli","aliceblue":"vaaleanharmaansininen","bisque":"vaaleanruskea","slategray":"savenharmaa","palegoldenrod":"haalea kultapiisku","darkorange":"tummanoranssi","aquamarine":"vedenvihreä","lightgreen":"vaaleanvihreä","burlywood":"puunruskea","dodgerblue":"Dodger-sininen","darkgray":"tummanharmaa","lightcyan":"vaalea syaani","powderblue":"harmaansininen","blueviolet":"sinivioletti","orchid":"orkidea","dimgray":"himmeänharmaa","beige":"vaaleanruskea","fuchsia":"purppura","lavenderblush":"laventelinpunainen","hotpink":"pinkki","steelblue":"teräksensininen","tomato":"tomaatinpunainen","lightpink":"vaaleanpunainen","limegreen":"limetinvihreä","indianred":"kirkkaanpunainen","papayawhip":"papaijavaahto","lightslategray":"vaaleanharmaa","gray":"harmaa","mediumorchid":"keskivaalea orkidea","cornsilk":"maissinkeltainen","black":"musta","seagreen":"merenvihreä","darkslateblue":"tumma siniharmaa","khaki":"khaki","lightblue":"vaaleansininen","palegreen":"haalea vihreä","azure":"taivaansininen","peachpuff":"persikka","darkolivegreen":"tummanoliivinvihreä","yellowgreen":"kellanvihreä"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.fi");dijit.nls.loading.fi={"loadingState":"Lataus on meneillään...","errorState":"On ilmennyt virhe."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.fi");dijit.nls.common.fi={"buttonOk":"OK","buttonCancel":"Peruuta","buttonSave":"Tallenna","itemClose":"Sulje"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.fi");dijit.form.nls.validate.fi={"rangeMessage":"Tämä arvo on sallitun alueen ulkopuolella.","invalidMessage":"Annettu arvo ei kelpaa.","missingMessage":"Tämä arvo on pakollinen."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.fi");dijit.form.nls.ComboBox.fi={"previousMessage":"Edelliset valinnat","nextMessage":"Lisää valintoja"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.fi");dojo.cldr.nls.number.fi={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"epäluku","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; diff --git a/lib/dojo/nls/tt-rss-layer_fr-fr.js b/lib/dojo/nls/tt-rss-layer_fr-fr.js index 1fba0709..44815b56 100644 --- a/lib/dojo/nls/tt-rss-layer_fr-fr.js +++ b/lib/dojo/nls/tt-rss-layer_fr-fr.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_fr-fr");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.fr_fr");dojo.nls.colors.fr_fr={"lightsteelblue":"bleu acier clair","orangered":"rouge orangé","midnightblue":"bleu nuit","cadetblue":"bleu pétrole","seashell":"coquillage","slategrey":"gris ardoise","coral":"corail","darkturquoise":"turquoise foncé","antiquewhite":"blanc antique","mediumspringgreen":"vert printemps moyen","salmon":"saumon","darkgrey":"gris foncé","ivory":"ivoire","greenyellow":"vert-jaune","mistyrose":"rose pâle","lightsalmon":"saumon clair","silver":"argent","dimgrey":"gris soutenu","orange":"orange","white":"blanc","navajowhite":"chair","royalblue":"bleu roi","deeppink":"rose soutenu","lime":"vert citron","oldlace":"blanc cassé","chartreuse":"vert vif","darkcyan":"cyan foncé","yellow":"jaune","linen":"écru","olive":"olive","gold":"or","lawngreen":"vert prairie","lightyellow":"jaune clair","tan":"grège","darkviolet":"violet foncé","lightslategrey":"gris ardoise clair","grey":"gris","darkkhaki":"kaki foncé","green":"vert","deepskyblue":"bleu ciel soutenu","aqua":"bleu-vert","sienna":"terre de sienne","mintcream":"crème de menthe","rosybrown":"vieux rose","mediumslateblue":"bleu ardoise moyen","magenta":"magenta","lightseagreen":"vert d'eau clair","cyan":"cyan","olivedrab":"brun verdâtre","darkgoldenrod":"jaune paille foncé","slateblue":"bleu ardoise","mediumaquamarine":"aigue-marine moyen","lavender":"lavande","mediumseagreen":"vert d'eau moyen","maroon":"marron","darkslategray":"gris ardoise foncé","mediumturquoise":"turquoise moyen","ghostwhite":"blanc laiteux","darkblue":"bleu foncé","mediumvioletred":"rouge violacé moyen","brown":"brun","lightgray":"gris clair","sandybrown":"sable","pink":"rose","firebrick":"rouge brique","indigo":"indigo","snow":"neige","darkorchid":"lilas foncé","turquoise":"turquoise","chocolate":"chocolat","springgreen":"vert printemps","moccasin":"chamois","navy":"bleu marine","lemonchiffon":"mousse de citron","teal":"sarcelle","floralwhite":"lys","cornflowerblue":"bleuet","paleturquoise":"turquoise pâle","purple":"pourpre","gainsboro":"gris souris","plum":"prune","red":"rouge","blue":"bleu","forestgreen":"vert sapin","darkgreen":"vert foncé","honeydew":"opalin","darkseagreen":"vert d'eau foncé","lightcoral":"corail clair","palevioletred":"rouge violacé pâle","mediumpurple":"pourpre moyen","saddlebrown":"brun cuir","darkmagenta":"magenta foncé","thistle":"chardon","whitesmoke":"blanc cendré","wheat":"blé","violet":"violet","lightskyblue":"bleu ciel clair","goldenrod":"jaune paille","mediumblue":"bleu moyen","skyblue":"bleu ciel","crimson":"cramoisi","darksalmon":"saumon foncé","darkred":"rouge foncé","darkslategrey":"gris ardoise foncé","peru":"caramel","lightgrey":"gris clair","lightgoldenrodyellow":"jaune paille clair","blanchedalmond":"coquille d'oeuf","aliceblue":"bleu gris","bisque":"beige rosé","slategray":"gris ardoise","palegoldenrod":"jaune paille pâle","darkorange":"orange foncé","aquamarine":"aigue-marine","lightgreen":"vert clair","burlywood":"bois précieux","dodgerblue":"bleu France","darkgray":"gris foncé","lightcyan":"cyan clair","powderblue":"bleu de smalt","blueviolet":"bleu-violet","orchid":"lilas","dimgray":"gris soutenu","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavandin","hotpink":"rose intense","steelblue":"bleu acier","tomato":"tomate","lightpink":"rose clair","limegreen":"citron vert","indianred":"rose indien","papayawhip":"crème de papaye","lightslategray":"gris ardoise clair","gray":"gris","mediumorchid":"lilas moyen","cornsilk":"vanille","black":"noir","seagreen":"vert d'eau","darkslateblue":"bleu ardoise foncé","khaki":"kaki","lightblue":"bleu clair","palegreen":"vert pâle","azure":"bleu azur","peachpuff":"pêche","darkolivegreen":"olive foncé","yellowgreen":"vert jaunâtre"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.fr_fr");dijit.nls.loading.fr_fr={"loadingState":"Chargement...","errorState":"Une erreur est survenue"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.fr_fr");dijit.nls.common.fr_fr={"buttonOk":"OK","buttonCancel":"Annuler","buttonSave":"Sauvegarder","itemClose":"Fermer"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.fr_fr");dijit.form.nls.validate.fr_fr={"rangeMessage":"Cette valeur n'est pas comprise dans la plage autorisée.","invalidMessage":"La valeur indiquée n'est pas correcte.","missingMessage":"Cette valeur est requise."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.fr_fr");dijit.form.nls.ComboBox.fr_fr={"previousMessage":"Choix précédents","nextMessage":"Plus de choix"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.fr_fr");dojo.cldr.nls.number.fr_fr={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_fr-fr",{"dijit/form/nls/validate":{"rangeMessage":"Cette valeur n'est pas comprise dans la plage autorisée.","invalidMessage":"La valeur indiquée n'est pas correcte.","missingMessage":"Cette valeur est requise."},"dijit/nls/loading":{"loadingState":"Chargement...","errorState":"Une erreur est survenue"},"dojo/nls/colors":{"lightsteelblue":"bleu acier clair","orangered":"rouge orangé","midnightblue":"bleu nuit","cadetblue":"bleu pétrole","seashell":"coquillage","slategrey":"gris ardoise","coral":"corail","darkturquoise":"turquoise foncé","antiquewhite":"blanc antique","mediumspringgreen":"vert printemps moyen","transparent":"transparent","salmon":"saumon","darkgrey":"gris foncé","ivory":"ivoire","greenyellow":"vert-jaune","mistyrose":"rose pâle","lightsalmon":"saumon clair","silver":"argent","dimgrey":"gris soutenu","orange":"orange","white":"blanc","navajowhite":"chair","royalblue":"bleu roi","deeppink":"rose soutenu","lime":"vert citron","oldlace":"blanc cassé","chartreuse":"vert vif","darkcyan":"cyan foncé","yellow":"jaune","linen":"écru","olive":"olive","gold":"or","lawngreen":"vert prairie","lightyellow":"jaune clair","tan":"grège","darkviolet":"violet foncé","lightslategrey":"gris ardoise clair","grey":"gris","darkkhaki":"kaki foncé","green":"vert","deepskyblue":"bleu ciel soutenu","aqua":"bleu-vert","sienna":"terre de sienne","mintcream":"crème de menthe","rosybrown":"vieux rose","mediumslateblue":"bleu ardoise moyen","magenta":"magenta","lightseagreen":"vert d'eau clair","cyan":"cyan","olivedrab":"brun verdâtre","darkgoldenrod":"jaune paille foncé","slateblue":"bleu ardoise","mediumaquamarine":"aigue-marine moyen","lavender":"lavande","mediumseagreen":"vert d'eau moyen","maroon":"marron","darkslategray":"gris ardoise foncé","mediumturquoise":"turquoise moyen","ghostwhite":"blanc laiteux","darkblue":"bleu foncé","mediumvioletred":"rouge violacé moyen","brown":"brun","lightgray":"gris clair","sandybrown":"sable","pink":"rose","firebrick":"rouge brique","indigo":"indigo","snow":"neige","darkorchid":"lilas foncé","turquoise":"turquoise","chocolate":"chocolat","springgreen":"vert printemps","moccasin":"chamois","navy":"bleu marine","lemonchiffon":"mousse de citron","teal":"sarcelle","floralwhite":"lys","cornflowerblue":"bleuet","paleturquoise":"turquoise pâle","purple":"pourpre","gainsboro":"gris souris","plum":"prune","red":"rouge","blue":"bleu","forestgreen":"vert sapin","darkgreen":"vert foncé","honeydew":"opalin","darkseagreen":"vert d'eau foncé","lightcoral":"corail clair","palevioletred":"rouge violacé pâle","mediumpurple":"pourpre moyen","saddlebrown":"brun cuir","darkmagenta":"magenta foncé","thistle":"chardon","whitesmoke":"blanc cendré","wheat":"blé","violet":"violet","lightskyblue":"bleu ciel clair","goldenrod":"jaune paille","mediumblue":"bleu moyen","skyblue":"bleu ciel","crimson":"cramoisi","darksalmon":"saumon foncé","darkred":"rouge foncé","darkslategrey":"gris ardoise foncé","peru":"caramel","lightgrey":"gris clair","lightgoldenrodyellow":"jaune paille clair","blanchedalmond":"coquille d'œuf","aliceblue":"bleu gris","bisque":"beige rosé","slategray":"gris ardoise","palegoldenrod":"jaune paille pâle","darkorange":"orange foncé","aquamarine":"aigue-marine","lightgreen":"vert clair","burlywood":"bois précieux","dodgerblue":"bleu France","darkgray":"gris foncé","lightcyan":"cyan clair","powderblue":"bleu de smalt","blueviolet":"bleu-violet","orchid":"lilas","dimgray":"gris soutenu","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavandin","hotpink":"rose intense","steelblue":"bleu acier","tomato":"tomate","lightpink":"rose clair","limegreen":"citron vert","indianred":"rose indien","papayawhip":"crème de papaye","lightslategray":"gris ardoise clair","gray":"gris","mediumorchid":"lilas moyen","cornsilk":"vanille","black":"noir","seagreen":"vert d'eau","darkslateblue":"bleu ardoise foncé","khaki":"kaki","lightblue":"bleu clair","palegreen":"vert pâle","azure":"bleu azur","peachpuff":"pêche","darkolivegreen":"olive foncé","yellowgreen":"vert jaunâtre"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Choix précédents","nextMessage":"Plus de choix"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Annuler","buttonSave":"Sauvegarder","itemClose":"Fermer"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_fr-fr.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_fr-fr.js.uncompressed.js new file mode 100644 index 00000000..67072dd7 --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_fr-fr.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_fr-fr',{ +'dijit/form/nls/validate':{"rangeMessage":"Cette valeur n'est pas comprise dans la plage autorisée.","invalidMessage":"La valeur indiquée n'est pas correcte.","missingMessage":"Cette valeur est requise."} +, +'dijit/nls/loading':{"loadingState":"Chargement...","errorState":"Une erreur est survenue"} +, +'dojo/nls/colors':{"lightsteelblue":"bleu acier clair","orangered":"rouge orangé","midnightblue":"bleu nuit","cadetblue":"bleu pétrole","seashell":"coquillage","slategrey":"gris ardoise","coral":"corail","darkturquoise":"turquoise foncé","antiquewhite":"blanc antique","mediumspringgreen":"vert printemps moyen","transparent":"transparent","salmon":"saumon","darkgrey":"gris foncé","ivory":"ivoire","greenyellow":"vert-jaune","mistyrose":"rose pâle","lightsalmon":"saumon clair","silver":"argent","dimgrey":"gris soutenu","orange":"orange","white":"blanc","navajowhite":"chair","royalblue":"bleu roi","deeppink":"rose soutenu","lime":"vert citron","oldlace":"blanc cassé","chartreuse":"vert vif","darkcyan":"cyan foncé","yellow":"jaune","linen":"écru","olive":"olive","gold":"or","lawngreen":"vert prairie","lightyellow":"jaune clair","tan":"grège","darkviolet":"violet foncé","lightslategrey":"gris ardoise clair","grey":"gris","darkkhaki":"kaki foncé","green":"vert","deepskyblue":"bleu ciel soutenu","aqua":"bleu-vert","sienna":"terre de sienne","mintcream":"crème de menthe","rosybrown":"vieux rose","mediumslateblue":"bleu ardoise moyen","magenta":"magenta","lightseagreen":"vert d'eau clair","cyan":"cyan","olivedrab":"brun verdâtre","darkgoldenrod":"jaune paille foncé","slateblue":"bleu ardoise","mediumaquamarine":"aigue-marine moyen","lavender":"lavande","mediumseagreen":"vert d'eau moyen","maroon":"marron","darkslategray":"gris ardoise foncé","mediumturquoise":"turquoise moyen","ghostwhite":"blanc laiteux","darkblue":"bleu foncé","mediumvioletred":"rouge violacé moyen","brown":"brun","lightgray":"gris clair","sandybrown":"sable","pink":"rose","firebrick":"rouge brique","indigo":"indigo","snow":"neige","darkorchid":"lilas foncé","turquoise":"turquoise","chocolate":"chocolat","springgreen":"vert printemps","moccasin":"chamois","navy":"bleu marine","lemonchiffon":"mousse de citron","teal":"sarcelle","floralwhite":"lys","cornflowerblue":"bleuet","paleturquoise":"turquoise pâle","purple":"pourpre","gainsboro":"gris souris","plum":"prune","red":"rouge","blue":"bleu","forestgreen":"vert sapin","darkgreen":"vert foncé","honeydew":"opalin","darkseagreen":"vert d'eau foncé","lightcoral":"corail clair","palevioletred":"rouge violacé pâle","mediumpurple":"pourpre moyen","saddlebrown":"brun cuir","darkmagenta":"magenta foncé","thistle":"chardon","whitesmoke":"blanc cendré","wheat":"blé","violet":"violet","lightskyblue":"bleu ciel clair","goldenrod":"jaune paille","mediumblue":"bleu moyen","skyblue":"bleu ciel","crimson":"cramoisi","darksalmon":"saumon foncé","darkred":"rouge foncé","darkslategrey":"gris ardoise foncé","peru":"caramel","lightgrey":"gris clair","lightgoldenrodyellow":"jaune paille clair","blanchedalmond":"coquille d'œuf","aliceblue":"bleu gris","bisque":"beige rosé","slategray":"gris ardoise","palegoldenrod":"jaune paille pâle","darkorange":"orange foncé","aquamarine":"aigue-marine","lightgreen":"vert clair","burlywood":"bois précieux","dodgerblue":"bleu France","darkgray":"gris foncé","lightcyan":"cyan clair","powderblue":"bleu de smalt","blueviolet":"bleu-violet","orchid":"lilas","dimgray":"gris soutenu","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavandin","hotpink":"rose intense","steelblue":"bleu acier","tomato":"tomate","lightpink":"rose clair","limegreen":"citron vert","indianred":"rose indien","papayawhip":"crème de papaye","lightslategray":"gris ardoise clair","gray":"gris","mediumorchid":"lilas moyen","cornsilk":"vanille","black":"noir","seagreen":"vert d'eau","darkslateblue":"bleu ardoise foncé","khaki":"kaki","lightblue":"bleu clair","palegreen":"vert pâle","azure":"bleu azur","peachpuff":"pêche","darkolivegreen":"olive foncé","yellowgreen":"vert jaunâtre"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Choix précédents","nextMessage":"Plus de choix"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Annuler","buttonSave":"Sauvegarder","itemClose":"Fermer"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_fr.js b/lib/dojo/nls/tt-rss-layer_fr.js deleted file mode 100644 index 7d5f281e..00000000 --- a/lib/dojo/nls/tt-rss-layer_fr.js +++ /dev/null @@ -1 +0,0 @@ -dojo.provide("dojo.nls.tt-rss-layer_fr");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.fr");dojo.nls.colors.fr={"lightsteelblue":"bleu acier clair","orangered":"rouge orangé","midnightblue":"bleu nuit","cadetblue":"bleu pétrole","seashell":"coquillage","slategrey":"gris ardoise","coral":"corail","darkturquoise":"turquoise foncé","antiquewhite":"blanc antique","mediumspringgreen":"vert printemps moyen","salmon":"saumon","darkgrey":"gris foncé","ivory":"ivoire","greenyellow":"vert-jaune","mistyrose":"rose pâle","lightsalmon":"saumon clair","silver":"argent","dimgrey":"gris soutenu","orange":"orange","white":"blanc","navajowhite":"chair","royalblue":"bleu roi","deeppink":"rose soutenu","lime":"vert citron","oldlace":"blanc cassé","chartreuse":"vert vif","darkcyan":"cyan foncé","yellow":"jaune","linen":"écru","olive":"olive","gold":"or","lawngreen":"vert prairie","lightyellow":"jaune clair","tan":"grège","darkviolet":"violet foncé","lightslategrey":"gris ardoise clair","grey":"gris","darkkhaki":"kaki foncé","green":"vert","deepskyblue":"bleu ciel soutenu","aqua":"bleu-vert","sienna":"terre de sienne","mintcream":"crème de menthe","rosybrown":"vieux rose","mediumslateblue":"bleu ardoise moyen","magenta":"magenta","lightseagreen":"vert d'eau clair","cyan":"cyan","olivedrab":"brun verdâtre","darkgoldenrod":"jaune paille foncé","slateblue":"bleu ardoise","mediumaquamarine":"aigue-marine moyen","lavender":"lavande","mediumseagreen":"vert d'eau moyen","maroon":"marron","darkslategray":"gris ardoise foncé","mediumturquoise":"turquoise moyen","ghostwhite":"blanc laiteux","darkblue":"bleu foncé","mediumvioletred":"rouge violacé moyen","brown":"brun","lightgray":"gris clair","sandybrown":"sable","pink":"rose","firebrick":"rouge brique","indigo":"indigo","snow":"neige","darkorchid":"lilas foncé","turquoise":"turquoise","chocolate":"chocolat","springgreen":"vert printemps","moccasin":"chamois","navy":"bleu marine","lemonchiffon":"mousse de citron","teal":"sarcelle","floralwhite":"lys","cornflowerblue":"bleuet","paleturquoise":"turquoise pâle","purple":"pourpre","gainsboro":"gris souris","plum":"prune","red":"rouge","blue":"bleu","forestgreen":"vert sapin","darkgreen":"vert foncé","honeydew":"opalin","darkseagreen":"vert d'eau foncé","lightcoral":"corail clair","palevioletred":"rouge violacé pâle","mediumpurple":"pourpre moyen","saddlebrown":"brun cuir","darkmagenta":"magenta foncé","thistle":"chardon","whitesmoke":"blanc cendré","wheat":"blé","violet":"violet","lightskyblue":"bleu ciel clair","goldenrod":"jaune paille","mediumblue":"bleu moyen","skyblue":"bleu ciel","crimson":"cramoisi","darksalmon":"saumon foncé","darkred":"rouge foncé","darkslategrey":"gris ardoise foncé","peru":"caramel","lightgrey":"gris clair","lightgoldenrodyellow":"jaune paille clair","blanchedalmond":"coquille d'oeuf","aliceblue":"bleu gris","bisque":"beige rosé","slategray":"gris ardoise","palegoldenrod":"jaune paille pâle","darkorange":"orange foncé","aquamarine":"aigue-marine","lightgreen":"vert clair","burlywood":"bois précieux","dodgerblue":"bleu France","darkgray":"gris foncé","lightcyan":"cyan clair","powderblue":"bleu de smalt","blueviolet":"bleu-violet","orchid":"lilas","dimgray":"gris soutenu","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavandin","hotpink":"rose intense","steelblue":"bleu acier","tomato":"tomate","lightpink":"rose clair","limegreen":"citron vert","indianred":"rose indien","papayawhip":"crème de papaye","lightslategray":"gris ardoise clair","gray":"gris","mediumorchid":"lilas moyen","cornsilk":"vanille","black":"noir","seagreen":"vert d'eau","darkslateblue":"bleu ardoise foncé","khaki":"kaki","lightblue":"bleu clair","palegreen":"vert pâle","azure":"bleu azur","peachpuff":"pêche","darkolivegreen":"olive foncé","yellowgreen":"vert jaunâtre"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.fr");dijit.nls.loading.fr={"loadingState":"Chargement...","errorState":"Une erreur est survenue"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.fr");dijit.nls.common.fr={"buttonOk":"OK","buttonCancel":"Annuler","buttonSave":"Sauvegarder","itemClose":"Fermer"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.fr");dijit.form.nls.validate.fr={"rangeMessage":"Cette valeur n'est pas comprise dans la plage autorisée.","invalidMessage":"La valeur indiquée n'est pas correcte.","missingMessage":"Cette valeur est requise."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.fr");dijit.form.nls.ComboBox.fr={"previousMessage":"Choix précédents","nextMessage":"Plus de choix"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.fr");dojo.cldr.nls.number.fr={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; diff --git a/lib/dojo/nls/tt-rss-layer_he-il.js b/lib/dojo/nls/tt-rss-layer_he-il.js index bc4572cc..f651b876 100644 --- a/lib/dojo/nls/tt-rss-layer_he-il.js +++ b/lib/dojo/nls/tt-rss-layer_he-il.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_he-il");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.he_il");dojo.nls.colors.he_il={"lightsteelblue":"כחול פלדה בהיר","orangered":"כתום אדום","midnightblue":"כחול כהה","cadetblue":"כחול ים","seashell":"צדף","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"לבן עתיק","mediumspringgreen":"ירוק אביב בינוני","salmon":"סלמון","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירוק-צהוב","mistyrose":"ורוד מעורפל","lightsalmon":"סלמון בהיר","silver":"כסף","dimgrey":"אפור עמום","orange":"כתום","white":"לבן","navajowhite":"לבן נוואחו","royalblue":"כחול מלכותי","deeppink":"ורוד עמוק","lime":"לימון","oldlace":"תחרה עתיקה","chartreuse":"ירוק-צהוב","darkcyan":"טורקיז כהה","yellow":"צהוב","linen":"פשתן","olive":"זית","gold":"זהב","lawngreen":"ירוק דשא","lightyellow":"צהוב בהיר","tan":"חום אדמדם","darkviolet":"סגול כהה","lightslategrey":"אפור צפחה בהיר","grey":"אפור","darkkhaki":"חאקי כהה","green":"ירוק","deepskyblue":"כחול שמיים עמוק","aqua":"אקווה","sienna":"סיינה","mintcream":"קרם מנטה","rosybrown":"חום ורדרד","mediumslateblue":"כחול צפחה בינוני","magenta":"בורדו","lightseagreen":"ירוק ים בהיר","cyan":"טורקיז","olivedrab":"זית עמום","darkgoldenrod":"זהוב כהה","slateblue":"כחול צפחה","mediumaquamarine":"כחול בינוני","lavender":"לבנדר","mediumseagreen":"ירוק ים בינוני","maroon":"חום אדמדם","darkslategray":"אפור צפחה כהה","mediumturquoise":"טורקיז בינוני","ghostwhite":"לבן רפאים","darkblue":"כחול כהה","mediumvioletred":"סגול-אדום בינוני","brown":"חום","lightgray":"אפור בהיר","sandybrown":"חום חולי","pink":"ורוד","firebrick":"לבנה שרופה","indigo":"אינדיגו","snow":"שלג","darkorchid":"סחלב כהה","turquoise":"טורקיז","chocolate":"שוקולד","springgreen":"ירוק אביב","moccasin":"מוקסין","navy":"כחול כהה","lemonchiffon":"ירוק לימון","teal":"כחול-ירוק כהה","floralwhite":"לבן פרחוני","cornflowerblue":"כחול דרדר","paleturquoise":"טורקיז בהיר","purple":"סגול","gainsboro":"גיינסבורו","plum":"שזיף","red":"אדום","blue":"כחול","forestgreen":"ירוק יער","darkgreen":"ירוק כהה","honeydew":"ירקרק","darkseagreen":"ירוק ים כהה","lightcoral":"אלמוג בהיר","palevioletred":"סגול-אדום בהיר","mediumpurple":"סגול בינוני","saddlebrown":"חום דהוי","darkmagenta":"בורדו כהה","thistle":"דרדר","whitesmoke":"עשן לבן","wheat":"חיוט","violet":"סגול","lightskyblue":"כחול שמיים בהיר","goldenrod":"זהוב","mediumblue":"תכלת בינוני","skyblue":"כחול שמיים","crimson":"ארגמן","darksalmon":"סלמון כהה","darkred":"אדום כהה","darkslategrey":"אפור צפחה כהה","peru":"פרו","lightgrey":"אפור בהיר","lightgoldenrodyellow":"צהוב בהיר","blanchedalmond":"שקד","aliceblue":"כחול פלדה","bisque":"לבן שקד","slategray":"אפור צפחה","palegoldenrod":"זהוב בהיר","darkorange":"כתום כהה","aquamarine":"אקוומארין","lightgreen":"ירוק בהיר","burlywood":"חום דהוי","dodgerblue":"כחול","darkgray":"אפור כהה","lightcyan":"טורקיז בהיר","powderblue":"כחול חיוור","blueviolet":"כחול-סגול","orchid":"סחלב","dimgray":"אפור עמום","beige":"בז'","fuchsia":"ורוד בהיר","lavenderblush":"סומק לבנדר","hotpink":"ורוד לוהט","steelblue":"כחול פלדה","tomato":"עגבניה","lightpink":"ורוד בהיר","limegreen":"ירוק לימוני","indianred":"אדום דהוי","papayawhip":"פפאיה","lightslategray":"אפור צפחה בהיר","gray":"אפור","mediumorchid":"סחלב בינוני","cornsilk":"צהבהב","black":"שחור","seagreen":"ירוק ים","darkslateblue":"כחול צפחה כהה","khaki":"חאקי","lightblue":"תכלת","palegreen":"ירוק בהיר","azure":"תכלת עז","peachpuff":"קציפת אפרסק","darkolivegreen":"ירוק זית כהה","yellowgreen":"ירוק צהוב"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.he_il");dijit.nls.loading.he_il={"loadingState":"טעינה...‏","errorState":"אירעה שגיאה"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.he_il");dijit.nls.common.he_il={"buttonOk":"אישור","buttonCancel":"ביטול","buttonSave":"שמירה","itemClose":"סגירה"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.he_il");dijit.form.nls.validate.he_il={"rangeMessage":"הערך מחוץ לטווח.","invalidMessage":"הערך שצוין אינו חוקי.","missingMessage":"זהו ערך דרוש."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.he_il");dijit.form.nls.ComboBox.he_il={"previousMessage":"האפשרויות הקודמות","nextMessage":"אפשרויות נוספות"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.he_il");dojo.cldr.nls.number.he_il={"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_he-il",{"dijit/form/nls/validate":{"rangeMessage":"הערך מחוץ לטווח.","invalidMessage":"הערך שצוין אינו חוקי.","missingMessage":"זהו ערך דרוש."},"dijit/nls/loading":{"loadingState":"טעינה...","errorState":"אירעה שגיאה"},"dojo/nls/colors":{"lightsteelblue":"כחול פלדה בהיר","orangered":"כתום אדום","midnightblue":"כחול כהה","cadetblue":"כחול ים","seashell":"צדף","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"לבן עתיק","mediumspringgreen":"ירוק אביב בינוני","transparent":"transparent","salmon":"סלמון","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירוק-צהוב","mistyrose":"ורוד מעורפל","lightsalmon":"סלמון בהיר","silver":"כסף","dimgrey":"אפור עמום","orange":"כתום","white":"לבן","navajowhite":"לבן נוואחו","royalblue":"כחול מלכותי","deeppink":"ורוד עמוק","lime":"לימון","oldlace":"תחרה עתיקה","chartreuse":"ירוק-צהוב","darkcyan":"טורקיז כהה","yellow":"צהוב","linen":"פשתן","olive":"זית","gold":"זהב","lawngreen":"ירוק דשא","lightyellow":"צהוב בהיר","tan":"חום אדמדם","darkviolet":"סגול כהה","lightslategrey":"אפור צפחה בהיר","grey":"אפור","darkkhaki":"חאקי כהה","green":"ירוק","deepskyblue":"כחול שמיים עמוק","aqua":"אקווה","sienna":"סיינה","mintcream":"קרם מנטה","rosybrown":"חום ורדרד","mediumslateblue":"כחול צפחה בינוני","magenta":"בורדו","lightseagreen":"ירוק ים בהיר","cyan":"טורקיז","olivedrab":"זית עמום","darkgoldenrod":"זהוב כהה","slateblue":"כחול צפחה","mediumaquamarine":"כחול בינוני","lavender":"לבנדר","mediumseagreen":"ירוק ים בינוני","maroon":"חום אדמדם","darkslategray":"אפור צפחה כהה","mediumturquoise":"טורקיז בינוני","ghostwhite":"לבן רפאים","darkblue":"כחול כהה","mediumvioletred":"סגול-אדום בינוני","brown":"חום","lightgray":"אפור בהיר","sandybrown":"חום חולי","pink":"ורוד","firebrick":"לבנה שרופה","indigo":"אינדיגו","snow":"שלג","darkorchid":"סחלב כהה","turquoise":"טורקיז","chocolate":"שוקולד","springgreen":"ירוק אביב","moccasin":"מוקסין","navy":"כחול כהה","lemonchiffon":"ירוק לימון","teal":"כחול-ירוק כהה","floralwhite":"לבן פרחוני","cornflowerblue":"כחול דרדר","paleturquoise":"טורקיז בהיר","purple":"סגול","gainsboro":"גיינסבורו","plum":"שזיף","red":"אדום","blue":"כחול","forestgreen":"ירוק יער","darkgreen":"ירוק כהה","honeydew":"ירקרק","darkseagreen":"ירוק ים כהה","lightcoral":"אלמוג בהיר","palevioletred":"סגול-אדום בהיר","mediumpurple":"סגול בינוני","saddlebrown":"חום דהוי","darkmagenta":"בורדו כהה","thistle":"דרדר","whitesmoke":"עשן לבן","wheat":"חיוט","violet":"סגול","lightskyblue":"כחול שמיים בהיר","goldenrod":"זהוב","mediumblue":"תכלת בינוני","skyblue":"כחול שמיים","crimson":"ארגמן","darksalmon":"סלמון כהה","darkred":"אדום כהה","darkslategrey":"אפור צפחה כהה","peru":"פרו","lightgrey":"אפור בהיר","lightgoldenrodyellow":"צהוב בהיר","blanchedalmond":"שקד","aliceblue":"כחול פלדה","bisque":"לבן שקד","slategray":"אפור צפחה","palegoldenrod":"זהוב בהיר","darkorange":"כתום כהה","aquamarine":"אקוומארין","lightgreen":"ירוק בהיר","burlywood":"חום דהוי","dodgerblue":"כחול","darkgray":"אפור כהה","lightcyan":"טורקיז בהיר","powderblue":"כחול חיוור","blueviolet":"כחול-סגול","orchid":"סחלב","dimgray":"אפור עמום","beige":"בז'","fuchsia":"ורוד בהיר","lavenderblush":"סומק לבנדר","hotpink":"ורוד לוהט","steelblue":"כחול פלדה","tomato":"עגבניה","lightpink":"ורוד בהיר","limegreen":"ירוק לימוני","indianred":"אדום דהוי","papayawhip":"פפאיה","lightslategray":"אפור צפחה בהיר","gray":"אפור","mediumorchid":"סחלב בינוני","cornsilk":"צהבהב","black":"שחור","seagreen":"ירוק ים","darkslateblue":"כחול צפחה כהה","khaki":"חאקי","lightblue":"תכלת","palegreen":"ירוק בהיר","azure":"תכלת עז","peachpuff":"קציפת אפרסק","darkolivegreen":"ירוק זית כהה","yellowgreen":"ירוק צהוב"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"האפשרויות הקודמות","nextMessage":"אפשרויות נוספות"},"dijit/nls/common":{"buttonOk":"אישור","buttonCancel":"ביטול","buttonSave":"שמירה","itemClose":"סגירה"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_he-il.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_he-il.js.uncompressed.js new file mode 100644 index 00000000..aaba5ded --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_he-il.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_he-il',{ +'dijit/form/nls/validate':{"rangeMessage":"הערך מחוץ לטווח.","invalidMessage":"הערך שצוין אינו חוקי.","missingMessage":"זהו ערך דרוש."} +, +'dijit/nls/loading':{"loadingState":"טעינה...","errorState":"אירעה שגיאה"} +, +'dojo/nls/colors':{"lightsteelblue":"כחול פלדה בהיר","orangered":"כתום אדום","midnightblue":"כחול כהה","cadetblue":"כחול ים","seashell":"צדף","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"לבן עתיק","mediumspringgreen":"ירוק אביב בינוני","transparent":"transparent","salmon":"סלמון","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירוק-צהוב","mistyrose":"ורוד מעורפל","lightsalmon":"סלמון בהיר","silver":"כסף","dimgrey":"אפור עמום","orange":"כתום","white":"לבן","navajowhite":"לבן נוואחו","royalblue":"כחול מלכותי","deeppink":"ורוד עמוק","lime":"לימון","oldlace":"תחרה עתיקה","chartreuse":"ירוק-צהוב","darkcyan":"טורקיז כהה","yellow":"צהוב","linen":"פשתן","olive":"זית","gold":"זהב","lawngreen":"ירוק דשא","lightyellow":"צהוב בהיר","tan":"חום אדמדם","darkviolet":"סגול כהה","lightslategrey":"אפור צפחה בהיר","grey":"אפור","darkkhaki":"חאקי כהה","green":"ירוק","deepskyblue":"כחול שמיים עמוק","aqua":"אקווה","sienna":"סיינה","mintcream":"קרם מנטה","rosybrown":"חום ורדרד","mediumslateblue":"כחול צפחה בינוני","magenta":"בורדו","lightseagreen":"ירוק ים בהיר","cyan":"טורקיז","olivedrab":"זית עמום","darkgoldenrod":"זהוב כהה","slateblue":"כחול צפחה","mediumaquamarine":"כחול בינוני","lavender":"לבנדר","mediumseagreen":"ירוק ים בינוני","maroon":"חום אדמדם","darkslategray":"אפור צפחה כהה","mediumturquoise":"טורקיז בינוני","ghostwhite":"לבן רפאים","darkblue":"כחול כהה","mediumvioletred":"סגול-אדום בינוני","brown":"חום","lightgray":"אפור בהיר","sandybrown":"חום חולי","pink":"ורוד","firebrick":"לבנה שרופה","indigo":"אינדיגו","snow":"שלג","darkorchid":"סחלב כהה","turquoise":"טורקיז","chocolate":"שוקולד","springgreen":"ירוק אביב","moccasin":"מוקסין","navy":"כחול כהה","lemonchiffon":"ירוק לימון","teal":"כחול-ירוק כהה","floralwhite":"לבן פרחוני","cornflowerblue":"כחול דרדר","paleturquoise":"טורקיז בהיר","purple":"סגול","gainsboro":"גיינסבורו","plum":"שזיף","red":"אדום","blue":"כחול","forestgreen":"ירוק יער","darkgreen":"ירוק כהה","honeydew":"ירקרק","darkseagreen":"ירוק ים כהה","lightcoral":"אלמוג בהיר","palevioletred":"סגול-אדום בהיר","mediumpurple":"סגול בינוני","saddlebrown":"חום דהוי","darkmagenta":"בורדו כהה","thistle":"דרדר","whitesmoke":"עשן לבן","wheat":"חיוט","violet":"סגול","lightskyblue":"כחול שמיים בהיר","goldenrod":"זהוב","mediumblue":"תכלת בינוני","skyblue":"כחול שמיים","crimson":"ארגמן","darksalmon":"סלמון כהה","darkred":"אדום כהה","darkslategrey":"אפור צפחה כהה","peru":"פרו","lightgrey":"אפור בהיר","lightgoldenrodyellow":"צהוב בהיר","blanchedalmond":"שקד","aliceblue":"כחול פלדה","bisque":"לבן שקד","slategray":"אפור צפחה","palegoldenrod":"זהוב בהיר","darkorange":"כתום כהה","aquamarine":"אקוומארין","lightgreen":"ירוק בהיר","burlywood":"חום דהוי","dodgerblue":"כחול","darkgray":"אפור כהה","lightcyan":"טורקיז בהיר","powderblue":"כחול חיוור","blueviolet":"כחול-סגול","orchid":"סחלב","dimgray":"אפור עמום","beige":"בז'","fuchsia":"ורוד בהיר","lavenderblush":"סומק לבנדר","hotpink":"ורוד לוהט","steelblue":"כחול פלדה","tomato":"עגבניה","lightpink":"ורוד בהיר","limegreen":"ירוק לימוני","indianred":"אדום דהוי","papayawhip":"פפאיה","lightslategray":"אפור צפחה בהיר","gray":"אפור","mediumorchid":"סחלב בינוני","cornsilk":"צהבהב","black":"שחור","seagreen":"ירוק ים","darkslateblue":"כחול צפחה כהה","khaki":"חאקי","lightblue":"תכלת","palegreen":"ירוק בהיר","azure":"תכלת עז","peachpuff":"קציפת אפרסק","darkolivegreen":"ירוק זית כהה","yellowgreen":"ירוק צהוב"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"האפשרויות הקודמות","nextMessage":"אפשרויות נוספות"} +, +'dijit/nls/common':{"buttonOk":"אישור","buttonCancel":"ביטול","buttonSave":"שמירה","itemClose":"סגירה"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_he.js b/lib/dojo/nls/tt-rss-layer_he.js deleted file mode 100644 index 3efc22fc..00000000 --- a/lib/dojo/nls/tt-rss-layer_he.js +++ /dev/null @@ -1 +0,0 @@ -dojo.provide("dojo.nls.tt-rss-layer_he");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.he");dojo.nls.colors.he={"lightsteelblue":"כחול פלדה בהיר","orangered":"כתום אדום","midnightblue":"כחול כהה","cadetblue":"כחול ים","seashell":"צדף","slategrey":"אפור צפחה","coral":"אלמוג","darkturquoise":"טורקיז כהה","antiquewhite":"לבן עתיק","mediumspringgreen":"ירוק אביב בינוני","salmon":"סלמון","darkgrey":"אפור כהה","ivory":"שנהב","greenyellow":"ירוק-צהוב","mistyrose":"ורוד מעורפל","lightsalmon":"סלמון בהיר","silver":"כסף","dimgrey":"אפור עמום","orange":"כתום","white":"לבן","navajowhite":"לבן נוואחו","royalblue":"כחול מלכותי","deeppink":"ורוד עמוק","lime":"לימון","oldlace":"תחרה עתיקה","chartreuse":"ירוק-צהוב","darkcyan":"טורקיז כהה","yellow":"צהוב","linen":"פשתן","olive":"זית","gold":"זהב","lawngreen":"ירוק דשא","lightyellow":"צהוב בהיר","tan":"חום אדמדם","darkviolet":"סגול כהה","lightslategrey":"אפור צפחה בהיר","grey":"אפור","darkkhaki":"חאקי כהה","green":"ירוק","deepskyblue":"כחול שמיים עמוק","aqua":"אקווה","sienna":"סיינה","mintcream":"קרם מנטה","rosybrown":"חום ורדרד","mediumslateblue":"כחול צפחה בינוני","magenta":"בורדו","lightseagreen":"ירוק ים בהיר","cyan":"טורקיז","olivedrab":"זית עמום","darkgoldenrod":"זהוב כהה","slateblue":"כחול צפחה","mediumaquamarine":"כחול בינוני","lavender":"לבנדר","mediumseagreen":"ירוק ים בינוני","maroon":"חום אדמדם","darkslategray":"אפור צפחה כהה","mediumturquoise":"טורקיז בינוני","ghostwhite":"לבן רפאים","darkblue":"כחול כהה","mediumvioletred":"סגול-אדום בינוני","brown":"חום","lightgray":"אפור בהיר","sandybrown":"חום חולי","pink":"ורוד","firebrick":"לבנה שרופה","indigo":"אינדיגו","snow":"שלג","darkorchid":"סחלב כהה","turquoise":"טורקיז","chocolate":"שוקולד","springgreen":"ירוק אביב","moccasin":"מוקסין","navy":"כחול כהה","lemonchiffon":"ירוק לימון","teal":"כחול-ירוק כהה","floralwhite":"לבן פרחוני","cornflowerblue":"כחול דרדר","paleturquoise":"טורקיז בהיר","purple":"סגול","gainsboro":"גיינסבורו","plum":"שזיף","red":"אדום","blue":"כחול","forestgreen":"ירוק יער","darkgreen":"ירוק כהה","honeydew":"ירקרק","darkseagreen":"ירוק ים כהה","lightcoral":"אלמוג בהיר","palevioletred":"סגול-אדום בהיר","mediumpurple":"סגול בינוני","saddlebrown":"חום דהוי","darkmagenta":"בורדו כהה","thistle":"דרדר","whitesmoke":"עשן לבן","wheat":"חיוט","violet":"סגול","lightskyblue":"כחול שמיים בהיר","goldenrod":"זהוב","mediumblue":"תכלת בינוני","skyblue":"כחול שמיים","crimson":"ארגמן","darksalmon":"סלמון כהה","darkred":"אדום כהה","darkslategrey":"אפור צפחה כהה","peru":"פרו","lightgrey":"אפור בהיר","lightgoldenrodyellow":"צהוב בהיר","blanchedalmond":"שקד","aliceblue":"כחול פלדה","bisque":"לבן שקד","slategray":"אפור צפחה","palegoldenrod":"זהוב בהיר","darkorange":"כתום כהה","aquamarine":"אקוומארין","lightgreen":"ירוק בהיר","burlywood":"חום דהוי","dodgerblue":"כחול","darkgray":"אפור כהה","lightcyan":"טורקיז בהיר","powderblue":"כחול חיוור","blueviolet":"כחול-סגול","orchid":"סחלב","dimgray":"אפור עמום","beige":"בז'","fuchsia":"ורוד בהיר","lavenderblush":"סומק לבנדר","hotpink":"ורוד לוהט","steelblue":"כחול פלדה","tomato":"עגבניה","lightpink":"ורוד בהיר","limegreen":"ירוק לימוני","indianred":"אדום דהוי","papayawhip":"פפאיה","lightslategray":"אפור צפחה בהיר","gray":"אפור","mediumorchid":"סחלב בינוני","cornsilk":"צהבהב","black":"שחור","seagreen":"ירוק ים","darkslateblue":"כחול צפחה כהה","khaki":"חאקי","lightblue":"תכלת","palegreen":"ירוק בהיר","azure":"תכלת עז","peachpuff":"קציפת אפרסק","darkolivegreen":"ירוק זית כהה","yellowgreen":"ירוק צהוב"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.he");dijit.nls.loading.he={"loadingState":"טעינה...‏","errorState":"אירעה שגיאה"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.he");dijit.nls.common.he={"buttonOk":"אישור","buttonCancel":"ביטול","buttonSave":"שמירה","itemClose":"סגירה"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.he");dijit.form.nls.validate.he={"rangeMessage":"הערך מחוץ לטווח.","invalidMessage":"הערך שצוין אינו חוקי.","missingMessage":"זהו ערך דרוש."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.he");dijit.form.nls.ComboBox.he={"previousMessage":"האפשרויות הקודמות","nextMessage":"אפשרויות נוספות"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.he");dojo.cldr.nls.number.he={"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; diff --git a/lib/dojo/nls/tt-rss-layer_hu.js b/lib/dojo/nls/tt-rss-layer_hu.js index 2567d683..ff868577 100644 --- a/lib/dojo/nls/tt-rss-layer_hu.js +++ b/lib/dojo/nls/tt-rss-layer_hu.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_hu");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.hu");dojo.nls.colors.hu={"lightsteelblue":"világos acélkék","orangered":"narancsvörös","midnightblue":"éjkék","cadetblue":"kadétkék","seashell":"kagyló","slategrey":"palaszürke","coral":"korall","darkturquoise":"sötét türkizkék","antiquewhite":"antik fehér","mediumspringgreen":"közepes tavaszzöld","salmon":"lazacszín","darkgrey":"sötétszürke","ivory":"elefántcsont","greenyellow":"zöldessárga","mistyrose":"halvány rózsaszín","lightsalmon":"világos lazacszín","silver":"ezüst","dimgrey":"halványszürke","orange":"narancssárga","white":"fehér","navajowhite":"navajo fehér","royalblue":"királykék","deeppink":"sötétrózsaszín","lime":"lime","oldlace":"régi csipke","chartreuse":"chartreuse","darkcyan":"sötét ciánkék","yellow":"sárga","linen":"vászonfehér","olive":"olajzöld","gold":"arany","lawngreen":"fűzöld","lightyellow":"világossárga","tan":"rozsdabarna","darkviolet":"sötét ibolyaszín","lightslategrey":"világos palaszürke","grey":"szürke","darkkhaki":"sötét khakiszín","green":"zöld","deepskyblue":"sötét égszínkék","aqua":"vízszín","sienna":"vörösesbarna","mintcream":"mentaszósz","rosybrown":"barnásrózsaszín","mediumslateblue":"közepes palakék","magenta":"bíbor","lightseagreen":"világos tengerzöld","cyan":"ciánkék","olivedrab":"olajzöld drapp","darkgoldenrod":"sötét aranyvessző","slateblue":"palakék","mediumaquamarine":"közepes akvamarin","lavender":"levendula","mediumseagreen":"közepes tengerzöld","maroon":"gesztenyebarna","darkslategray":"sötét palaszürke","mediumturquoise":"közepes türkizkék","ghostwhite":"szellemfehér","darkblue":"sötétkék","mediumvioletred":"közepes ibolyavörös","brown":"barna","lightgray":"világosszürke","sandybrown":"homokbarna","pink":"rózsaszín","firebrick":"téglavörös","indigo":"indigó","snow":"hó","darkorchid":"sötét orchidea","turquoise":"türkizkék","chocolate":"csokoládé","springgreen":"tavaszzöld","moccasin":"mokkaszín","navy":"tengerészkék","lemonchiffon":"sárga műselyem","teal":"pávakék","floralwhite":"virágfehér","cornflowerblue":"búzavirágkék","paleturquoise":"halvány türkizkék","purple":"lila","gainsboro":"gainsboro","plum":"szilvakék","red":"vörös","blue":"kék","forestgreen":"erdőzöld","darkgreen":"sötétzöld","honeydew":"mézharmat","darkseagreen":"sötét tengerzöld","lightcoral":"világos korall","palevioletred":"halvány ibolyavörös","mediumpurple":"közepes lila","saddlebrown":"nyeregbarna","darkmagenta":"sötétbíbor","thistle":"bogáncs","whitesmoke":"fehér füst","wheat":"búza","violet":"ibolyaszín","lightskyblue":"világos égszínkék","goldenrod":"aranyvessző","mediumblue":"közepes kék","skyblue":"égszínkék","crimson":"karmazsinvörös","darksalmon":"sötét lazacszín","darkred":"sötétvörös","darkslategrey":"sötét palaszürke","peru":"peru","lightgrey":"világosszürke","lightgoldenrodyellow":"világos aranyvessző sárga","blanchedalmond":"hámozott mandula","aliceblue":"Alice kék","bisque":"porcelán","slategray":"palaszürke","palegoldenrod":"halvány aranyvessző","darkorange":"sötét narancssárga","aquamarine":"akvamarin","lightgreen":"világoszöld","burlywood":"nyersfa","dodgerblue":"dodger kék","darkgray":"sötétszürke","lightcyan":"világos ciánkék","powderblue":"púderkék","blueviolet":"ibolyakék","orchid":"orchidea","dimgray":"halványszürke","beige":"bézs","fuchsia":"fukszia","lavenderblush":"pirosas levendula","hotpink":"meleg rózsaszín","steelblue":"acélkék","tomato":"paradicsom","lightpink":"világos rózsaszín","limegreen":"limezöld","indianred":"indiánvörös","papayawhip":"papayahab","lightslategray":"világos palaszürke","gray":"szürke","mediumorchid":"közepes orchidea","cornsilk":"kukoricahaj","black":"fekete","seagreen":"tengerzöld","darkslateblue":"sötét palakék","khaki":"khakiszín","lightblue":"világoskék","palegreen":"halványzöld","azure":"azúrkék","peachpuff":"barackszín","darkolivegreen":"sötét olajzöld","yellowgreen":"sárgászöld"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.hu");dijit.nls.loading.hu={"loadingState":"Betöltés...","errorState":"Sajnálom, hiba történt"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.hu");dijit.nls.common.hu={"buttonOk":"OK","buttonCancel":"Mégse","buttonSave":"Mentés","itemClose":"Bezárás"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.hu");dijit.form.nls.validate.hu={"rangeMessage":"Az érték kívül van a megengedett tartományon.","invalidMessage":"A megadott érték érvénytelen.","missingMessage":"Meg kell adni egy értéket."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.hu");dijit.form.nls.ComboBox.hu={"previousMessage":"Előző menüpontok","nextMessage":"További menüpontok"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.hu");dojo.cldr.nls.number.hu={"group":" ","percentSign":"%","exponential":"E","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","percentFormat":"#,##0%","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_hu",{"dijit/form/nls/validate":{"rangeMessage":"Az érték kívül van a megengedett tartományon.","invalidMessage":"A megadott érték érvénytelen.","missingMessage":"Meg kell adni egy értéket."},"dijit/nls/loading":{"loadingState":"Betöltés...","errorState":"Sajnálom, hiba történt"},"dojo/nls/colors":{"lightsteelblue":"világos acélkék","orangered":"narancsvörös","midnightblue":"éjkék","cadetblue":"kadétkék","seashell":"kagyló","slategrey":"palaszürke","coral":"korall","darkturquoise":"sötét türkizkék","antiquewhite":"antik fehér","mediumspringgreen":"közepes tavaszzöld","transparent":"átlátszó","salmon":"lazacszín","darkgrey":"sötétszürke","ivory":"elefántcsont","greenyellow":"zöldessárga","mistyrose":"halvány rózsaszín","lightsalmon":"világos lazacszín","silver":"ezüst","dimgrey":"halványszürke","orange":"narancssárga","white":"fehér","navajowhite":"navajo fehér","royalblue":"királykék","deeppink":"sötétrózsaszín","lime":"lime","oldlace":"régi csipke","chartreuse":"chartreuse","darkcyan":"sötét ciánkék","yellow":"sárga","linen":"vászonfehér","olive":"olajzöld","gold":"arany","lawngreen":"fűzöld","lightyellow":"világossárga","tan":"rozsdabarna","darkviolet":"sötét ibolyaszín","lightslategrey":"világos palaszürke","grey":"szürke","darkkhaki":"sötét khakiszín","green":"zöld","deepskyblue":"sötét égszínkék","aqua":"vízszín","sienna":"vörösesbarna","mintcream":"mentaszósz","rosybrown":"barnásrózsaszín","mediumslateblue":"közepes palakék","magenta":"bíbor","lightseagreen":"világos tengerzöld","cyan":"ciánkék","olivedrab":"olajzöld drapp","darkgoldenrod":"sötét aranyvessző","slateblue":"palakék","mediumaquamarine":"közepes akvamarin","lavender":"levendula","mediumseagreen":"közepes tengerzöld","maroon":"gesztenyebarna","darkslategray":"sötét palaszürke","mediumturquoise":"közepes türkizkék","ghostwhite":"szellemfehér","darkblue":"sötétkék","mediumvioletred":"közepes ibolyavörös","brown":"barna","lightgray":"világosszürke","sandybrown":"homokbarna","pink":"rózsaszín","firebrick":"téglavörös","indigo":"indigó","snow":"hó","darkorchid":"sötét orchidea","turquoise":"türkizkék","chocolate":"csokoládé","springgreen":"tavaszzöld","moccasin":"mokkaszín","navy":"tengerészkék","lemonchiffon":"sárga műselyem","teal":"pávakék","floralwhite":"virágfehér","cornflowerblue":"búzavirágkék","paleturquoise":"halvány türkizkék","purple":"lila","gainsboro":"gainsboro","plum":"szilvakék","red":"vörös","blue":"kék","forestgreen":"erdőzöld","darkgreen":"sötétzöld","honeydew":"mézharmat","darkseagreen":"sötét tengerzöld","lightcoral":"világos korall","palevioletred":"halvány ibolyavörös","mediumpurple":"közepes lila","saddlebrown":"nyeregbarna","darkmagenta":"sötétbíbor","thistle":"bogáncs","whitesmoke":"fehér füst","wheat":"búza","violet":"ibolyaszín","lightskyblue":"világos égszínkék","goldenrod":"aranyvessző","mediumblue":"közepes kék","skyblue":"égszínkék","crimson":"karmazsinvörös","darksalmon":"sötét lazacszín","darkred":"sötétvörös","darkslategrey":"sötét palaszürke","peru":"peru","lightgrey":"világosszürke","lightgoldenrodyellow":"világos aranyvessző sárga","blanchedalmond":"hámozott mandula","aliceblue":"Alice kék","bisque":"porcelán","slategray":"palaszürke","palegoldenrod":"halvány aranyvessző","darkorange":"sötét narancssárga","aquamarine":"akvamarin","lightgreen":"világoszöld","burlywood":"nyersfa","dodgerblue":"dodger kék","darkgray":"sötétszürke","lightcyan":"világos ciánkék","powderblue":"púderkék","blueviolet":"ibolyakék","orchid":"orchidea","dimgray":"halványszürke","beige":"bézs","fuchsia":"fukszia","lavenderblush":"pirosas levendula","hotpink":"meleg rózsaszín","steelblue":"acélkék","tomato":"paradicsom","lightpink":"világos rózsaszín","limegreen":"limezöld","indianred":"indiánvörös","papayawhip":"papayahab","lightslategray":"világos palaszürke","gray":"szürke","mediumorchid":"közepes orchidea","cornsilk":"kukoricahaj","black":"fekete","seagreen":"tengerzöld","darkslateblue":"sötét palakék","khaki":"khakiszín","lightblue":"világoskék","palegreen":"halványzöld","azure":"azúrkék","peachpuff":"barackszín","darkolivegreen":"sötét olajzöld","yellowgreen":"sárgászöld"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Előző menüpontok","nextMessage":"További menüpontok"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Mégse","buttonSave":"Mentés","itemClose":"Bezárás"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_hu.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_hu.js.uncompressed.js new file mode 100644 index 00000000..a41af278 --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_hu.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_hu',{ +'dijit/form/nls/validate':{"rangeMessage":"Az érték kívül van a megengedett tartományon.","invalidMessage":"A megadott érték érvénytelen.","missingMessage":"Meg kell adni egy értéket."} +, +'dijit/nls/loading':{"loadingState":"Betöltés...","errorState":"Sajnálom, hiba történt"} +, +'dojo/nls/colors':{"lightsteelblue":"világos acélkék","orangered":"narancsvörös","midnightblue":"éjkék","cadetblue":"kadétkék","seashell":"kagyló","slategrey":"palaszürke","coral":"korall","darkturquoise":"sötét türkizkék","antiquewhite":"antik fehér","mediumspringgreen":"közepes tavaszzöld","transparent":"átlátszó","salmon":"lazacszín","darkgrey":"sötétszürke","ivory":"elefántcsont","greenyellow":"zöldessárga","mistyrose":"halvány rózsaszín","lightsalmon":"világos lazacszín","silver":"ezüst","dimgrey":"halványszürke","orange":"narancssárga","white":"fehér","navajowhite":"navajo fehér","royalblue":"királykék","deeppink":"sötétrózsaszín","lime":"lime","oldlace":"régi csipke","chartreuse":"chartreuse","darkcyan":"sötét ciánkék","yellow":"sárga","linen":"vászonfehér","olive":"olajzöld","gold":"arany","lawngreen":"fűzöld","lightyellow":"világossárga","tan":"rozsdabarna","darkviolet":"sötét ibolyaszín","lightslategrey":"világos palaszürke","grey":"szürke","darkkhaki":"sötét khakiszín","green":"zöld","deepskyblue":"sötét égszínkék","aqua":"vízszín","sienna":"vörösesbarna","mintcream":"mentaszósz","rosybrown":"barnásrózsaszín","mediumslateblue":"közepes palakék","magenta":"bíbor","lightseagreen":"világos tengerzöld","cyan":"ciánkék","olivedrab":"olajzöld drapp","darkgoldenrod":"sötét aranyvessző","slateblue":"palakék","mediumaquamarine":"közepes akvamarin","lavender":"levendula","mediumseagreen":"közepes tengerzöld","maroon":"gesztenyebarna","darkslategray":"sötét palaszürke","mediumturquoise":"közepes türkizkék","ghostwhite":"szellemfehér","darkblue":"sötétkék","mediumvioletred":"közepes ibolyavörös","brown":"barna","lightgray":"világosszürke","sandybrown":"homokbarna","pink":"rózsaszín","firebrick":"téglavörös","indigo":"indigó","snow":"hó","darkorchid":"sötét orchidea","turquoise":"türkizkék","chocolate":"csokoládé","springgreen":"tavaszzöld","moccasin":"mokkaszín","navy":"tengerészkék","lemonchiffon":"sárga műselyem","teal":"pávakék","floralwhite":"virágfehér","cornflowerblue":"búzavirágkék","paleturquoise":"halvány türkizkék","purple":"lila","gainsboro":"gainsboro","plum":"szilvakék","red":"vörös","blue":"kék","forestgreen":"erdőzöld","darkgreen":"sötétzöld","honeydew":"mézharmat","darkseagreen":"sötét tengerzöld","lightcoral":"világos korall","palevioletred":"halvány ibolyavörös","mediumpurple":"közepes lila","saddlebrown":"nyeregbarna","darkmagenta":"sötétbíbor","thistle":"bogáncs","whitesmoke":"fehér füst","wheat":"búza","violet":"ibolyaszín","lightskyblue":"világos égszínkék","goldenrod":"aranyvessző","mediumblue":"közepes kék","skyblue":"égszínkék","crimson":"karmazsinvörös","darksalmon":"sötét lazacszín","darkred":"sötétvörös","darkslategrey":"sötét palaszürke","peru":"peru","lightgrey":"világosszürke","lightgoldenrodyellow":"világos aranyvessző sárga","blanchedalmond":"hámozott mandula","aliceblue":"Alice kék","bisque":"porcelán","slategray":"palaszürke","palegoldenrod":"halvány aranyvessző","darkorange":"sötét narancssárga","aquamarine":"akvamarin","lightgreen":"világoszöld","burlywood":"nyersfa","dodgerblue":"dodger kék","darkgray":"sötétszürke","lightcyan":"világos ciánkék","powderblue":"púderkék","blueviolet":"ibolyakék","orchid":"orchidea","dimgray":"halványszürke","beige":"bézs","fuchsia":"fukszia","lavenderblush":"pirosas levendula","hotpink":"meleg rózsaszín","steelblue":"acélkék","tomato":"paradicsom","lightpink":"világos rózsaszín","limegreen":"limezöld","indianred":"indiánvörös","papayawhip":"papayahab","lightslategray":"világos palaszürke","gray":"szürke","mediumorchid":"közepes orchidea","cornsilk":"kukoricahaj","black":"fekete","seagreen":"tengerzöld","darkslateblue":"sötét palakék","khaki":"khakiszín","lightblue":"világoskék","palegreen":"halványzöld","azure":"azúrkék","peachpuff":"barackszín","darkolivegreen":"sötét olajzöld","yellowgreen":"sárgászöld"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Előző menüpontok","nextMessage":"További menüpontok"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Mégse","buttonSave":"Mentés","itemClose":"Bezárás"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_it-it.js b/lib/dojo/nls/tt-rss-layer_it-it.js index d2df8f60..280e60c1 100644 --- a/lib/dojo/nls/tt-rss-layer_it-it.js +++ b/lib/dojo/nls/tt-rss-layer_it-it.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_it-it");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.it_it");dojo.nls.colors.it_it={"lightsteelblue":"blu acciao chiaro","orangered":"vermiglio","midnightblue":"blu melanzana scuro","cadetblue":"verde acqua","seashell":"sabbia rosa","slategrey":"grigio ardesia","coral":"corallo","darkturquoise":"turchese scuro","antiquewhite":"bianco antico","mediumspringgreen":"verde primavera medio","salmon":"salmone","darkgrey":"grigio scuro","ivory":"avorio","greenyellow":"giallo verde","mistyrose":"rosa pallido","lightsalmon":"salmone chiaro","silver":"grigio 25%","dimgrey":"grigio 80%","orange":"arancione","white":"bianco","navajowhite":"pesca chiaro","royalblue":"blu reale","deeppink":"ciclamino","lime":"verde fluorescente","oldlace":"mandorla","chartreuse":"verde brillante","darkcyan":"ciano scuro","yellow":"giallo","linen":"lino","olive":"verde oliva","gold":"oro","lawngreen":"verde prato","lightyellow":"giallo chiaro","tan":"grigio bruno","darkviolet":"viola scuro","lightslategrey":"grigio ardesia chiaro","grey":"grigio","darkkhaki":"kaki scuro","green":"verde","deepskyblue":"azzurro cielo scuro","aqua":"acqua","sienna":"cuoio","mintcream":"bianco nuvola","rosybrown":"marrone rosato","mediumslateblue":"blu ardesia medio","magenta":"magenta","lightseagreen":"verde mare chiaro","cyan":"ciano","olivedrab":"marrone oliva","darkgoldenrod":"ocra scuro","slateblue":"blu ardesia","mediumaquamarine":"acquamarina medio","lavender":"lavanda","mediumseagreen":"verde mare medio","maroon":"scarlatto","darkslategray":"grigio ardesia scuro","mediumturquoise":"turchese medio","ghostwhite":"bianco gesso","darkblue":"blu scuro","mediumvioletred":"vinaccia","brown":"marrone","lightgray":"grigio chiaro","sandybrown":"marrone sabbia","pink":"rosa","firebrick":"rosso mattone","indigo":"indaco","snow":"neve","darkorchid":"orchidea scuro","turquoise":"turchese","chocolate":"cioccolato","springgreen":"verde primavera","moccasin":"mocassino","navy":"blu notte","lemonchiffon":"caffelatte chiaro","teal":"verde turchese","floralwhite":"bianco giglio","cornflowerblue":"blu fiordaliso","paleturquoise":"turchese pallido","purple":"porpora","gainsboro":"grigio 10%","plum":"prugna","red":"rosso","blue":"blu","forestgreen":"verde foresta","darkgreen":"verde scuro","honeydew":"bianco germoglio","darkseagreen":"verde mare scuro","lightcoral":"rosa corallo","palevioletred":"vinaccia chiaro","mediumpurple":"porpora medio","saddlebrown":"cacao","darkmagenta":"magenta scuro","thistle":"rosa cenere","whitesmoke":"bianco fumo","wheat":"sabbia","violet":"viola","lightskyblue":"azzurro cielo chiaro","goldenrod":"ocra gialla","mediumblue":"blu medio","skyblue":"azzurro cielo","crimson":"cremisi","darksalmon":"salmone scuro","darkred":"rosso scuro","darkslategrey":"grigio ardesia scuro","peru":"marrone terra bruciata","lightgrey":"grigio chiaro","lightgoldenrodyellow":"giallo tenue","blanchedalmond":"mandorla chiaro","aliceblue":"blu alice","bisque":"incarnato","slategray":"grigio ardesia","palegoldenrod":"giallo zolfo chiaro","darkorange":"arancione scuro","aquamarine":"acquamarina","lightgreen":"verde chiaro","burlywood":"tabacco","dodgerblue":"blu d'oriente","darkgray":"grigio scuro","lightcyan":"ciano chiaro","powderblue":"azzurro polvere","blueviolet":"blu violetto","orchid":"orchidea","dimgray":"grigio 80%","beige":"beige","fuchsia":"fucsia","lavenderblush":"bianco rosato","hotpink":"rosa acceso","steelblue":"blu acciao","tomato":"pomodoro","lightpink":"rosa chiaro","limegreen":"verde lime","indianred":"terra indiana","papayawhip":"cipria","lightslategray":"grigio ardesia chiaro","gray":"grigio","mediumorchid":"orchidea medio","cornsilk":"crema","black":"nero","seagreen":"verde mare","darkslateblue":"blu ardesia scuro","khaki":"kaki","lightblue":"azzurro","palegreen":"verde pallido","azure":"azzurro ghiaccio","peachpuff":"pesca","darkolivegreen":"verde oliva scuro","yellowgreen":"giallo verde"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.it_it");dijit.nls.loading.it_it={"loadingState":"Caricamento in corso...","errorState":"Si è verificato un errore"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.it_it");dijit.nls.common.it_it={"buttonOk":"OK","buttonCancel":"Annulla","buttonSave":"Salva","itemClose":"Chiudi"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.it_it");dijit.form.nls.validate.it_it={"rangeMessage":"Questo valore non è compreso nell'intervallo.","invalidMessage":"Il valore immesso non è valido.","missingMessage":"Questo valore è obbligatorio."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.it_it");dijit.form.nls.ComboBox.it_it={"previousMessage":"Scelte precedenti","nextMessage":"Altre scelte"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.it_it");dojo.cldr.nls.number.it_it={"decimalFormat":"#,##0.###","group":".","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤ #,##0.00","decimal":",","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_it-it",{"dijit/form/nls/validate":{"rangeMessage":"Questo valore non è compreso nell'intervallo.","invalidMessage":"Il valore immesso non è valido.","missingMessage":"Questo valore è obbligatorio."},"dijit/nls/loading":{"loadingState":"Caricamento in corso...","errorState":"Si è verificato un errore"},"dojo/nls/colors":{"lightsteelblue":"blu acciaio chiaro","orangered":"vermiglio","midnightblue":"blu notte","cadetblue":"verde petrolio","seashell":"sabbia rosa","slategrey":"grigio ardesia","coral":"corallo","darkturquoise":"turchese scuro","antiquewhite":"rosa antico","mediumspringgreen":"verde brillante medio","transparent":"trasparente","salmon":"salmone","darkgrey":"grigio scuro","ivory":"avorio","greenyellow":"verde-giallo","mistyrose":"rosa pallido","lightsalmon":"salmone chiaro","silver":"argento","dimgrey":"grigio tenue","orange":"arancione","white":"bianco","navajowhite":"sabbia","royalblue":"royal blue","deeppink":"ciclamino","lime":"lime","oldlace":"mandorla","chartreuse":"verde brillante","darkcyan":"celeste scuro","yellow":"giallo","linen":"lino","olive":"verde oliva","gold":"oro","lawngreen":"verde brillante chiaro","lightyellow":"giallo chiaro","tan":"tan","darkviolet":"viola scuro","lightslategrey":"grigio ardesia chiaro","grey":"grigio","darkkhaki":"cachi scuro","green":"verde","deepskyblue":"azzurro intenso","aqua":"verde acqua","sienna":"terra di siena","mintcream":"bianco nuvola","rosybrown":"caffè latte","mediumslateblue":"blu ardesia medio","magenta":"magenta","lightseagreen":"verde acqua chiaro","cyan":"ciano","olivedrab":"verde bottiglia","darkgoldenrod":"ocra scuro","slateblue":"blu ardesia","mediumaquamarine":"acquamarina medio","lavender":"lavanda","mediumseagreen":"verde acqua medio","maroon":"Bordeaux","darkslategray":"grigio ardesia scuro","mediumturquoise":"turchese medio","ghostwhite":"bianco gesso","darkblue":"blu scuro","mediumvioletred":"violetto rosso medio","brown":"marrone","lightgray":"grigio chiaro","sandybrown":"argilla","pink":"rosa","firebrick":"mattone","indigo":"indaco","snow":"neve","darkorchid":"orchidea scuro","turquoise":"turchese","chocolate":"cioccolato","springgreen":"verde brillante","moccasin":"mocassino","navy":"blu scuro","lemonchiffon":"lemon chiffon","teal":"verde acqua","floralwhite":"bianco grigio","cornflowerblue":"blu fiordaliso","paleturquoise":"turchese pallido","purple":"viola","gainsboro":"gainsboro","plum":"prugna","red":"rosso","blue":"blu","forestgreen":"verde pino scuro","darkgreen":"verde scuro","honeydew":"miele","darkseagreen":"verde acqua scuro","lightcoral":"corallo chiaro","palevioletred":"violetto rosso pallido","mediumpurple":"viola medio","saddlebrown":"cacao","darkmagenta":"magenta scuro","thistle":"rosa cenere","whitesmoke":"bianco fumo","wheat":"tabacco","violet":"violetto","lightskyblue":"azzurro chiaro","goldenrod":"dorato","mediumblue":"blu medio","skyblue":"azzurro","crimson":"rosso scarlatto","darksalmon":"salmone scuro","darkred":"rosso scuro","darkslategrey":"grigio ardesia scuro","peru":"perù","lightgrey":"grigio chiaro","lightgoldenrodyellow":"giallo dorato chiaro","blanchedalmond":"beige 2","aliceblue":"bianco ghiaccio","bisque":"terracotta","slategray":"grigio ardesia","palegoldenrod":"dorato pallido","darkorange":"arancione scuro","aquamarine":"acquamarina","lightgreen":"verde chiaro","burlywood":"legno massiccio","dodgerblue":"dodger blue","darkgray":"grigio scuro","lightcyan":"ciano chiaro","powderblue":"azzurro polvere","blueviolet":"violetto bluastro","orchid":"orchidea","dimgray":"grigio tenue","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosa","hotpink":"rosa acceso","steelblue":"blu brillante","tomato":"pomodoro","lightpink":"rosa chiaro","limegreen":"verde lime","indianred":"terra indiana","papayawhip":"papaya","lightslategray":"grigio ardesia chiaro","gray":"grigio","mediumorchid":"orchidea medio","cornsilk":"crema","black":"nero","seagreen":"verde acqua","darkslateblue":"blu ardesia scuro","khaki":"cachi","lightblue":"blu chiaro","palegreen":"verde pallido","azure":"azure","peachpuff":"pesche","darkolivegreen":"verde oliva scuro","yellowgreen":"giallo verde"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Scelte precedenti","nextMessage":"Altre scelte"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Annulla","buttonSave":"Salva","itemClose":"Chiudi"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_it-it.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_it-it.js.uncompressed.js new file mode 100644 index 00000000..7017f173 --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_it-it.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_it-it',{ +'dijit/form/nls/validate':{"rangeMessage":"Questo valore non è compreso nell'intervallo.","invalidMessage":"Il valore immesso non è valido.","missingMessage":"Questo valore è obbligatorio."} +, +'dijit/nls/loading':{"loadingState":"Caricamento in corso...","errorState":"Si è verificato un errore"} +, +'dojo/nls/colors':{"lightsteelblue":"blu acciaio chiaro","orangered":"vermiglio","midnightblue":"blu notte","cadetblue":"verde petrolio","seashell":"sabbia rosa","slategrey":"grigio ardesia","coral":"corallo","darkturquoise":"turchese scuro","antiquewhite":"rosa antico","mediumspringgreen":"verde brillante medio","transparent":"trasparente","salmon":"salmone","darkgrey":"grigio scuro","ivory":"avorio","greenyellow":"verde-giallo","mistyrose":"rosa pallido","lightsalmon":"salmone chiaro","silver":"argento","dimgrey":"grigio tenue","orange":"arancione","white":"bianco","navajowhite":"sabbia","royalblue":"royal blue","deeppink":"ciclamino","lime":"lime","oldlace":"mandorla","chartreuse":"verde brillante","darkcyan":"celeste scuro","yellow":"giallo","linen":"lino","olive":"verde oliva","gold":"oro","lawngreen":"verde brillante chiaro","lightyellow":"giallo chiaro","tan":"tan","darkviolet":"viola scuro","lightslategrey":"grigio ardesia chiaro","grey":"grigio","darkkhaki":"cachi scuro","green":"verde","deepskyblue":"azzurro intenso","aqua":"verde acqua","sienna":"terra di siena","mintcream":"bianco nuvola","rosybrown":"caffè latte","mediumslateblue":"blu ardesia medio","magenta":"magenta","lightseagreen":"verde acqua chiaro","cyan":"ciano","olivedrab":"verde bottiglia","darkgoldenrod":"ocra scuro","slateblue":"blu ardesia","mediumaquamarine":"acquamarina medio","lavender":"lavanda","mediumseagreen":"verde acqua medio","maroon":"Bordeaux","darkslategray":"grigio ardesia scuro","mediumturquoise":"turchese medio","ghostwhite":"bianco gesso","darkblue":"blu scuro","mediumvioletred":"violetto rosso medio","brown":"marrone","lightgray":"grigio chiaro","sandybrown":"argilla","pink":"rosa","firebrick":"mattone","indigo":"indaco","snow":"neve","darkorchid":"orchidea scuro","turquoise":"turchese","chocolate":"cioccolato","springgreen":"verde brillante","moccasin":"mocassino","navy":"blu scuro","lemonchiffon":"lemon chiffon","teal":"verde acqua","floralwhite":"bianco grigio","cornflowerblue":"blu fiordaliso","paleturquoise":"turchese pallido","purple":"viola","gainsboro":"gainsboro","plum":"prugna","red":"rosso","blue":"blu","forestgreen":"verde pino scuro","darkgreen":"verde scuro","honeydew":"miele","darkseagreen":"verde acqua scuro","lightcoral":"corallo chiaro","palevioletred":"violetto rosso pallido","mediumpurple":"viola medio","saddlebrown":"cacao","darkmagenta":"magenta scuro","thistle":"rosa cenere","whitesmoke":"bianco fumo","wheat":"tabacco","violet":"violetto","lightskyblue":"azzurro chiaro","goldenrod":"dorato","mediumblue":"blu medio","skyblue":"azzurro","crimson":"rosso scarlatto","darksalmon":"salmone scuro","darkred":"rosso scuro","darkslategrey":"grigio ardesia scuro","peru":"perù","lightgrey":"grigio chiaro","lightgoldenrodyellow":"giallo dorato chiaro","blanchedalmond":"beige 2","aliceblue":"bianco ghiaccio","bisque":"terracotta","slategray":"grigio ardesia","palegoldenrod":"dorato pallido","darkorange":"arancione scuro","aquamarine":"acquamarina","lightgreen":"verde chiaro","burlywood":"legno massiccio","dodgerblue":"dodger blue","darkgray":"grigio scuro","lightcyan":"ciano chiaro","powderblue":"azzurro polvere","blueviolet":"violetto bluastro","orchid":"orchidea","dimgray":"grigio tenue","beige":"beige","fuchsia":"fucsia","lavenderblush":"lavanda rosa","hotpink":"rosa acceso","steelblue":"blu brillante","tomato":"pomodoro","lightpink":"rosa chiaro","limegreen":"verde lime","indianred":"terra indiana","papayawhip":"papaya","lightslategray":"grigio ardesia chiaro","gray":"grigio","mediumorchid":"orchidea medio","cornsilk":"crema","black":"nero","seagreen":"verde acqua","darkslateblue":"blu ardesia scuro","khaki":"cachi","lightblue":"blu chiaro","palegreen":"verde pallido","azure":"azure","peachpuff":"pesche","darkolivegreen":"verde oliva scuro","yellowgreen":"giallo verde"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Scelte precedenti","nextMessage":"Altre scelte"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Annulla","buttonSave":"Salva","itemClose":"Chiudi"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_it.js b/lib/dojo/nls/tt-rss-layer_it.js deleted file mode 100644 index e34368d1..00000000 --- a/lib/dojo/nls/tt-rss-layer_it.js +++ /dev/null @@ -1 +0,0 @@ -dojo.provide("dojo.nls.tt-rss-layer_it");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.it");dojo.nls.colors.it={"lightsteelblue":"blu acciao chiaro","orangered":"vermiglio","midnightblue":"blu melanzana scuro","cadetblue":"verde acqua","seashell":"sabbia rosa","slategrey":"grigio ardesia","coral":"corallo","darkturquoise":"turchese scuro","antiquewhite":"bianco antico","mediumspringgreen":"verde primavera medio","salmon":"salmone","darkgrey":"grigio scuro","ivory":"avorio","greenyellow":"giallo verde","mistyrose":"rosa pallido","lightsalmon":"salmone chiaro","silver":"grigio 25%","dimgrey":"grigio 80%","orange":"arancione","white":"bianco","navajowhite":"pesca chiaro","royalblue":"blu reale","deeppink":"ciclamino","lime":"verde fluorescente","oldlace":"mandorla","chartreuse":"verde brillante","darkcyan":"ciano scuro","yellow":"giallo","linen":"lino","olive":"verde oliva","gold":"oro","lawngreen":"verde prato","lightyellow":"giallo chiaro","tan":"grigio bruno","darkviolet":"viola scuro","lightslategrey":"grigio ardesia chiaro","grey":"grigio","darkkhaki":"kaki scuro","green":"verde","deepskyblue":"azzurro cielo scuro","aqua":"acqua","sienna":"cuoio","mintcream":"bianco nuvola","rosybrown":"marrone rosato","mediumslateblue":"blu ardesia medio","magenta":"magenta","lightseagreen":"verde mare chiaro","cyan":"ciano","olivedrab":"marrone oliva","darkgoldenrod":"ocra scuro","slateblue":"blu ardesia","mediumaquamarine":"acquamarina medio","lavender":"lavanda","mediumseagreen":"verde mare medio","maroon":"scarlatto","darkslategray":"grigio ardesia scuro","mediumturquoise":"turchese medio","ghostwhite":"bianco gesso","darkblue":"blu scuro","mediumvioletred":"vinaccia","brown":"marrone","lightgray":"grigio chiaro","sandybrown":"marrone sabbia","pink":"rosa","firebrick":"rosso mattone","indigo":"indaco","snow":"neve","darkorchid":"orchidea scuro","turquoise":"turchese","chocolate":"cioccolato","springgreen":"verde primavera","moccasin":"mocassino","navy":"blu notte","lemonchiffon":"caffelatte chiaro","teal":"verde turchese","floralwhite":"bianco giglio","cornflowerblue":"blu fiordaliso","paleturquoise":"turchese pallido","purple":"porpora","gainsboro":"grigio 10%","plum":"prugna","red":"rosso","blue":"blu","forestgreen":"verde foresta","darkgreen":"verde scuro","honeydew":"bianco germoglio","darkseagreen":"verde mare scuro","lightcoral":"rosa corallo","palevioletred":"vinaccia chiaro","mediumpurple":"porpora medio","saddlebrown":"cacao","darkmagenta":"magenta scuro","thistle":"rosa cenere","whitesmoke":"bianco fumo","wheat":"sabbia","violet":"viola","lightskyblue":"azzurro cielo chiaro","goldenrod":"ocra gialla","mediumblue":"blu medio","skyblue":"azzurro cielo","crimson":"cremisi","darksalmon":"salmone scuro","darkred":"rosso scuro","darkslategrey":"grigio ardesia scuro","peru":"marrone terra bruciata","lightgrey":"grigio chiaro","lightgoldenrodyellow":"giallo tenue","blanchedalmond":"mandorla chiaro","aliceblue":"blu alice","bisque":"incarnato","slategray":"grigio ardesia","palegoldenrod":"giallo zolfo chiaro","darkorange":"arancione scuro","aquamarine":"acquamarina","lightgreen":"verde chiaro","burlywood":"tabacco","dodgerblue":"blu d'oriente","darkgray":"grigio scuro","lightcyan":"ciano chiaro","powderblue":"azzurro polvere","blueviolet":"blu violetto","orchid":"orchidea","dimgray":"grigio 80%","beige":"beige","fuchsia":"fucsia","lavenderblush":"bianco rosato","hotpink":"rosa acceso","steelblue":"blu acciao","tomato":"pomodoro","lightpink":"rosa chiaro","limegreen":"verde lime","indianred":"terra indiana","papayawhip":"cipria","lightslategray":"grigio ardesia chiaro","gray":"grigio","mediumorchid":"orchidea medio","cornsilk":"crema","black":"nero","seagreen":"verde mare","darkslateblue":"blu ardesia scuro","khaki":"kaki","lightblue":"azzurro","palegreen":"verde pallido","azure":"azzurro ghiaccio","peachpuff":"pesca","darkolivegreen":"verde oliva scuro","yellowgreen":"giallo verde"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.it");dijit.nls.loading.it={"loadingState":"Caricamento in corso...","errorState":"Si è verificato un errore"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.it");dijit.nls.common.it={"buttonOk":"OK","buttonCancel":"Annulla","buttonSave":"Salva","itemClose":"Chiudi"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.it");dijit.form.nls.validate.it={"rangeMessage":"Questo valore non è compreso nell'intervallo.","invalidMessage":"Il valore immesso non è valido.","missingMessage":"Questo valore è obbligatorio."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.it");dijit.form.nls.ComboBox.it={"previousMessage":"Scelte precedenti","nextMessage":"Altre scelte"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.it");dojo.cldr.nls.number.it={"decimalFormat":"#,##0.###","group":".","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤ #,##0.00","decimal":",","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}; diff --git a/lib/dojo/nls/tt-rss-layer_ja-jp.js b/lib/dojo/nls/tt-rss-layer_ja-jp.js index 016cf5d5..a16c85f2 100644 --- a/lib/dojo/nls/tt-rss-layer_ja-jp.js +++ b/lib/dojo/nls/tt-rss-layer_ja-jp.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_ja-jp");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ja_jp");dojo.nls.colors.ja_jp={"lightsteelblue":"ライト・スチール・ブルー","orangered":"オレンジ・レッド","midnightblue":"ミッドナイト・ブルー","cadetblue":"くすんだ青","seashell":"シーシェル","slategrey":"スレート・グレイ","coral":"珊瑚","darkturquoise":"ダーク・ターコイズ","antiquewhite":"アンティーク・ホワイト","mediumspringgreen":"ミディアム・スプリング・グリーン","salmon":"サーモン","darkgrey":"ダーク・グレイ","ivory":"アイボリー","greenyellow":"緑黄色","mistyrose":"ミスティ・ローズ","lightsalmon":"ライト・サーモン","silver":"銀","dimgrey":"くすんだグレイ","orange":"オレンジ","white":"白","navajowhite":"ナバホ・ホワイト","royalblue":"藤色","deeppink":"濃いピンク","lime":"ライム","oldlace":"オールド・レイス","chartreuse":"淡黄緑","darkcyan":"ダーク・シアン・ブルー","yellow":"黄","linen":"亜麻色","olive":"オリーブ","gold":"金","lawngreen":"ローン・グリーン","lightyellow":"ライト・イエロー","tan":"茶褐色","darkviolet":"ダーク・バイオレット","lightslategrey":"ライト・スレート・グレイ","grey":"グレイ","darkkhaki":"ダーク・カーキー","green":"緑","deepskyblue":"濃い空色","aqua":"アクア","sienna":"黄褐色","mintcream":"ミント・クリーム","rosybrown":"ロージー・ブラウン","mediumslateblue":"ミディアム・スレート・ブルー","magenta":"赤紫","lightseagreen":"ライト・シー・グリーン","cyan":"シアン・ブルー","olivedrab":"濃黄緑","darkgoldenrod":"ダーク・ゴールデン・ロッド","slateblue":"スレート・ブルー","mediumaquamarine":"ミディアム・アクアマリーン","lavender":"ラベンダー","mediumseagreen":"ミディアム・シー・グリーン","maroon":"えび茶","darkslategray":"ダーク・スレート・グレイ","mediumturquoise":"ミディアム・ターコイズ","ghostwhite":"ゴースト・ホワイト","darkblue":"ダーク・ブルー","mediumvioletred":"ミディアム・バイオレット・レッド","brown":"茶","lightgray":"ライト・グレイ","sandybrown":"砂褐色","pink":"ピンク","firebrick":"赤煉瓦色","indigo":"藍色","snow":"雪色","darkorchid":"ダーク・オーキッド","turquoise":"ターコイズ","chocolate":"チョコレート","springgreen":"スプリング・グリーン","moccasin":"モカシン","navy":"濃紺","lemonchiffon":"レモン・シフォン","teal":"ティール","floralwhite":"フローラル・ホワイト","cornflowerblue":"コーンフラワー・ブルー","paleturquoise":"ペイル・ターコイズ","purple":"ç´«","gainsboro":"ゲインズボーロ","plum":"深紫","red":"赤","blue":"青","forestgreen":"フォレスト・グリーン","darkgreen":"ダーク・グリーン","honeydew":"ハニーデュー","darkseagreen":"ダーク・シー・グリーン","lightcoral":"ライト・コーラル","palevioletred":"ペイル・バイオレット・レッド","mediumpurple":"ミディアム・パープル","saddlebrown":"サドル・ブラウン","darkmagenta":"ダーク・マジェンタ","thistle":"シスル","whitesmoke":"ホワイト・スモーク","wheat":"小麦色","violet":"すみれ色","lightskyblue":"ライト・スカイ・ブルー","goldenrod":"ゴールデン・ロッド","mediumblue":"ミディアム・ブルー","skyblue":"スカイ・ブルー","crimson":"深紅","darksalmon":"ダーク・サーモン","darkred":"ダーク・レッド","darkslategrey":"ダーク・スレート・グレイ","peru":"ペルー","lightgrey":"ライト・グレイ","lightgoldenrodyellow":"ライト・ゴールデン・ロッド・イエロー","blanchedalmond":"皮なしアーモンド","aliceblue":"アリス・ブルー","bisque":"ビスク","slategray":"スレート・グレイ","palegoldenrod":"ペイル・ゴールデン・ロッド","darkorange":"ダーク・オレンジ","aquamarine":"碧緑","lightgreen":"ライト・グリーン","burlywood":"バーリーウッド","dodgerblue":"ドッジャー・ブルー","darkgray":"ダーク・グレイ","lightcyan":"ライト・シアン","powderblue":"淡青","blueviolet":"青紫","orchid":"薄紫","dimgray":"くすんだグレイ","beige":"ベージュ","fuchsia":"紫紅色","lavenderblush":"ラベンダー・ブラッシ","hotpink":"ホット・ピンク","steelblue":"鋼色","tomato":"トマト色","lightpink":"ライト・ピンク","limegreen":"ライム・グリーン","indianred":"インディアン・レッド","papayawhip":"パパイア・ホイップ","lightslategray":"ライト・スレート・グレイ","gray":"グレイ","mediumorchid":"ミディアム・オーキッド","cornsilk":"コーンシルク","black":"黒","seagreen":"シー・グリーン","darkslateblue":"ダーク・スレート・ブルー","khaki":"カーキー","lightblue":"ライト・ブルー","palegreen":"ペイル・グリーン","azure":"薄い空色","peachpuff":"ピーチ・パフ","darkolivegreen":"ダーク・オリーブ・グリーン","yellowgreen":"黄緑"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ja_jp");dijit.nls.loading.ja_jp={"loadingState":"ロード中...","errorState":"エラーが発生しました。"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ja_jp");dijit.nls.common.ja_jp={"buttonOk":"OK","buttonCancel":"キャンセル","buttonSave":"保存","itemClose":"閉じる"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ja_jp");dijit.form.nls.validate.ja_jp={"rangeMessage":"この値は範囲外です。","invalidMessage":"入力した値は無効です。","missingMessage":"この値は必須です。"};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ja_jp");dijit.form.nls.ComboBox.ja_jp={"previousMessage":"以前の選択項目","nextMessage":"追加の選択項目"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ja_jp");dojo.cldr.nls.number.ja_jp={"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_ja-jp",{"dijit/form/nls/validate":{"rangeMessage":"この値は範囲外です。","invalidMessage":"入力した値は無効です。","missingMessage":"この値は必須です。"},"dijit/nls/loading":{"loadingState":"ロード中...","errorState":"エラーが発生しました。"},"dojo/nls/colors":{"lightsteelblue":"ライトスチールブルー","orangered":"オレンジレッド","midnightblue":"ミッドナイトブルー","cadetblue":"くすんだ青","seashell":"シーシェル","slategrey":"スレートグレイ","coral":"珊瑚","darkturquoise":"ダークターコイズ","antiquewhite":"アンティークホワイト","mediumspringgreen":"ミディアムスプリンググリーン","transparent":"透明","salmon":"サーモン","darkgrey":"ダークグレイ","ivory":"アイボリー","greenyellow":"緑黄色","mistyrose":"ミスティローズ","lightsalmon":"ライトサーモン","silver":"銀","dimgrey":"くすんだグレイ","orange":"オレンジ","white":"白","navajowhite":"ナバホホワイト","royalblue":"藤色","deeppink":"濃いピンク","lime":"ライム","oldlace":"オールドレイス","chartreuse":"淡黄緑","darkcyan":"ダークシアンブルー","yellow":"黄","linen":"亜麻色","olive":"オリーブ","gold":"金","lawngreen":"ローングリーン","lightyellow":"ライトイエロー","tan":"茶褐色","darkviolet":"ダークバイオレット","lightslategrey":"ライトスレートグレイ","grey":"グレイ","darkkhaki":"ダークカーキ","green":"緑","deepskyblue":"濃い空色","aqua":"アクア","sienna":"黄褐色","mintcream":"ミントクリーム","rosybrown":"ロージーブラウン","mediumslateblue":"ミディアムスレートブルー","magenta":"赤紫","lightseagreen":"ライトシーグリーン","cyan":"シアンブルー","olivedrab":"濃黄緑","darkgoldenrod":"ダークゴールデンロッド","slateblue":"スレートブルー","mediumaquamarine":"ミディアムアクアマリーン","lavender":"ラベンダー","mediumseagreen":"ミディアムシーグリーン","maroon":"えび茶","darkslategray":"ダークスレートグレイ","mediumturquoise":"ミディアムターコイズ","ghostwhite":"ゴーストホワイト","darkblue":"ダークブルー","mediumvioletred":"ミディアムバイオレットレッド","brown":"茶","lightgray":"ライトグレイ","sandybrown":"砂褐色","pink":"ピンク","firebrick":"赤煉瓦色","indigo":"藍色","snow":"雪色","darkorchid":"ダークオーキッド","turquoise":"ターコイズ","chocolate":"チョコレート","springgreen":"スプリンググリーン","moccasin":"モカシン","navy":"濃紺","lemonchiffon":"レモンシフォン","teal":"ティール","floralwhite":"フローラルホワイト","cornflowerblue":"コーンフラワーブルー","paleturquoise":"ペイルターコイズ","purple":"ç´«","gainsboro":"ゲインズボーロ","plum":"深紫","red":"赤","blue":"青","forestgreen":"フォレストグリーン","darkgreen":"ダークグリーン","honeydew":"ハニーデュー","darkseagreen":"ダークシーグリーン","lightcoral":"ライトコーラル","palevioletred":"ペイルバイオレットレッド","mediumpurple":"ミディアムパープル","saddlebrown":"サドルブラウン","darkmagenta":"ダークマジェンタ","thistle":"シスル","whitesmoke":"ホワイトスモーク","wheat":"小麦色","violet":"すみれ色","lightskyblue":"ライトスカイブルー","goldenrod":"ゴールデンロッド","mediumblue":"ミディアムブルー","skyblue":"スカイブルー","crimson":"深紅","darksalmon":"ダークサーモン","darkred":"ダークレッド","darkslategrey":"ダークスレートグレイ","peru":"ペルー","lightgrey":"ライトグレイ","lightgoldenrodyellow":"ライトゴールデンロッドイエロー","blanchedalmond":"皮なしアーモンド","aliceblue":"アリスブルー","bisque":"ビスク","slategray":"スレートグレイ","palegoldenrod":"ペイルゴールデンロッド","darkorange":"ダークオレンジ","aquamarine":"碧緑","lightgreen":"ライトグリーン","burlywood":"バーリーウッド","dodgerblue":"ドッジャーブルー","darkgray":"ダークグレイ","lightcyan":"ライトシアン","powderblue":"淡青","blueviolet":"青紫","orchid":"薄紫","dimgray":"くすんだグレイ","beige":"ベージュ","fuchsia":"紫紅色","lavenderblush":"ラベンダーブラッシ","hotpink":"ホットピンク","steelblue":"鋼色","tomato":"トマト色","lightpink":"ライトピンク","limegreen":"ライムグリーン","indianred":"インディアンレッド","papayawhip":"パパイアホイップ","lightslategray":"ライトスレートグレイ","gray":"グレイ","mediumorchid":"ミディアムオーキッド","cornsilk":"コーンシルク","black":"黒","seagreen":"シーグリーン","darkslateblue":"ダークスレートブルー","khaki":"カーキ","lightblue":"ライトブルー","palegreen":"ペイルグリーン","azure":"薄い空色","peachpuff":"ピーチパフ","darkolivegreen":"ダークオリーブグリーン","yellowgreen":"黄緑"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"以前の選択項目","nextMessage":"追加の選択項目"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"キャンセル","buttonSave":"保存","itemClose":"閉じる"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_ja-jp.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_ja-jp.js.uncompressed.js new file mode 100644 index 00000000..8b0a245e --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_ja-jp.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_ja-jp',{ +'dijit/form/nls/validate':{"rangeMessage":"この値は範囲外です。","invalidMessage":"入力した値は無効です。","missingMessage":"この値は必須です。"} +, +'dijit/nls/loading':{"loadingState":"ロード中...","errorState":"エラーが発生しました。"} +, +'dojo/nls/colors':{"lightsteelblue":"ライトスチールブルー","orangered":"オレンジレッド","midnightblue":"ミッドナイトブルー","cadetblue":"くすんだ青","seashell":"シーシェル","slategrey":"スレートグレイ","coral":"珊瑚","darkturquoise":"ダークターコイズ","antiquewhite":"アンティークホワイト","mediumspringgreen":"ミディアムスプリンググリーン","transparent":"透明","salmon":"サーモン","darkgrey":"ダークグレイ","ivory":"アイボリー","greenyellow":"緑黄色","mistyrose":"ミスティローズ","lightsalmon":"ライトサーモン","silver":"銀","dimgrey":"くすんだグレイ","orange":"オレンジ","white":"白","navajowhite":"ナバホホワイト","royalblue":"藤色","deeppink":"濃いピンク","lime":"ライム","oldlace":"オールドレイス","chartreuse":"淡黄緑","darkcyan":"ダークシアンブルー","yellow":"黄","linen":"亜麻色","olive":"オリーブ","gold":"金","lawngreen":"ローングリーン","lightyellow":"ライトイエロー","tan":"茶褐色","darkviolet":"ダークバイオレット","lightslategrey":"ライトスレートグレイ","grey":"グレイ","darkkhaki":"ダークカーキ","green":"緑","deepskyblue":"濃い空色","aqua":"アクア","sienna":"黄褐色","mintcream":"ミントクリーム","rosybrown":"ロージーブラウン","mediumslateblue":"ミディアムスレートブルー","magenta":"赤紫","lightseagreen":"ライトシーグリーン","cyan":"シアンブルー","olivedrab":"濃黄緑","darkgoldenrod":"ダークゴールデンロッド","slateblue":"スレートブルー","mediumaquamarine":"ミディアムアクアマリーン","lavender":"ラベンダー","mediumseagreen":"ミディアムシーグリーン","maroon":"えび茶","darkslategray":"ダークスレートグレイ","mediumturquoise":"ミディアムターコイズ","ghostwhite":"ゴーストホワイト","darkblue":"ダークブルー","mediumvioletred":"ミディアムバイオレットレッド","brown":"茶","lightgray":"ライトグレイ","sandybrown":"砂褐色","pink":"ピンク","firebrick":"赤煉瓦色","indigo":"藍色","snow":"雪色","darkorchid":"ダークオーキッド","turquoise":"ターコイズ","chocolate":"チョコレート","springgreen":"スプリンググリーン","moccasin":"モカシン","navy":"濃紺","lemonchiffon":"レモンシフォン","teal":"ティール","floralwhite":"フローラルホワイト","cornflowerblue":"コーンフラワーブルー","paleturquoise":"ペイルターコイズ","purple":"ç´«","gainsboro":"ゲインズボーロ","plum":"深紫","red":"赤","blue":"青","forestgreen":"フォレストグリーン","darkgreen":"ダークグリーン","honeydew":"ハニーデュー","darkseagreen":"ダークシーグリーン","lightcoral":"ライトコーラル","palevioletred":"ペイルバイオレットレッド","mediumpurple":"ミディアムパープル","saddlebrown":"サドルブラウン","darkmagenta":"ダークマジェンタ","thistle":"シスル","whitesmoke":"ホワイトスモーク","wheat":"小麦色","violet":"すみれ色","lightskyblue":"ライトスカイブルー","goldenrod":"ゴールデンロッド","mediumblue":"ミディアムブルー","skyblue":"スカイブルー","crimson":"深紅","darksalmon":"ダークサーモン","darkred":"ダークレッド","darkslategrey":"ダークスレートグレイ","peru":"ペルー","lightgrey":"ライトグレイ","lightgoldenrodyellow":"ライトゴールデンロッドイエロー","blanchedalmond":"皮なしアーモンド","aliceblue":"アリスブルー","bisque":"ビスク","slategray":"スレートグレイ","palegoldenrod":"ペイルゴールデンロッド","darkorange":"ダークオレンジ","aquamarine":"碧緑","lightgreen":"ライトグリーン","burlywood":"バーリーウッド","dodgerblue":"ドッジャーブルー","darkgray":"ダークグレイ","lightcyan":"ライトシアン","powderblue":"淡青","blueviolet":"青紫","orchid":"薄紫","dimgray":"くすんだグレイ","beige":"ベージュ","fuchsia":"紫紅色","lavenderblush":"ラベンダーブラッシ","hotpink":"ホットピンク","steelblue":"鋼色","tomato":"トマト色","lightpink":"ライトピンク","limegreen":"ライムグリーン","indianred":"インディアンレッド","papayawhip":"パパイアホイップ","lightslategray":"ライトスレートグレイ","gray":"グレイ","mediumorchid":"ミディアムオーキッド","cornsilk":"コーンシルク","black":"黒","seagreen":"シーグリーン","darkslateblue":"ダークスレートブルー","khaki":"カーキ","lightblue":"ライトブルー","palegreen":"ペイルグリーン","azure":"薄い空色","peachpuff":"ピーチパフ","darkolivegreen":"ダークオリーブグリーン","yellowgreen":"黄緑"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"以前の選択項目","nextMessage":"追加の選択項目"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"キャンセル","buttonSave":"保存","itemClose":"閉じる"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_ja.js b/lib/dojo/nls/tt-rss-layer_ja.js deleted file mode 100644 index 13da053d..00000000 --- a/lib/dojo/nls/tt-rss-layer_ja.js +++ /dev/null @@ -1 +0,0 @@ -dojo.provide("dojo.nls.tt-rss-layer_ja");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ja");dojo.nls.colors.ja={"lightsteelblue":"ライト・スチール・ブルー","orangered":"オレンジ・レッド","midnightblue":"ミッドナイト・ブルー","cadetblue":"くすんだ青","seashell":"シーシェル","slategrey":"スレート・グレイ","coral":"珊瑚","darkturquoise":"ダーク・ターコイズ","antiquewhite":"アンティーク・ホワイト","mediumspringgreen":"ミディアム・スプリング・グリーン","salmon":"サーモン","darkgrey":"ダーク・グレイ","ivory":"アイボリー","greenyellow":"緑黄色","mistyrose":"ミスティ・ローズ","lightsalmon":"ライト・サーモン","silver":"銀","dimgrey":"くすんだグレイ","orange":"オレンジ","white":"白","navajowhite":"ナバホ・ホワイト","royalblue":"藤色","deeppink":"濃いピンク","lime":"ライム","oldlace":"オールド・レイス","chartreuse":"淡黄緑","darkcyan":"ダーク・シアン・ブルー","yellow":"黄","linen":"亜麻色","olive":"オリーブ","gold":"金","lawngreen":"ローン・グリーン","lightyellow":"ライト・イエロー","tan":"茶褐色","darkviolet":"ダーク・バイオレット","lightslategrey":"ライト・スレート・グレイ","grey":"グレイ","darkkhaki":"ダーク・カーキー","green":"緑","deepskyblue":"濃い空色","aqua":"アクア","sienna":"黄褐色","mintcream":"ミント・クリーム","rosybrown":"ロージー・ブラウン","mediumslateblue":"ミディアム・スレート・ブルー","magenta":"赤紫","lightseagreen":"ライト・シー・グリーン","cyan":"シアン・ブルー","olivedrab":"濃黄緑","darkgoldenrod":"ダーク・ゴールデン・ロッド","slateblue":"スレート・ブルー","mediumaquamarine":"ミディアム・アクアマリーン","lavender":"ラベンダー","mediumseagreen":"ミディアム・シー・グリーン","maroon":"えび茶","darkslategray":"ダーク・スレート・グレイ","mediumturquoise":"ミディアム・ターコイズ","ghostwhite":"ゴースト・ホワイト","darkblue":"ダーク・ブルー","mediumvioletred":"ミディアム・バイオレット・レッド","brown":"茶","lightgray":"ライト・グレイ","sandybrown":"砂褐色","pink":"ピンク","firebrick":"赤煉瓦色","indigo":"藍色","snow":"雪色","darkorchid":"ダーク・オーキッド","turquoise":"ターコイズ","chocolate":"チョコレート","springgreen":"スプリング・グリーン","moccasin":"モカシン","navy":"濃紺","lemonchiffon":"レモン・シフォン","teal":"ティール","floralwhite":"フローラル・ホワイト","cornflowerblue":"コーンフラワー・ブルー","paleturquoise":"ペイル・ターコイズ","purple":"ç´«","gainsboro":"ゲインズボーロ","plum":"深紫","red":"赤","blue":"青","forestgreen":"フォレスト・グリーン","darkgreen":"ダーク・グリーン","honeydew":"ハニーデュー","darkseagreen":"ダーク・シー・グリーン","lightcoral":"ライト・コーラル","palevioletred":"ペイル・バイオレット・レッド","mediumpurple":"ミディアム・パープル","saddlebrown":"サドル・ブラウン","darkmagenta":"ダーク・マジェンタ","thistle":"シスル","whitesmoke":"ホワイト・スモーク","wheat":"小麦色","violet":"すみれ色","lightskyblue":"ライト・スカイ・ブルー","goldenrod":"ゴールデン・ロッド","mediumblue":"ミディアム・ブルー","skyblue":"スカイ・ブルー","crimson":"深紅","darksalmon":"ダーク・サーモン","darkred":"ダーク・レッド","darkslategrey":"ダーク・スレート・グレイ","peru":"ペルー","lightgrey":"ライト・グレイ","lightgoldenrodyellow":"ライト・ゴールデン・ロッド・イエロー","blanchedalmond":"皮なしアーモンド","aliceblue":"アリス・ブルー","bisque":"ビスク","slategray":"スレート・グレイ","palegoldenrod":"ペイル・ゴールデン・ロッド","darkorange":"ダーク・オレンジ","aquamarine":"碧緑","lightgreen":"ライト・グリーン","burlywood":"バーリーウッド","dodgerblue":"ドッジャー・ブルー","darkgray":"ダーク・グレイ","lightcyan":"ライト・シアン","powderblue":"淡青","blueviolet":"青紫","orchid":"薄紫","dimgray":"くすんだグレイ","beige":"ベージュ","fuchsia":"紫紅色","lavenderblush":"ラベンダー・ブラッシ","hotpink":"ホット・ピンク","steelblue":"鋼色","tomato":"トマト色","lightpink":"ライト・ピンク","limegreen":"ライム・グリーン","indianred":"インディアン・レッド","papayawhip":"パパイア・ホイップ","lightslategray":"ライト・スレート・グレイ","gray":"グレイ","mediumorchid":"ミディアム・オーキッド","cornsilk":"コーンシルク","black":"黒","seagreen":"シー・グリーン","darkslateblue":"ダーク・スレート・ブルー","khaki":"カーキー","lightblue":"ライト・ブルー","palegreen":"ペイル・グリーン","azure":"薄い空色","peachpuff":"ピーチ・パフ","darkolivegreen":"ダーク・オリーブ・グリーン","yellowgreen":"黄緑"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ja");dijit.nls.loading.ja={"loadingState":"ロード中...","errorState":"エラーが発生しました。"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ja");dijit.nls.common.ja={"buttonOk":"OK","buttonCancel":"キャンセル","buttonSave":"保存","itemClose":"閉じる"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ja");dijit.form.nls.validate.ja={"rangeMessage":"この値は範囲外です。","invalidMessage":"入力した値は無効です。","missingMessage":"この値は必須です。"};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ja");dijit.form.nls.ComboBox.ja={"previousMessage":"以前の選択項目","nextMessage":"追加の選択項目"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ja");dojo.cldr.nls.number.ja={"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}; diff --git a/lib/dojo/nls/tt-rss-layer_ko-kr.js b/lib/dojo/nls/tt-rss-layer_ko-kr.js index 36e6ab5b..80f3f6b6 100644 --- a/lib/dojo/nls/tt-rss-layer_ko-kr.js +++ b/lib/dojo/nls/tt-rss-layer_ko-kr.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_ko-kr");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ko_kr");dojo.nls.colors.ko_kr={"lightsteelblue":"라이트 스틸 블루(light steel blue)","orangered":"오렌지 레드(orange red)","midnightblue":"미드나잇 블루(midnight blue)","cadetblue":"카뎃 블루(cadet blue)","seashell":"씨쉘(seashell)","slategrey":"슬레이트 그레이(slate gray)","coral":"코랄(coral)","darkturquoise":"다크 터콰즈(dark turquoise)","antiquewhite":"앤틱 화이트(antique white)","mediumspringgreen":"미디엄 스프링 그린(medium spring green)","salmon":"샐몬(salmon)","darkgrey":"다크 그레이(dark gray)","ivory":"아이보리(ivory)","greenyellow":"그린 옐로우(green-yellow)","mistyrose":"미스티 로즈(misty rose)","lightsalmon":"라이트 샐몬(light salmon)","silver":"실버(silver)","dimgrey":"딤 그레이(dim gray)","orange":"오렌지(orange)","white":"화이트(white)","navajowhite":"나바호 화이트(navajo white)","royalblue":"로얄 블루(royal blue)","deeppink":"딥 핑크(deep pink)","lime":"라임(lime)","oldlace":"올드 레이스(old lace)","chartreuse":"샤르트뢰즈(chartreuse)","darkcyan":"다크 시안(dark cyan)","yellow":"옐로우(yellow)","linen":"리넨(linen)","olive":"올리브(olive)","gold":"골드(gold)","lawngreen":"ë¡  그린(lawn green)","lightyellow":"라이트 옐로우(light yellow)","tan":"탠(tan)","darkviolet":"다크 바이올렛(dark violet)","lightslategrey":"라이트 슬레이트 그레이(light slate gray)","grey":"그레이(gray)","darkkhaki":"다크 카키(dark khaki)","green":"그린(green)","deepskyblue":"딥 스카이 블루(deep sky blue)","aqua":"아쿠아(aqua)","sienna":"시에나(sienna)","mintcream":"민트 크림(mint cream)","rosybrown":"로지 브라운(rosy brown)","mediumslateblue":"미디엄 슬레이트 블루(medium slate blue)","magenta":"마젠타(magenta)","lightseagreen":"라이트 씨 그린(light sea green)","cyan":"시안(cyan)","olivedrab":"올리브 드랩(olive drab)","darkgoldenrod":"다크 골든로드(dark goldenrod)","slateblue":"슬레이트 블루(slate blue)","mediumaquamarine":"미디엄 아쿠아마린(medium aquamarine)","lavender":"라벤더(lavender)","mediumseagreen":"미디엄 씨 그린(medium sea green)","maroon":"마룬(maroon)","darkslategray":"다크 슬레이트 그레이(dark slate gray)","mediumturquoise":"미디엄 터콰즈(medium turquoise)","ghostwhite":"고스트 화이트(ghost white)","darkblue":"다크 블루(dark blue)","mediumvioletred":"미디엄 바이올렛 레드(medium violet-red)","brown":"브라운(brown)","lightgray":"라이트 그레이(light gray)","sandybrown":"샌디 브라운(sandy brown)","pink":"핑크(pink)","firebrick":"파이어 브릭(fire brick)","indigo":"인디고(indigo)","snow":"스노우(snow)","darkorchid":"다크 오키드(dark orchid)","turquoise":"터콰즈(turquoise)","chocolate":"초콜렛(chocolate)","springgreen":"스프링 그린(spring green)","moccasin":"모카신(moccasin)","navy":"네이비(navy)","lemonchiffon":"레몬 쉬폰(lemon chiffon)","teal":"틸(teal)","floralwhite":"플로랄 화이트(floral white)","cornflowerblue":"콘플라워 블루(cornflower blue)","paleturquoise":"페일 터콰즈(pale turquoise)","purple":"퍼플(purple)","gainsboro":"게인스브로(gainsboro)","plum":"플럼(plum)","red":"레드(red)","blue":"블루(blue)","forestgreen":"포레스트 그린(forest green)","darkgreen":"다크 그린(dark green)","honeydew":"허니듀(honeydew)","darkseagreen":"다크 씨 그린(dark sea green)","lightcoral":"라이트 코랄(light coral)","palevioletred":"페일 바이올렛 레드(pale violet-red)","mediumpurple":"미디엄 퍼플(medium purple)","saddlebrown":"새들 브라운(saddle brown)","darkmagenta":"다크 마젠타(dark magenta)","thistle":"시슬(thistle)","whitesmoke":"화이트 스모크(white smoke)","wheat":"휘트(wheat)","violet":"바이올렛(violet)","lightskyblue":"라이트 스카이 블루(light sky blue)","goldenrod":"골든로드(goldenrod)","mediumblue":"미디엄 블루(medium blue)","skyblue":"스카이 블루(sky blue)","crimson":"크림슨(crimson)","darksalmon":"다크 샐몬(dark salmon)","darkred":"다크 레드(dark red)","darkslategrey":"다크 슬레이트 그레이(dark slate gray)","peru":"페루(peru)","lightgrey":"라이트 그레이(light gray)","lightgoldenrodyellow":"라이트 골든로드 옐로우(light goldenrod yellow)","blanchedalmond":"블랜치 아몬드(blanched almond)","aliceblue":"앨리스 블루(alice blue)","bisque":"비스크(bisque)","slategray":"슬레이트 그레이(slate gray)","palegoldenrod":"페일 골든로드(pale goldenrod)","darkorange":"다크 오렌지(dark orange)","aquamarine":"아쿠아마린(aquamarine)","lightgreen":"라이트 그린(light green)","burlywood":"벌리우드(burlywood)","dodgerblue":"다저 블루(dodger blue)","darkgray":"다크 그레이(dark gray)","lightcyan":"라이트 시안(light cyan)","powderblue":"파우더 블루(powder blue)","blueviolet":"블루 바이올렛(blue-violet)","orchid":"오키드(orchid)","dimgray":"딤 그레이(dim gray)","beige":"베이지(beige)","fuchsia":"후크샤(fuchsia)","lavenderblush":"라벤더 블러쉬(lavender blush)","hotpink":"핫 핑크(hot pink)","steelblue":"스틸 블루(steel blue)","tomato":"토마토(tomato)","lightpink":"라이트 핑크(light pink)","limegreen":"라임 그린(lime green)","indianred":"인디안 레드(indian red)","papayawhip":"파파야 휩(papaya whip)","lightslategray":"라이트 슬레이트 그레이(light slate gray)","gray":"그레이(gray)","mediumorchid":"미디엄 오키드(medium orchid)","cornsilk":"콘실크(cornsilk)","black":"블랙(black)","seagreen":"씨 그린(sea green)","darkslateblue":"다크 슬레이트 블루(dark slate blue)","khaki":"카키(khaki)","lightblue":"라이트 블루(light blue)","palegreen":"페일 그린(pale green)","azure":"애쥬어(azure)","peachpuff":"피치 퍼프(peach puff)","darkolivegreen":"다크 올리브 그린(dark olive green)","yellowgreen":"옐로우 그린(yellow green)"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ko_kr");dijit.nls.loading.ko_kr={"loadingState":"로드 중...","errorState":"죄송합니다. 오류가 발생했습니다."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ko_kr");dijit.nls.common.ko_kr={"buttonOk":"확인","buttonCancel":"취소","buttonSave":"저장","itemClose":"닫기"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ko_kr");dijit.form.nls.validate.ko_kr={"rangeMessage":"이 값은 범위를 벗어납니다.","invalidMessage":"입력된 값이 올바르지 않습니다.","missingMessage":"이 값은 필수입니다."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ko_kr");dijit.form.nls.ComboBox.ko_kr={"previousMessage":"이전 선택사항","nextMessage":"기타 선택사항"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ko_kr");dojo.cldr.nls.number.ko_kr={"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_ko-kr",{"dijit/form/nls/validate":{"rangeMessage":"이 값은 범위를 벗어납니다.","invalidMessage":"입력된 값이 올바르지 않습니다.","missingMessage":"이 값은 필수입니다."},"dijit/nls/loading":{"loadingState":"로드 중...","errorState":"죄송합니다. 오류가 발생했습니다."},"dojo/nls/colors":{"lightsteelblue":"라이트 스틸 블루(light steel blue)","orangered":"오렌지 레드(orange red)","midnightblue":"미드나잇 블루(midnight blue)","cadetblue":"카뎃 블루(cadet blue)","seashell":"씨쉘(seashell)","slategrey":"슬레이트 그레이(slate gray)","coral":"코랄(coral)","darkturquoise":"다크 터콰즈(dark turquoise)","antiquewhite":"앤틱 화이트(antique white)","mediumspringgreen":"미디엄 스프링 그린(medium spring green)","transparent":"투명(transparent)","salmon":"샐몬(salmon)","darkgrey":"다크 그레이(dark gray)","ivory":"아이보리(ivory)","greenyellow":"그린 옐로우(green-yellow)","mistyrose":"미스티 로즈(misty rose)","lightsalmon":"라이트 샐몬(light salmon)","silver":"실버(silver)","dimgrey":"딤 그레이(dim gray)","orange":"오렌지(orange)","white":"화이트(white)","navajowhite":"나바호 화이트(navajo white)","royalblue":"로얄 블루(royal blue)","deeppink":"딥 핑크(deep pink)","lime":"라임(lime)","oldlace":"올드 레이스(old lace)","chartreuse":"샤르트뢰즈(chartreuse)","darkcyan":"다크 시안(dark cyan)","yellow":"옐로우(yellow)","linen":"리넨(linen)","olive":"올리브(olive)","gold":"골드(gold)","lawngreen":"ë¡  그린(lawn green)","lightyellow":"라이트 옐로우(light yellow)","tan":"탠(tan)","darkviolet":"다크 바이올렛(dark violet)","lightslategrey":"라이트 슬레이트 그레이(light slate gray)","grey":"그레이(gray)","darkkhaki":"다크 카키(dark khaki)","green":"그린(green)","deepskyblue":"딥 스카이 블루(deep sky blue)","aqua":"아쿠아(aqua)","sienna":"시에나(sienna)","mintcream":"민트 크림(mint cream)","rosybrown":"로지 브라운(rosy brown)","mediumslateblue":"미디엄 슬레이트 블루(medium slate blue)","magenta":"마젠타(magenta)","lightseagreen":"라이트 씨 그린(light sea green)","cyan":"시안(cyan)","olivedrab":"올리브 드랩(olive drab)","darkgoldenrod":"다크 골든로드(dark goldenrod)","slateblue":"슬레이트 블루(slate blue)","mediumaquamarine":"미디엄 아쿠아마린(medium aquamarine)","lavender":"라벤더(lavender)","mediumseagreen":"미디엄 씨 그린(medium sea green)","maroon":"마룬(maroon)","darkslategray":"다크 슬레이트 그레이(dark slate gray)","mediumturquoise":"미디엄 터콰즈(medium turquoise)","ghostwhite":"고스트 화이트(ghost white)","darkblue":"다크 블루(dark blue)","mediumvioletred":"미디엄 바이올렛 레드(medium violet-red)","brown":"브라운(brown)","lightgray":"라이트 그레이(light gray)","sandybrown":"샌디 브라운(sandy brown)","pink":"핑크(pink)","firebrick":"파이어 브릭(fire brick)","indigo":"인디고(indigo)","snow":"스노우(snow)","darkorchid":"다크 오키드(dark orchid)","turquoise":"터콰즈(turquoise)","chocolate":"초콜렛(chocolate)","springgreen":"스프링 그린(spring green)","moccasin":"모카신(moccasin)","navy":"네이비(navy)","lemonchiffon":"레몬 쉬폰(lemon chiffon)","teal":"틸(teal)","floralwhite":"플로랄 화이트(floral white)","cornflowerblue":"콘플라워 블루(cornflower blue)","paleturquoise":"페일 터콰즈(pale turquoise)","purple":"퍼플(purple)","gainsboro":"게인스브로(gainsboro)","plum":"플럼(plum)","red":"레드(red)","blue":"블루(blue)","forestgreen":"포레스트 그린(forest green)","darkgreen":"다크 그린(dark green)","honeydew":"허니듀(honeydew)","darkseagreen":"다크 씨 그린(dark sea green)","lightcoral":"라이트 코랄(light coral)","palevioletred":"페일 바이올렛 레드(pale violet-red)","mediumpurple":"미디엄 퍼플(medium purple)","saddlebrown":"새들 브라운(saddle brown)","darkmagenta":"다크 마젠타(dark magenta)","thistle":"시슬(thistle)","whitesmoke":"화이트 스모크(white smoke)","wheat":"휘트(wheat)","violet":"바이올렛(violet)","lightskyblue":"라이트 스카이 블루(light sky blue)","goldenrod":"골든로드(goldenrod)","mediumblue":"미디엄 블루(medium blue)","skyblue":"스카이 블루(sky blue)","crimson":"크림슨(crimson)","darksalmon":"다크 샐몬(dark salmon)","darkred":"다크 레드(dark red)","darkslategrey":"다크 슬레이트 그레이(dark slate gray)","peru":"페루(peru)","lightgrey":"라이트 그레이(light gray)","lightgoldenrodyellow":"라이트 골든로드 옐로우(light goldenrod yellow)","blanchedalmond":"블랜치 아몬드(blanched almond)","aliceblue":"앨리스 블루(alice blue)","bisque":"비스크(bisque)","slategray":"슬레이트 그레이(slate gray)","palegoldenrod":"페일 골든로드(pale goldenrod)","darkorange":"다크 오렌지(dark orange)","aquamarine":"아쿠아마린(aquamarine)","lightgreen":"라이트 그린(light green)","burlywood":"벌리우드(burlywood)","dodgerblue":"다저 블루(dodger blue)","darkgray":"다크 그레이(dark gray)","lightcyan":"라이트 시안(light cyan)","powderblue":"파우더 블루(powder blue)","blueviolet":"블루 바이올렛(blue-violet)","orchid":"오키드(orchid)","dimgray":"딤 그레이(dim gray)","beige":"베이지(beige)","fuchsia":"후크샤(fuchsia)","lavenderblush":"라벤더 블러쉬(lavender blush)","hotpink":"핫 핑크(hot pink)","steelblue":"스틸 블루(steel blue)","tomato":"토마토(tomato)","lightpink":"라이트 핑크(light pink)","limegreen":"라임 그린(lime green)","indianred":"인디안 레드(indian red)","papayawhip":"파파야 휩(papaya whip)","lightslategray":"라이트 슬레이트 그레이(light slate gray)","gray":"그레이(gray)","mediumorchid":"미디엄 오키드(medium orchid)","cornsilk":"콘실크(cornsilk)","black":"블랙(black)","seagreen":"씨 그린(sea green)","darkslateblue":"다크 슬레이트 블루(dark slate blue)","khaki":"카키(khaki)","lightblue":"라이트 블루(light blue)","palegreen":"페일 그린(pale green)","azure":"애쥬어(azure)","peachpuff":"피치 퍼프(peach puff)","darkolivegreen":"다크 올리브 그린(dark olive green)","yellowgreen":"옐로우 그린(yellow green)"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"이전 선택사항","nextMessage":"기타 선택사항"},"dijit/nls/common":{"buttonOk":"확인","buttonCancel":"취소","buttonSave":"저장","itemClose":"닫기"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_ko-kr.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_ko-kr.js.uncompressed.js new file mode 100644 index 00000000..5a48e4db --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_ko-kr.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_ko-kr',{ +'dijit/form/nls/validate':{"rangeMessage":"이 값은 범위를 벗어납니다.","invalidMessage":"입력된 값이 올바르지 않습니다.","missingMessage":"이 값은 필수입니다."} +, +'dijit/nls/loading':{"loadingState":"로드 중...","errorState":"죄송합니다. 오류가 발생했습니다."} +, +'dojo/nls/colors':{"lightsteelblue":"라이트 스틸 블루(light steel blue)","orangered":"오렌지 레드(orange red)","midnightblue":"미드나잇 블루(midnight blue)","cadetblue":"카뎃 블루(cadet blue)","seashell":"씨쉘(seashell)","slategrey":"슬레이트 그레이(slate gray)","coral":"코랄(coral)","darkturquoise":"다크 터콰즈(dark turquoise)","antiquewhite":"앤틱 화이트(antique white)","mediumspringgreen":"미디엄 스프링 그린(medium spring green)","transparent":"투명(transparent)","salmon":"샐몬(salmon)","darkgrey":"다크 그레이(dark gray)","ivory":"아이보리(ivory)","greenyellow":"그린 옐로우(green-yellow)","mistyrose":"미스티 로즈(misty rose)","lightsalmon":"라이트 샐몬(light salmon)","silver":"실버(silver)","dimgrey":"딤 그레이(dim gray)","orange":"오렌지(orange)","white":"화이트(white)","navajowhite":"나바호 화이트(navajo white)","royalblue":"로얄 블루(royal blue)","deeppink":"딥 핑크(deep pink)","lime":"라임(lime)","oldlace":"올드 레이스(old lace)","chartreuse":"샤르트뢰즈(chartreuse)","darkcyan":"다크 시안(dark cyan)","yellow":"옐로우(yellow)","linen":"리넨(linen)","olive":"올리브(olive)","gold":"골드(gold)","lawngreen":"ë¡  그린(lawn green)","lightyellow":"라이트 옐로우(light yellow)","tan":"탠(tan)","darkviolet":"다크 바이올렛(dark violet)","lightslategrey":"라이트 슬레이트 그레이(light slate gray)","grey":"그레이(gray)","darkkhaki":"다크 카키(dark khaki)","green":"그린(green)","deepskyblue":"딥 스카이 블루(deep sky blue)","aqua":"아쿠아(aqua)","sienna":"시에나(sienna)","mintcream":"민트 크림(mint cream)","rosybrown":"로지 브라운(rosy brown)","mediumslateblue":"미디엄 슬레이트 블루(medium slate blue)","magenta":"마젠타(magenta)","lightseagreen":"라이트 씨 그린(light sea green)","cyan":"시안(cyan)","olivedrab":"올리브 드랩(olive drab)","darkgoldenrod":"다크 골든로드(dark goldenrod)","slateblue":"슬레이트 블루(slate blue)","mediumaquamarine":"미디엄 아쿠아마린(medium aquamarine)","lavender":"라벤더(lavender)","mediumseagreen":"미디엄 씨 그린(medium sea green)","maroon":"마룬(maroon)","darkslategray":"다크 슬레이트 그레이(dark slate gray)","mediumturquoise":"미디엄 터콰즈(medium turquoise)","ghostwhite":"고스트 화이트(ghost white)","darkblue":"다크 블루(dark blue)","mediumvioletred":"미디엄 바이올렛 레드(medium violet-red)","brown":"브라운(brown)","lightgray":"라이트 그레이(light gray)","sandybrown":"샌디 브라운(sandy brown)","pink":"핑크(pink)","firebrick":"파이어 브릭(fire brick)","indigo":"인디고(indigo)","snow":"스노우(snow)","darkorchid":"다크 오키드(dark orchid)","turquoise":"터콰즈(turquoise)","chocolate":"초콜렛(chocolate)","springgreen":"스프링 그린(spring green)","moccasin":"모카신(moccasin)","navy":"네이비(navy)","lemonchiffon":"레몬 쉬폰(lemon chiffon)","teal":"틸(teal)","floralwhite":"플로랄 화이트(floral white)","cornflowerblue":"콘플라워 블루(cornflower blue)","paleturquoise":"페일 터콰즈(pale turquoise)","purple":"퍼플(purple)","gainsboro":"게인스브로(gainsboro)","plum":"플럼(plum)","red":"레드(red)","blue":"블루(blue)","forestgreen":"포레스트 그린(forest green)","darkgreen":"다크 그린(dark green)","honeydew":"허니듀(honeydew)","darkseagreen":"다크 씨 그린(dark sea green)","lightcoral":"라이트 코랄(light coral)","palevioletred":"페일 바이올렛 레드(pale violet-red)","mediumpurple":"미디엄 퍼플(medium purple)","saddlebrown":"새들 브라운(saddle brown)","darkmagenta":"다크 마젠타(dark magenta)","thistle":"시슬(thistle)","whitesmoke":"화이트 스모크(white smoke)","wheat":"휘트(wheat)","violet":"바이올렛(violet)","lightskyblue":"라이트 스카이 블루(light sky blue)","goldenrod":"골든로드(goldenrod)","mediumblue":"미디엄 블루(medium blue)","skyblue":"스카이 블루(sky blue)","crimson":"크림슨(crimson)","darksalmon":"다크 샐몬(dark salmon)","darkred":"다크 레드(dark red)","darkslategrey":"다크 슬레이트 그레이(dark slate gray)","peru":"페루(peru)","lightgrey":"라이트 그레이(light gray)","lightgoldenrodyellow":"라이트 골든로드 옐로우(light goldenrod yellow)","blanchedalmond":"블랜치 아몬드(blanched almond)","aliceblue":"앨리스 블루(alice blue)","bisque":"비스크(bisque)","slategray":"슬레이트 그레이(slate gray)","palegoldenrod":"페일 골든로드(pale goldenrod)","darkorange":"다크 오렌지(dark orange)","aquamarine":"아쿠아마린(aquamarine)","lightgreen":"라이트 그린(light green)","burlywood":"벌리우드(burlywood)","dodgerblue":"다저 블루(dodger blue)","darkgray":"다크 그레이(dark gray)","lightcyan":"라이트 시안(light cyan)","powderblue":"파우더 블루(powder blue)","blueviolet":"블루 바이올렛(blue-violet)","orchid":"오키드(orchid)","dimgray":"딤 그레이(dim gray)","beige":"베이지(beige)","fuchsia":"후크샤(fuchsia)","lavenderblush":"라벤더 블러쉬(lavender blush)","hotpink":"핫 핑크(hot pink)","steelblue":"스틸 블루(steel blue)","tomato":"토마토(tomato)","lightpink":"라이트 핑크(light pink)","limegreen":"라임 그린(lime green)","indianred":"인디안 레드(indian red)","papayawhip":"파파야 휩(papaya whip)","lightslategray":"라이트 슬레이트 그레이(light slate gray)","gray":"그레이(gray)","mediumorchid":"미디엄 오키드(medium orchid)","cornsilk":"콘실크(cornsilk)","black":"블랙(black)","seagreen":"씨 그린(sea green)","darkslateblue":"다크 슬레이트 블루(dark slate blue)","khaki":"카키(khaki)","lightblue":"라이트 블루(light blue)","palegreen":"페일 그린(pale green)","azure":"애쥬어(azure)","peachpuff":"피치 퍼프(peach puff)","darkolivegreen":"다크 올리브 그린(dark olive green)","yellowgreen":"옐로우 그린(yellow green)"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"이전 선택사항","nextMessage":"기타 선택사항"} +, +'dijit/nls/common':{"buttonOk":"확인","buttonCancel":"취소","buttonSave":"저장","itemClose":"닫기"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_ko.js b/lib/dojo/nls/tt-rss-layer_ko.js deleted file mode 100644 index a919765c..00000000 --- a/lib/dojo/nls/tt-rss-layer_ko.js +++ /dev/null @@ -1 +0,0 @@ -dojo.provide("dojo.nls.tt-rss-layer_ko");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ko");dojo.nls.colors.ko={"lightsteelblue":"라이트 스틸 블루(light steel blue)","orangered":"오렌지 레드(orange red)","midnightblue":"미드나잇 블루(midnight blue)","cadetblue":"카뎃 블루(cadet blue)","seashell":"씨쉘(seashell)","slategrey":"슬레이트 그레이(slate gray)","coral":"코랄(coral)","darkturquoise":"다크 터콰즈(dark turquoise)","antiquewhite":"앤틱 화이트(antique white)","mediumspringgreen":"미디엄 스프링 그린(medium spring green)","salmon":"샐몬(salmon)","darkgrey":"다크 그레이(dark gray)","ivory":"아이보리(ivory)","greenyellow":"그린 옐로우(green-yellow)","mistyrose":"미스티 로즈(misty rose)","lightsalmon":"라이트 샐몬(light salmon)","silver":"실버(silver)","dimgrey":"딤 그레이(dim gray)","orange":"오렌지(orange)","white":"화이트(white)","navajowhite":"나바호 화이트(navajo white)","royalblue":"로얄 블루(royal blue)","deeppink":"딥 핑크(deep pink)","lime":"라임(lime)","oldlace":"올드 레이스(old lace)","chartreuse":"샤르트뢰즈(chartreuse)","darkcyan":"다크 시안(dark cyan)","yellow":"옐로우(yellow)","linen":"리넨(linen)","olive":"올리브(olive)","gold":"골드(gold)","lawngreen":"ë¡  그린(lawn green)","lightyellow":"라이트 옐로우(light yellow)","tan":"탠(tan)","darkviolet":"다크 바이올렛(dark violet)","lightslategrey":"라이트 슬레이트 그레이(light slate gray)","grey":"그레이(gray)","darkkhaki":"다크 카키(dark khaki)","green":"그린(green)","deepskyblue":"딥 스카이 블루(deep sky blue)","aqua":"아쿠아(aqua)","sienna":"시에나(sienna)","mintcream":"민트 크림(mint cream)","rosybrown":"로지 브라운(rosy brown)","mediumslateblue":"미디엄 슬레이트 블루(medium slate blue)","magenta":"마젠타(magenta)","lightseagreen":"라이트 씨 그린(light sea green)","cyan":"시안(cyan)","olivedrab":"올리브 드랩(olive drab)","darkgoldenrod":"다크 골든로드(dark goldenrod)","slateblue":"슬레이트 블루(slate blue)","mediumaquamarine":"미디엄 아쿠아마린(medium aquamarine)","lavender":"라벤더(lavender)","mediumseagreen":"미디엄 씨 그린(medium sea green)","maroon":"마룬(maroon)","darkslategray":"다크 슬레이트 그레이(dark slate gray)","mediumturquoise":"미디엄 터콰즈(medium turquoise)","ghostwhite":"고스트 화이트(ghost white)","darkblue":"다크 블루(dark blue)","mediumvioletred":"미디엄 바이올렛 레드(medium violet-red)","brown":"브라운(brown)","lightgray":"라이트 그레이(light gray)","sandybrown":"샌디 브라운(sandy brown)","pink":"핑크(pink)","firebrick":"파이어 브릭(fire brick)","indigo":"인디고(indigo)","snow":"스노우(snow)","darkorchid":"다크 오키드(dark orchid)","turquoise":"터콰즈(turquoise)","chocolate":"초콜렛(chocolate)","springgreen":"스프링 그린(spring green)","moccasin":"모카신(moccasin)","navy":"네이비(navy)","lemonchiffon":"레몬 쉬폰(lemon chiffon)","teal":"틸(teal)","floralwhite":"플로랄 화이트(floral white)","cornflowerblue":"콘플라워 블루(cornflower blue)","paleturquoise":"페일 터콰즈(pale turquoise)","purple":"퍼플(purple)","gainsboro":"게인스브로(gainsboro)","plum":"플럼(plum)","red":"레드(red)","blue":"블루(blue)","forestgreen":"포레스트 그린(forest green)","darkgreen":"다크 그린(dark green)","honeydew":"허니듀(honeydew)","darkseagreen":"다크 씨 그린(dark sea green)","lightcoral":"라이트 코랄(light coral)","palevioletred":"페일 바이올렛 레드(pale violet-red)","mediumpurple":"미디엄 퍼플(medium purple)","saddlebrown":"새들 브라운(saddle brown)","darkmagenta":"다크 마젠타(dark magenta)","thistle":"시슬(thistle)","whitesmoke":"화이트 스모크(white smoke)","wheat":"휘트(wheat)","violet":"바이올렛(violet)","lightskyblue":"라이트 스카이 블루(light sky blue)","goldenrod":"골든로드(goldenrod)","mediumblue":"미디엄 블루(medium blue)","skyblue":"스카이 블루(sky blue)","crimson":"크림슨(crimson)","darksalmon":"다크 샐몬(dark salmon)","darkred":"다크 레드(dark red)","darkslategrey":"다크 슬레이트 그레이(dark slate gray)","peru":"페루(peru)","lightgrey":"라이트 그레이(light gray)","lightgoldenrodyellow":"라이트 골든로드 옐로우(light goldenrod yellow)","blanchedalmond":"블랜치 아몬드(blanched almond)","aliceblue":"앨리스 블루(alice blue)","bisque":"비스크(bisque)","slategray":"슬레이트 그레이(slate gray)","palegoldenrod":"페일 골든로드(pale goldenrod)","darkorange":"다크 오렌지(dark orange)","aquamarine":"아쿠아마린(aquamarine)","lightgreen":"라이트 그린(light green)","burlywood":"벌리우드(burlywood)","dodgerblue":"다저 블루(dodger blue)","darkgray":"다크 그레이(dark gray)","lightcyan":"라이트 시안(light cyan)","powderblue":"파우더 블루(powder blue)","blueviolet":"블루 바이올렛(blue-violet)","orchid":"오키드(orchid)","dimgray":"딤 그레이(dim gray)","beige":"베이지(beige)","fuchsia":"후크샤(fuchsia)","lavenderblush":"라벤더 블러쉬(lavender blush)","hotpink":"핫 핑크(hot pink)","steelblue":"스틸 블루(steel blue)","tomato":"토마토(tomato)","lightpink":"라이트 핑크(light pink)","limegreen":"라임 그린(lime green)","indianred":"인디안 레드(indian red)","papayawhip":"파파야 휩(papaya whip)","lightslategray":"라이트 슬레이트 그레이(light slate gray)","gray":"그레이(gray)","mediumorchid":"미디엄 오키드(medium orchid)","cornsilk":"콘실크(cornsilk)","black":"블랙(black)","seagreen":"씨 그린(sea green)","darkslateblue":"다크 슬레이트 블루(dark slate blue)","khaki":"카키(khaki)","lightblue":"라이트 블루(light blue)","palegreen":"페일 그린(pale green)","azure":"애쥬어(azure)","peachpuff":"피치 퍼프(peach puff)","darkolivegreen":"다크 올리브 그린(dark olive green)","yellowgreen":"옐로우 그린(yellow green)"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ko");dijit.nls.loading.ko={"loadingState":"로드 중...","errorState":"죄송합니다. 오류가 발생했습니다."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ko");dijit.nls.common.ko={"buttonOk":"확인","buttonCancel":"취소","buttonSave":"저장","itemClose":"닫기"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ko");dijit.form.nls.validate.ko={"rangeMessage":"이 값은 범위를 벗어납니다.","invalidMessage":"입력된 값이 올바르지 않습니다.","missingMessage":"이 값은 필수입니다."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ko");dijit.form.nls.ComboBox.ko={"previousMessage":"이전 선택사항","nextMessage":"기타 선택사항"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ko");dojo.cldr.nls.number.ko={"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; diff --git a/lib/dojo/nls/tt-rss-layer_nb.js b/lib/dojo/nls/tt-rss-layer_nb.js index d4c87d20..5d8576d7 100644 --- a/lib/dojo/nls/tt-rss-layer_nb.js +++ b/lib/dojo/nls/tt-rss-layer_nb.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_nb");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.nb");dojo.nls.colors.nb={"lightsteelblue":"lys stÃ¥lblÃ¥","orangered":"rødoransje","midnightblue":"midnattsblÃ¥","cadetblue":"mørk grønnblÃ¥","seashell":"skjellhvit","slategrey":"skifergrÃ¥","coral":"korall","darkturquoise":"mørk turkis","antiquewhite":"antikk hvit","mediumspringgreen":"middels vÃ¥rgrønn","salmon":"lakserosa","darkgrey":"mørk grÃ¥","ivory":"elfenbenshvit","greenyellow":"gulgrønn","mistyrose":"lys rosenrød","lightsalmon":"lys lakserosa","silver":"sølvfarget","dimgrey":"mørk mørkegrÃ¥","orange":"oransje","white":"hvit","navajowhite":"gulbrun","royalblue":"kongeblÃ¥","deeppink":"dyp rosa","lime":"lime","oldlace":"kniplingshvit","chartreuse":"løvgrønn","darkcyan":"mørk cyan","yellow":"gul","linen":"lin","olive":"oliven","gold":"gull","lawngreen":"plengrønn","lightyellow":"lys gul","tan":"matt mellombrun","darkviolet":"mørk fiolett","lightslategrey":"lys skifergrÃ¥","grey":"grÃ¥","darkkhaki":"mørk khaki","green":"grønn","deepskyblue":"dyp himmelblÃ¥","aqua":"akva","sienna":"nøttebrun","mintcream":"mintkrem","rosybrown":"brunlilla","mediumslateblue":"middels skiferblÃ¥","magenta":"magenta","lightseagreen":"lys sjøgrønn","cyan":"cyan","olivedrab":"middels olivengrønn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblÃ¥","mediumaquamarine":"middels akvamarin","lavender":"lavendel","mediumseagreen":"middels sjøgrønn","maroon":"rødbrun","darkslategray":"mørk skifergrÃ¥","mediumturquoise":"middels turkis","ghostwhite":"egghvit","darkblue":"mørk blÃ¥","mediumvioletred":"middels fiolettrød","brown":"brun","lightgray":"lys grÃ¥","sandybrown":"sandbrun","pink":"rosa","firebrick":"mursteinsrød","indigo":"indigo","snow":"snøhvit","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"sjokolade","springgreen":"vÃ¥rgrønn","moccasin":"lys gulbrun","navy":"marineblÃ¥","lemonchiffon":"ferskenfarget","teal":"mørk grønnblÃ¥","floralwhite":"blomsterhvit","cornflowerblue":"kornblÃ¥","paleturquoise":"svak turkis","purple":"purpur","gainsboro":"lys lys grÃ¥","plum":"plommefarget","red":"rød","blue":"blÃ¥","forestgreen":"skoggrønn","darkgreen":"mørk grønn","honeydew":"grønnhvit","darkseagreen":"mørk sjøgrønn","lightcoral":"lys korall","palevioletred":"svak fiolettrød","mediumpurple":"middels purpur","saddlebrown":"mørk nøttebrun","darkmagenta":"mørk magenta","thistle":"lys grÃ¥lilla","whitesmoke":"røykhvit","wheat":"varm sienna","violet":"fiolett","lightskyblue":"lys himmelblÃ¥","goldenrod":"gyldenris","mediumblue":"mellomblÃ¥","skyblue":"himmelblÃ¥","crimson":"karmosinrødt","darksalmon":"mørk lakserosa","darkred":"mørk rød","darkslategrey":"mørk skifergrÃ¥","peru":"lys nøttebrun","lightgrey":"lys grÃ¥","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"lys mandel","aliceblue":"blÃ¥hvit","bisque":"gulrosa","slategray":"skifergrÃ¥","palegoldenrod":"svak gyldenris","darkorange":"mørk oransje","aquamarine":"akvamarin","lightgreen":"lys grønn","burlywood":"matt mellombrun","dodgerblue":"lys havblÃ¥","darkgray":"mørk grÃ¥","lightcyan":"lys cyan","powderblue":"lys grønnblÃ¥","blueviolet":"blÃ¥fiolett","orchid":"orkide","dimgray":"mørk mørkegrÃ¥","beige":"beige","fuchsia":"fuksia","lavenderblush":"lillahvit","hotpink":"halvmørk rosa","steelblue":"stÃ¥lblÃ¥","tomato":"tomatrød","lightpink":"lys rosa","limegreen":"limegrønn","indianred":"rustrød","papayawhip":"lys papaya","lightslategray":"lys skifergrÃ¥","gray":"grÃ¥","mediumorchid":"middels orkide","cornsilk":"cornsilk","black":"svart","seagreen":"sjøgrønn","darkslateblue":"mørk skiferblÃ¥","khaki":"khaki","lightblue":"lys blÃ¥","palegreen":"svak grønn","azure":"asur","peachpuff":"brunrosa","darkolivegreen":"mørk olivengrønn","yellowgreen":"gulgrønn"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.nb");dijit.nls.loading.nb={"loadingState":"Laster inn...","errorState":"Det oppsto en feil"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.nb");dijit.nls.common.nb={"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Lagre","itemClose":"Lukk"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.nb");dijit.form.nls.validate.nb={"rangeMessage":"Denne verdien er utenfor gyldig omrÃ¥de.","invalidMessage":"Den angitte verdien er ikke gyldig.","missingMessage":"Denne verdien er obligatorisk."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.nb");dijit.form.nls.ComboBox.nb={"previousMessage":"Tidligere valg","nextMessage":"Flere valg"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.nb");dojo.cldr.nls.number.nb={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_nb",{"dijit/form/nls/validate":{"rangeMessage":"Denne verdien er utenfor gyldig omrÃ¥de.","invalidMessage":"Den angitte verdien er ikke gyldig.","missingMessage":"Denne verdien er obligatorisk."},"dijit/nls/loading":{"loadingState":"Laster inn...","errorState":"Det oppsto en feil"},"dojo/nls/colors":{"lightsteelblue":"lys stÃ¥lblÃ¥","orangered":"rødoransje","midnightblue":"midnattsblÃ¥","cadetblue":"mørk grønnblÃ¥","seashell":"skjellhvit","slategrey":"skifergrÃ¥","coral":"korall","darkturquoise":"mørk turkis","antiquewhite":"antikk hvit","mediumspringgreen":"middels vÃ¥rgrønn","transparent":"gjennomsiktig","salmon":"lakserosa","darkgrey":"mørk grÃ¥","ivory":"elfenbenshvit","greenyellow":"gulgrønn","mistyrose":"lys rosenrød","lightsalmon":"lys lakserosa","silver":"sølvfarget","dimgrey":"mørk mørkegrÃ¥","orange":"oransje","white":"hvit","navajowhite":"gulbrun","royalblue":"kongeblÃ¥","deeppink":"dyp rosa","lime":"lime","oldlace":"kniplingshvit","chartreuse":"løvgrønn","darkcyan":"mørk cyan","yellow":"gul","linen":"lin","olive":"oliven","gold":"gull","lawngreen":"plengrønn","lightyellow":"lys gul","tan":"matt mellombrun","darkviolet":"mørk fiolett","lightslategrey":"lys skifergrÃ¥","grey":"grÃ¥","darkkhaki":"mørk khaki","green":"grønn","deepskyblue":"dyp himmelblÃ¥","aqua":"akva","sienna":"nøttebrun","mintcream":"mintkrem","rosybrown":"brunlilla","mediumslateblue":"middels skiferblÃ¥","magenta":"magenta","lightseagreen":"lys sjøgrønn","cyan":"cyan","olivedrab":"middels olivengrønn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblÃ¥","mediumaquamarine":"middels akvamarin","lavender":"lavendel","mediumseagreen":"middels sjøgrønn","maroon":"rødbrun","darkslategray":"mørk skifergrÃ¥","mediumturquoise":"middels turkis","ghostwhite":"egghvit","darkblue":"mørk blÃ¥","mediumvioletred":"middels fiolettrød","brown":"brun","lightgray":"lys grÃ¥","sandybrown":"sandbrun","pink":"rosa","firebrick":"mursteinsrød","indigo":"indigo","snow":"snøhvit","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"sjokolade","springgreen":"vÃ¥rgrønn","moccasin":"lys gulbrun","navy":"marineblÃ¥","lemonchiffon":"ferskenfarget","teal":"mørk grønnblÃ¥","floralwhite":"blomsterhvit","cornflowerblue":"kornblÃ¥","paleturquoise":"svak turkis","purple":"purpur","gainsboro":"lys lys grÃ¥","plum":"plommefarget","red":"rød","blue":"blÃ¥","forestgreen":"skoggrønn","darkgreen":"mørk grønn","honeydew":"grønnhvit","darkseagreen":"mørk sjøgrønn","lightcoral":"lys korall","palevioletred":"svak fiolettrød","mediumpurple":"middels purpur","saddlebrown":"mørk nøttebrun","darkmagenta":"mørk magenta","thistle":"lys grÃ¥lilla","whitesmoke":"røykhvit","wheat":"varm sienna","violet":"fiolett","lightskyblue":"lys himmelblÃ¥","goldenrod":"gyldenris","mediumblue":"mellomblÃ¥","skyblue":"himmelblÃ¥","crimson":"karmosinrødt","darksalmon":"mørk lakserosa","darkred":"mørk rød","darkslategrey":"mørk skifergrÃ¥","peru":"lys nøttebrun","lightgrey":"lys grÃ¥","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"lys mandel","aliceblue":"blÃ¥hvit","bisque":"gulrosa","slategray":"skifergrÃ¥","palegoldenrod":"svak gyldenris","darkorange":"mørk oransje","aquamarine":"akvamarin","lightgreen":"lys grønn","burlywood":"matt mellombrun","dodgerblue":"lys havblÃ¥","darkgray":"mørk grÃ¥","lightcyan":"lys cyan","powderblue":"lys grønnblÃ¥","blueviolet":"blÃ¥fiolett","orchid":"orkide","dimgray":"mørk mørkegrÃ¥","beige":"beige","fuchsia":"fuksia","lavenderblush":"lillahvit","hotpink":"halvmørk rosa","steelblue":"stÃ¥lblÃ¥","tomato":"tomatrød","lightpink":"lys rosa","limegreen":"limegrønn","indianred":"rustrød","papayawhip":"lys papaya","lightslategray":"lys skifergrÃ¥","gray":"grÃ¥","mediumorchid":"middels orkide","cornsilk":"cornsilk","black":"svart","seagreen":"sjøgrønn","darkslateblue":"mørk skiferblÃ¥","khaki":"khaki","lightblue":"lys blÃ¥","palegreen":"svak grønn","azure":"asur","peachpuff":"brunrosa","darkolivegreen":"mørk olivengrønn","yellowgreen":"gulgrønn"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Tidligere valg","nextMessage":"Flere valg"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Lagre","itemClose":"Lukk"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_nb.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_nb.js.uncompressed.js new file mode 100644 index 00000000..cddd699e --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_nb.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_nb',{ +'dijit/form/nls/validate':{"rangeMessage":"Denne verdien er utenfor gyldig omrÃ¥de.","invalidMessage":"Den angitte verdien er ikke gyldig.","missingMessage":"Denne verdien er obligatorisk."} +, +'dijit/nls/loading':{"loadingState":"Laster inn...","errorState":"Det oppsto en feil"} +, +'dojo/nls/colors':{"lightsteelblue":"lys stÃ¥lblÃ¥","orangered":"rødoransje","midnightblue":"midnattsblÃ¥","cadetblue":"mørk grønnblÃ¥","seashell":"skjellhvit","slategrey":"skifergrÃ¥","coral":"korall","darkturquoise":"mørk turkis","antiquewhite":"antikk hvit","mediumspringgreen":"middels vÃ¥rgrønn","transparent":"gjennomsiktig","salmon":"lakserosa","darkgrey":"mørk grÃ¥","ivory":"elfenbenshvit","greenyellow":"gulgrønn","mistyrose":"lys rosenrød","lightsalmon":"lys lakserosa","silver":"sølvfarget","dimgrey":"mørk mørkegrÃ¥","orange":"oransje","white":"hvit","navajowhite":"gulbrun","royalblue":"kongeblÃ¥","deeppink":"dyp rosa","lime":"lime","oldlace":"kniplingshvit","chartreuse":"løvgrønn","darkcyan":"mørk cyan","yellow":"gul","linen":"lin","olive":"oliven","gold":"gull","lawngreen":"plengrønn","lightyellow":"lys gul","tan":"matt mellombrun","darkviolet":"mørk fiolett","lightslategrey":"lys skifergrÃ¥","grey":"grÃ¥","darkkhaki":"mørk khaki","green":"grønn","deepskyblue":"dyp himmelblÃ¥","aqua":"akva","sienna":"nøttebrun","mintcream":"mintkrem","rosybrown":"brunlilla","mediumslateblue":"middels skiferblÃ¥","magenta":"magenta","lightseagreen":"lys sjøgrønn","cyan":"cyan","olivedrab":"middels olivengrønn","darkgoldenrod":"mørk gyldenris","slateblue":"skiferblÃ¥","mediumaquamarine":"middels akvamarin","lavender":"lavendel","mediumseagreen":"middels sjøgrønn","maroon":"rødbrun","darkslategray":"mørk skifergrÃ¥","mediumturquoise":"middels turkis","ghostwhite":"egghvit","darkblue":"mørk blÃ¥","mediumvioletred":"middels fiolettrød","brown":"brun","lightgray":"lys grÃ¥","sandybrown":"sandbrun","pink":"rosa","firebrick":"mursteinsrød","indigo":"indigo","snow":"snøhvit","darkorchid":"mørk orkide","turquoise":"turkis","chocolate":"sjokolade","springgreen":"vÃ¥rgrønn","moccasin":"lys gulbrun","navy":"marineblÃ¥","lemonchiffon":"ferskenfarget","teal":"mørk grønnblÃ¥","floralwhite":"blomsterhvit","cornflowerblue":"kornblÃ¥","paleturquoise":"svak turkis","purple":"purpur","gainsboro":"lys lys grÃ¥","plum":"plommefarget","red":"rød","blue":"blÃ¥","forestgreen":"skoggrønn","darkgreen":"mørk grønn","honeydew":"grønnhvit","darkseagreen":"mørk sjøgrønn","lightcoral":"lys korall","palevioletred":"svak fiolettrød","mediumpurple":"middels purpur","saddlebrown":"mørk nøttebrun","darkmagenta":"mørk magenta","thistle":"lys grÃ¥lilla","whitesmoke":"røykhvit","wheat":"varm sienna","violet":"fiolett","lightskyblue":"lys himmelblÃ¥","goldenrod":"gyldenris","mediumblue":"mellomblÃ¥","skyblue":"himmelblÃ¥","crimson":"karmosinrødt","darksalmon":"mørk lakserosa","darkred":"mørk rød","darkslategrey":"mørk skifergrÃ¥","peru":"lys nøttebrun","lightgrey":"lys grÃ¥","lightgoldenrodyellow":"lys gyldenrisgul","blanchedalmond":"lys mandel","aliceblue":"blÃ¥hvit","bisque":"gulrosa","slategray":"skifergrÃ¥","palegoldenrod":"svak gyldenris","darkorange":"mørk oransje","aquamarine":"akvamarin","lightgreen":"lys grønn","burlywood":"matt mellombrun","dodgerblue":"lys havblÃ¥","darkgray":"mørk grÃ¥","lightcyan":"lys cyan","powderblue":"lys grønnblÃ¥","blueviolet":"blÃ¥fiolett","orchid":"orkide","dimgray":"mørk mørkegrÃ¥","beige":"beige","fuchsia":"fuksia","lavenderblush":"lillahvit","hotpink":"halvmørk rosa","steelblue":"stÃ¥lblÃ¥","tomato":"tomatrød","lightpink":"lys rosa","limegreen":"limegrønn","indianred":"rustrød","papayawhip":"lys papaya","lightslategray":"lys skifergrÃ¥","gray":"grÃ¥","mediumorchid":"middels orkide","cornsilk":"cornsilk","black":"svart","seagreen":"sjøgrønn","darkslateblue":"mørk skiferblÃ¥","khaki":"khaki","lightblue":"lys blÃ¥","palegreen":"svak grønn","azure":"asur","peachpuff":"brunrosa","darkolivegreen":"mørk olivengrønn","yellowgreen":"gulgrønn"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Tidligere valg","nextMessage":"Flere valg"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Lagre","itemClose":"Lukk"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_nl-nl.js b/lib/dojo/nls/tt-rss-layer_nl-nl.js index 6b5f10a1..723b200c 100644 --- a/lib/dojo/nls/tt-rss-layer_nl-nl.js +++ b/lib/dojo/nls/tt-rss-layer_nl-nl.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_nl-nl");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.nl_nl");dojo.nls.colors.nl_nl={"lightsteelblue":"lichtstaalblauw","orangered":"oranjerood","midnightblue":"nachtblauw","cadetblue":"donkerstaalblauw","seashell":"schelp","slategrey":"leigrijs","coral":"koraalrood","darkturquoise":"donkerturquoise","antiquewhite":"antiekwit","mediumspringgreen":"midlentegroen","salmon":"zalm","darkgrey":"donkergrijs","ivory":"ivoorwit","greenyellow":"groengeel","mistyrose":"matroze","lightsalmon":"lichtzalm","silver":"zilvergrijs","dimgrey":"dofgrijs","orange":"oranje","white":"wit","navajowhite":"navajowit","royalblue":"koningsblauw","deeppink":"donkerroze","lime":"limoen","oldlace":"kant","chartreuse":"groengeel","darkcyan":"donkercyaan","yellow":"geel","linen":"linnen","olive":"olijfgroen","gold":"goud","lawngreen":"grasgroen","lightyellow":"lichtgeel","tan":"geelbruin","darkviolet":"donkerviolet","lightslategrey":"lichtblauwgrijs","grey":"grijs","darkkhaki":"donkerkaki","green":"groen","deepskyblue":"diephemelblauw","aqua":"aqua","sienna":"sienna","mintcream":"mintroomgeel","rosybrown":"roodbruin","mediumslateblue":"midgrijsblauw","magenta":"magenta","lightseagreen":"lichtzeegroen","cyan":"cyaan","olivedrab":"grijsbruin","darkgoldenrod":"donkergoud","slateblue":"leiblauw","mediumaquamarine":"midaquamarijn","lavender":"lavendelblauw","mediumseagreen":"midzeegroen","maroon":"kastanjebruin","darkslategray":"donkerblauwgrijs","mediumturquoise":"midturquoise","ghostwhite":"spierwit","darkblue":"donkerblauw","mediumvioletred":"midvioletrood","brown":"bruin","lightgray":"lichtgrijs","sandybrown":"zandbruin","pink":"roze","firebrick":"vuursteenrood","indigo":"indigo","snow":"sneeuwwit","darkorchid":"donkerorchidee","turquoise":"turquoise","chocolate":"chocoladebruin","springgreen":"lentegroen","moccasin":"moccasin","navy":"marineblauw","lemonchiffon":"citroengeel","teal":"grijsblauw","floralwhite":"rozewit","cornflowerblue":"korenbloemblauw","paleturquoise":"bleekturquoise","purple":"purper","gainsboro":"lichtblauwgrijs","plum":"pruim","red":"rood","blue":"blauw","forestgreen":"bosgroen","darkgreen":"donkergroen","honeydew":"meloen","darkseagreen":"donkerzeegroen","lightcoral":"lichtkoraal","palevioletred":"bleekvioletrood","mediumpurple":"midpurper","saddlebrown":"leerbruin","darkmagenta":"donkermagenta","thistle":"distel","whitesmoke":"rookwit","wheat":"tarwebruin","violet":"violet","lightskyblue":"lichthemelsblauw","goldenrod":"goudbruin","mediumblue":"midblauw","skyblue":"hemelsblauw","crimson":"karmozijnrood","darksalmon":"donkerzalm","darkred":"donkerrood","darkslategrey":"donkerblauwgrijs","peru":"bruin","lightgrey":"lichtgrijs","lightgoldenrodyellow":"lichtgoudgeel","blanchedalmond":"amandel","aliceblue":"lichtblauw","bisque":"oranjegeel","slategray":"leigrijs","palegoldenrod":"bleekgeel","darkorange":"donkeroranje","aquamarine":"aquamarijn","lightgreen":"lichtgroen","burlywood":"lichtbruin","dodgerblue":"helderblauw","darkgray":"donkergrijs","lightcyan":"lichtcyaan","powderblue":"lichtblauw-wit","blueviolet":"violet","orchid":"orchidee","dimgray":"dofgrijs","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelblos","hotpink":"acaciaroze","steelblue":"staalblauw","tomato":"tomaat","lightpink":"lichtroze","limegreen":"limoengroen","indianred":"indisch rood","papayawhip":"papajaroze","lightslategray":"lichtblauwgrijs","gray":"grijs","mediumorchid":"midorchidee","cornsilk":"maïsgeel","black":"zwart","seagreen":"zeegroen","darkslateblue":"donkergrijsblauw","khaki":"kaki","lightblue":"lichtblauw","palegreen":"bleekgroen","azure":"azuur","peachpuff":"perzikroze","darkolivegreen":"donkerolijfgroen","yellowgreen":"geelgroen"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.nl_nl");dijit.nls.loading.nl_nl={"loadingState":"Bezig met laden...","errorState":"Er is een fout opgetreden"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.nl_nl");dijit.nls.common.nl_nl={"buttonOk":"OK","buttonCancel":"Annuleren","buttonSave":"Opslaan","itemClose":"Sluiten"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.nl_nl");dijit.form.nls.validate.nl_nl={"rangeMessage":"Deze waarde is niet toegestaan.","invalidMessage":"De opgegeven waarde is ongeldig.","missingMessage":"Deze waarde is verplicht."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.nl_nl");dijit.form.nls.ComboBox.nl_nl={"previousMessage":"Eerdere opties","nextMessage":"Meer opties"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.nl_nl");dojo.cldr.nls.number.nl_nl={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_nl-nl",{"dijit/form/nls/validate":{"rangeMessage":"Deze waarde is niet toegestaan.","invalidMessage":"De opgegeven waarde is ongeldig.","missingMessage":"Deze waarde is verplicht."},"dijit/nls/loading":{"loadingState":"Bezig met laden...","errorState":"Er is een fout opgetreden"},"dojo/nls/colors":{"lightsteelblue":"lichtstaalblauw","orangered":"oranjerood","midnightblue":"nachtblauw","cadetblue":"donkerstaalblauw","seashell":"schelp","slategrey":"leigrijs","coral":"koraalrood","darkturquoise":"donkerturquoise","antiquewhite":"antiekwit","mediumspringgreen":"midlentegroen","transparent":"transparant","salmon":"zalm","darkgrey":"donkergrijs","ivory":"ivoorwit","greenyellow":"groengeel","mistyrose":"matroze","lightsalmon":"lichtzalm","silver":"zilvergrijs","dimgrey":"dofgrijs","orange":"oranje","white":"wit","navajowhite":"navajowit","royalblue":"koningsblauw","deeppink":"donkerroze","lime":"limoen","oldlace":"kant","chartreuse":"groengeel","darkcyan":"donkercyaan","yellow":"geel","linen":"linnen","olive":"olijfgroen","gold":"goud","lawngreen":"grasgroen","lightyellow":"lichtgeel","tan":"geelbruin","darkviolet":"donkerviolet","lightslategrey":"lichtblauwgrijs","grey":"grijs","darkkhaki":"donkerkaki","green":"groen","deepskyblue":"diephemelblauw","aqua":"aqua","sienna":"sienna","mintcream":"mintroomgeel","rosybrown":"roodbruin","mediumslateblue":"midgrijsblauw","magenta":"magenta","lightseagreen":"lichtzeegroen","cyan":"cyaan","olivedrab":"grijsbruin","darkgoldenrod":"donkergoud","slateblue":"leiblauw","mediumaquamarine":"midaquamarijn","lavender":"lavendelblauw","mediumseagreen":"midzeegroen","maroon":"kastanjebruin","darkslategray":"donkerblauwgrijs","mediumturquoise":"midturquoise","ghostwhite":"spierwit","darkblue":"donkerblauw","mediumvioletred":"midvioletrood","brown":"bruin","lightgray":"lichtgrijs","sandybrown":"zandbruin","pink":"roze","firebrick":"vuursteenrood","indigo":"indigo","snow":"sneeuwwit","darkorchid":"donkerorchidee","turquoise":"turquoise","chocolate":"chocoladebruin","springgreen":"lentegroen","moccasin":"moccasin","navy":"marineblauw","lemonchiffon":"citroengeel","teal":"grijsblauw","floralwhite":"rozewit","cornflowerblue":"korenbloemblauw","paleturquoise":"bleekturquoise","purple":"purper","gainsboro":"lichtblauwgrijs","plum":"pruim","red":"rood","blue":"blauw","forestgreen":"bosgroen","darkgreen":"donkergroen","honeydew":"meloen","darkseagreen":"donkerzeegroen","lightcoral":"lichtkoraal","palevioletred":"bleekvioletrood","mediumpurple":"midpurper","saddlebrown":"leerbruin","darkmagenta":"donkermagenta","thistle":"distel","whitesmoke":"rookwit","wheat":"tarwebruin","violet":"violet","lightskyblue":"lichthemelsblauw","goldenrod":"goudbruin","mediumblue":"midblauw","skyblue":"hemelsblauw","crimson":"karmozijnrood","darksalmon":"donkerzalm","darkred":"donkerrood","darkslategrey":"donkerblauwgrijs","peru":"bruin","lightgrey":"lichtgrijs","lightgoldenrodyellow":"lichtgoudgeel","blanchedalmond":"amandel","aliceblue":"lichtblauw","bisque":"oranjegeel","slategray":"leigrijs","palegoldenrod":"bleekgeel","darkorange":"donkeroranje","aquamarine":"aquamarijn","lightgreen":"lichtgroen","burlywood":"lichtbruin","dodgerblue":"helderblauw","darkgray":"donkergrijs","lightcyan":"lichtcyaan","powderblue":"lichtblauw-wit","blueviolet":"violet","orchid":"orchidee","dimgray":"dofgrijs","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelblos","hotpink":"acaciaroze","steelblue":"staalblauw","tomato":"tomaat","lightpink":"lichtroze","limegreen":"limoengroen","indianred":"indisch rood","papayawhip":"papajaroze","lightslategray":"lichtblauwgrijs","gray":"grijs","mediumorchid":"midorchidee","cornsilk":"maïsgeel","black":"zwart","seagreen":"zeegroen","darkslateblue":"donkergrijsblauw","khaki":"kaki","lightblue":"lichtblauw","palegreen":"bleekgroen","azure":"azuur","peachpuff":"perzikroze","darkolivegreen":"donkerolijfgroen","yellowgreen":"geelgroen"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Eerdere opties","nextMessage":"Meer opties"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Annuleren","buttonSave":"Opslaan","itemClose":"Sluiten"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_nl-nl.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_nl-nl.js.uncompressed.js new file mode 100644 index 00000000..7d02b768 --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_nl-nl.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_nl-nl',{ +'dijit/form/nls/validate':{"rangeMessage":"Deze waarde is niet toegestaan.","invalidMessage":"De opgegeven waarde is ongeldig.","missingMessage":"Deze waarde is verplicht."} +, +'dijit/nls/loading':{"loadingState":"Bezig met laden...","errorState":"Er is een fout opgetreden"} +, +'dojo/nls/colors':{"lightsteelblue":"lichtstaalblauw","orangered":"oranjerood","midnightblue":"nachtblauw","cadetblue":"donkerstaalblauw","seashell":"schelp","slategrey":"leigrijs","coral":"koraalrood","darkturquoise":"donkerturquoise","antiquewhite":"antiekwit","mediumspringgreen":"midlentegroen","transparent":"transparant","salmon":"zalm","darkgrey":"donkergrijs","ivory":"ivoorwit","greenyellow":"groengeel","mistyrose":"matroze","lightsalmon":"lichtzalm","silver":"zilvergrijs","dimgrey":"dofgrijs","orange":"oranje","white":"wit","navajowhite":"navajowit","royalblue":"koningsblauw","deeppink":"donkerroze","lime":"limoen","oldlace":"kant","chartreuse":"groengeel","darkcyan":"donkercyaan","yellow":"geel","linen":"linnen","olive":"olijfgroen","gold":"goud","lawngreen":"grasgroen","lightyellow":"lichtgeel","tan":"geelbruin","darkviolet":"donkerviolet","lightslategrey":"lichtblauwgrijs","grey":"grijs","darkkhaki":"donkerkaki","green":"groen","deepskyblue":"diephemelblauw","aqua":"aqua","sienna":"sienna","mintcream":"mintroomgeel","rosybrown":"roodbruin","mediumslateblue":"midgrijsblauw","magenta":"magenta","lightseagreen":"lichtzeegroen","cyan":"cyaan","olivedrab":"grijsbruin","darkgoldenrod":"donkergoud","slateblue":"leiblauw","mediumaquamarine":"midaquamarijn","lavender":"lavendelblauw","mediumseagreen":"midzeegroen","maroon":"kastanjebruin","darkslategray":"donkerblauwgrijs","mediumturquoise":"midturquoise","ghostwhite":"spierwit","darkblue":"donkerblauw","mediumvioletred":"midvioletrood","brown":"bruin","lightgray":"lichtgrijs","sandybrown":"zandbruin","pink":"roze","firebrick":"vuursteenrood","indigo":"indigo","snow":"sneeuwwit","darkorchid":"donkerorchidee","turquoise":"turquoise","chocolate":"chocoladebruin","springgreen":"lentegroen","moccasin":"moccasin","navy":"marineblauw","lemonchiffon":"citroengeel","teal":"grijsblauw","floralwhite":"rozewit","cornflowerblue":"korenbloemblauw","paleturquoise":"bleekturquoise","purple":"purper","gainsboro":"lichtblauwgrijs","plum":"pruim","red":"rood","blue":"blauw","forestgreen":"bosgroen","darkgreen":"donkergroen","honeydew":"meloen","darkseagreen":"donkerzeegroen","lightcoral":"lichtkoraal","palevioletred":"bleekvioletrood","mediumpurple":"midpurper","saddlebrown":"leerbruin","darkmagenta":"donkermagenta","thistle":"distel","whitesmoke":"rookwit","wheat":"tarwebruin","violet":"violet","lightskyblue":"lichthemelsblauw","goldenrod":"goudbruin","mediumblue":"midblauw","skyblue":"hemelsblauw","crimson":"karmozijnrood","darksalmon":"donkerzalm","darkred":"donkerrood","darkslategrey":"donkerblauwgrijs","peru":"bruin","lightgrey":"lichtgrijs","lightgoldenrodyellow":"lichtgoudgeel","blanchedalmond":"amandel","aliceblue":"lichtblauw","bisque":"oranjegeel","slategray":"leigrijs","palegoldenrod":"bleekgeel","darkorange":"donkeroranje","aquamarine":"aquamarijn","lightgreen":"lichtgroen","burlywood":"lichtbruin","dodgerblue":"helderblauw","darkgray":"donkergrijs","lightcyan":"lichtcyaan","powderblue":"lichtblauw-wit","blueviolet":"violet","orchid":"orchidee","dimgray":"dofgrijs","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelblos","hotpink":"acaciaroze","steelblue":"staalblauw","tomato":"tomaat","lightpink":"lichtroze","limegreen":"limoengroen","indianred":"indisch rood","papayawhip":"papajaroze","lightslategray":"lichtblauwgrijs","gray":"grijs","mediumorchid":"midorchidee","cornsilk":"maïsgeel","black":"zwart","seagreen":"zeegroen","darkslateblue":"donkergrijsblauw","khaki":"kaki","lightblue":"lichtblauw","palegreen":"bleekgroen","azure":"azuur","peachpuff":"perzikroze","darkolivegreen":"donkerolijfgroen","yellowgreen":"geelgroen"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Eerdere opties","nextMessage":"Meer opties"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Annuleren","buttonSave":"Opslaan","itemClose":"Sluiten"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_nl.js b/lib/dojo/nls/tt-rss-layer_nl.js deleted file mode 100644 index 78bfcfca..00000000 --- a/lib/dojo/nls/tt-rss-layer_nl.js +++ /dev/null @@ -1 +0,0 @@ -dojo.provide("dojo.nls.tt-rss-layer_nl");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.nl");dojo.nls.colors.nl={"lightsteelblue":"lichtstaalblauw","orangered":"oranjerood","midnightblue":"nachtblauw","cadetblue":"donkerstaalblauw","seashell":"schelp","slategrey":"leigrijs","coral":"koraalrood","darkturquoise":"donkerturquoise","antiquewhite":"antiekwit","mediumspringgreen":"midlentegroen","salmon":"zalm","darkgrey":"donkergrijs","ivory":"ivoorwit","greenyellow":"groengeel","mistyrose":"matroze","lightsalmon":"lichtzalm","silver":"zilvergrijs","dimgrey":"dofgrijs","orange":"oranje","white":"wit","navajowhite":"navajowit","royalblue":"koningsblauw","deeppink":"donkerroze","lime":"limoen","oldlace":"kant","chartreuse":"groengeel","darkcyan":"donkercyaan","yellow":"geel","linen":"linnen","olive":"olijfgroen","gold":"goud","lawngreen":"grasgroen","lightyellow":"lichtgeel","tan":"geelbruin","darkviolet":"donkerviolet","lightslategrey":"lichtblauwgrijs","grey":"grijs","darkkhaki":"donkerkaki","green":"groen","deepskyblue":"diephemelblauw","aqua":"aqua","sienna":"sienna","mintcream":"mintroomgeel","rosybrown":"roodbruin","mediumslateblue":"midgrijsblauw","magenta":"magenta","lightseagreen":"lichtzeegroen","cyan":"cyaan","olivedrab":"grijsbruin","darkgoldenrod":"donkergoud","slateblue":"leiblauw","mediumaquamarine":"midaquamarijn","lavender":"lavendelblauw","mediumseagreen":"midzeegroen","maroon":"kastanjebruin","darkslategray":"donkerblauwgrijs","mediumturquoise":"midturquoise","ghostwhite":"spierwit","darkblue":"donkerblauw","mediumvioletred":"midvioletrood","brown":"bruin","lightgray":"lichtgrijs","sandybrown":"zandbruin","pink":"roze","firebrick":"vuursteenrood","indigo":"indigo","snow":"sneeuwwit","darkorchid":"donkerorchidee","turquoise":"turquoise","chocolate":"chocoladebruin","springgreen":"lentegroen","moccasin":"moccasin","navy":"marineblauw","lemonchiffon":"citroengeel","teal":"grijsblauw","floralwhite":"rozewit","cornflowerblue":"korenbloemblauw","paleturquoise":"bleekturquoise","purple":"purper","gainsboro":"lichtblauwgrijs","plum":"pruim","red":"rood","blue":"blauw","forestgreen":"bosgroen","darkgreen":"donkergroen","honeydew":"meloen","darkseagreen":"donkerzeegroen","lightcoral":"lichtkoraal","palevioletred":"bleekvioletrood","mediumpurple":"midpurper","saddlebrown":"leerbruin","darkmagenta":"donkermagenta","thistle":"distel","whitesmoke":"rookwit","wheat":"tarwebruin","violet":"violet","lightskyblue":"lichthemelsblauw","goldenrod":"goudbruin","mediumblue":"midblauw","skyblue":"hemelsblauw","crimson":"karmozijnrood","darksalmon":"donkerzalm","darkred":"donkerrood","darkslategrey":"donkerblauwgrijs","peru":"bruin","lightgrey":"lichtgrijs","lightgoldenrodyellow":"lichtgoudgeel","blanchedalmond":"amandel","aliceblue":"lichtblauw","bisque":"oranjegeel","slategray":"leigrijs","palegoldenrod":"bleekgeel","darkorange":"donkeroranje","aquamarine":"aquamarijn","lightgreen":"lichtgroen","burlywood":"lichtbruin","dodgerblue":"helderblauw","darkgray":"donkergrijs","lightcyan":"lichtcyaan","powderblue":"lichtblauw-wit","blueviolet":"violet","orchid":"orchidee","dimgray":"dofgrijs","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelblos","hotpink":"acaciaroze","steelblue":"staalblauw","tomato":"tomaat","lightpink":"lichtroze","limegreen":"limoengroen","indianred":"indisch rood","papayawhip":"papajaroze","lightslategray":"lichtblauwgrijs","gray":"grijs","mediumorchid":"midorchidee","cornsilk":"maïsgeel","black":"zwart","seagreen":"zeegroen","darkslateblue":"donkergrijsblauw","khaki":"kaki","lightblue":"lichtblauw","palegreen":"bleekgroen","azure":"azuur","peachpuff":"perzikroze","darkolivegreen":"donkerolijfgroen","yellowgreen":"geelgroen"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.nl");dijit.nls.loading.nl={"loadingState":"Bezig met laden...","errorState":"Er is een fout opgetreden"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.nl");dijit.nls.common.nl={"buttonOk":"OK","buttonCancel":"Annuleren","buttonSave":"Opslaan","itemClose":"Sluiten"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.nl");dijit.form.nls.validate.nl={"rangeMessage":"Deze waarde is niet toegestaan.","invalidMessage":"De opgegeven waarde is ongeldig.","missingMessage":"Deze waarde is verplicht."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.nl");dijit.form.nls.ComboBox.nl={"previousMessage":"Eerdere opties","nextMessage":"Meer opties"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.nl");dojo.cldr.nls.number.nl={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤ #,##0.00;¤ #,##0.00-","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; diff --git a/lib/dojo/nls/tt-rss-layer_pl.js b/lib/dojo/nls/tt-rss-layer_pl.js index dd78bb0f..8de2ed11 100644 --- a/lib/dojo/nls/tt-rss-layer_pl.js +++ b/lib/dojo/nls/tt-rss-layer_pl.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_pl");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.pl");dojo.nls.colors.pl={"lightsteelblue":"jasnostalowoniebieski","orangered":"pomarańczowoczerwony","midnightblue":"granatowoczarny","cadetblue":"niebieskoszary","seashell":"matowoliliowy","slategrey":"mysi","coral":"koralowy","darkturquoise":"mlecznoturkusowy","antiquewhite":"biel antyczna","mediumspringgreen":"średnia wiosenna zieleń","salmon":"łososiowy","darkgrey":"ciemnoszary","ivory":"kość słoniowa","greenyellow":"zielonożółty","mistyrose":"bladoróżany","lightsalmon":"jasnołososiowy","silver":"srebrny","dimgrey":"przyciemniony szary","orange":"pomarańczowy","white":"biały","navajowhite":"piaskowy","royalblue":"królewski błękit","deeppink":"głęboki różowy","lime":"limonkowy","oldlace":"bladopomarańczowy","chartreuse":"żółtooliwkowy","darkcyan":"ciemnoniebieskozielony","yellow":"żółty","linen":"lniany","olive":"oliwkowy","gold":"złoty","lawngreen":"trawiasty","lightyellow":"jasnożółty","tan":"śniady","darkviolet":"ciemnofiołkowy","lightslategrey":"jasny mysi","grey":"szary","darkkhaki":"ciemny khaki","green":"zielony","deepskyblue":"intensywny błękit nieba","aqua":"morski","sienna":"siena","mintcream":"jasnomiętowy","rosybrown":"różowobrązowy","mediumslateblue":"średni gołębi","magenta":"amarantowy","lightseagreen":"jasna zieleń morska","cyan":"niebieskozielony","olivedrab":"oliwkowa zieleń","darkgoldenrod":"ciemne stare złoto","slateblue":"gołębi","mediumaquamarine":"średnia akwamaryna","lavender":"lawendowy","mediumseagreen":"średnia zieleń morska","maroon":"kasztanowy","darkslategray":"ciemny mysi","mediumturquoise":"średni turkusowy","ghostwhite":"bladobiały","darkblue":"ciemnoniebieski","mediumvioletred":"średni fiołkowowoczerwony","brown":"brązowy","lightgray":"jasnoszary","sandybrown":"piaskowy brąz","pink":"różowy","firebrick":"ceglasty","indigo":"indygo","snow":"śnieżny","darkorchid":"ciemna orchidea","turquoise":"turkusowy","chocolate":"czekoladowy","springgreen":"wiosenna zieleń","moccasin":"mokasynowy","navy":"granatowy","lemonchiffon":"cytrynowy","teal":"zielonomodry","floralwhite":"kwiatowa biel","cornflowerblue":"chabrowy","paleturquoise":"bladoturkusowy","purple":"fioletowy","gainsboro":"bladoszary","plum":"śliwkowy","red":"czerwony","blue":"niebieski","forestgreen":"leśna zieleń","darkgreen":"ciemnozielony","honeydew":"miodowy","darkseagreen":"ciemna zieleń morska","lightcoral":"jasnokoralowy","palevioletred":"blady fiołkowoczerwony","mediumpurple":"średni fioletowy","saddlebrown":"brąz skórzany","darkmagenta":"ciemnoamarantowy","thistle":"bladofioletowy","whitesmoke":"przydymiony biały","wheat":"pszeniczny","violet":"fiołkowy","lightskyblue":"jasny błękit nieba","goldenrod":"stare złoto","mediumblue":"ciemnochabrowy","skyblue":"błękit nieba","crimson":"karmazynowy","darksalmon":"ciemnołososiowy","darkred":"ciemnoczerwony","darkslategrey":"ciemny mysi","peru":"jasnobrązowy","lightgrey":"jasnoszary","lightgoldenrodyellow":"jasnożółte stare złoto","blanchedalmond":"migdałowy","aliceblue":"bladoniebieski","bisque":"biszkoptowy","slategray":"mysi","palegoldenrod":"blade stare złoto","darkorange":"ciemnopomarańczowy","aquamarine":"akwamaryna","lightgreen":"jasnozielony","burlywood":"kolor drewna","dodgerblue":"błękit Dodgers","darkgray":"ciemnoszary","lightcyan":"jasnoniebieskozielony","powderblue":"jasnobladobłękitny","blueviolet":"błękitnofiołkowy","orchid":"orchidea","dimgray":"przyciemniony szary","beige":"beżowy","fuchsia":"fuksjowy","lavenderblush":"lawendowocielisty","hotpink":"odblaskoworóżowy","steelblue":"stalowoniebieski","tomato":"pomidorowy","lightpink":"jasnoróżowy","limegreen":"zielony limonkowy","indianred":"kasztanowy","papayawhip":"papaja","lightslategray":"jasny mysi","gray":"szary","mediumorchid":"średnia orchidea","cornsilk":"kukurydziany","black":"czarny","seagreen":"zieleń morska","darkslateblue":"ciemny gołębi","khaki":"khaki","lightblue":"jasnoniebieski","palegreen":"bladozielony","azure":"lazurowy","peachpuff":"brzoskwiniowy","darkolivegreen":"ciemnooliwkowy","yellowgreen":"żółtozielony"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.pl");dijit.nls.loading.pl={"loadingState":"Ładowanie...","errorState":"Niestety, wystąpił błąd"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.pl");dijit.nls.common.pl={"buttonOk":"OK","buttonCancel":"Anuluj","buttonSave":"Zapisz","itemClose":"Zamknij"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.pl");dijit.form.nls.validate.pl={"rangeMessage":"Ta wartość jest spoza zakresu.","invalidMessage":"Wprowadzona wartość jest niepoprawna.","missingMessage":"Ta wartość jest wymagana."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.pl");dijit.form.nls.ComboBox.pl={"previousMessage":"Poprzednie wybory","nextMessage":"Więcej wyborów"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.pl");dojo.cldr.nls.number.pl={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_pl",{"dijit/form/nls/validate":{"rangeMessage":"Ta wartość jest spoza zakresu.","invalidMessage":"Wprowadzona wartość jest niepoprawna.","missingMessage":"Ta wartość jest wymagana."},"dijit/nls/loading":{"loadingState":"Ładowanie...","errorState":"Niestety, wystąpił błąd"},"dojo/nls/colors":{"lightsteelblue":"jasnostalowoniebieski","orangered":"czerwona pomarańcza","midnightblue":"atramentowoniebieski","cadetblue":"szaroniebieski","seashell":"matowoliliowy","slategrey":"mysi","coral":"koralowy","darkturquoise":"ciemnoturkusowy","antiquewhite":"biel antyczna","mediumspringgreen":"średnia wiosenna zieleń","transparent":"przezroczysty","salmon":"łososiowy","darkgrey":"ciemnoszary","ivory":"kość słoniowa","greenyellow":"zielonożółty","mistyrose":"mglistoróżany","lightsalmon":"jasnołososiowy","silver":"srebrny","dimgrey":"przyciemniony szary","orange":"pomarańczowy","white":"biały","navajowhite":"biel Nawaho","royalblue":"królewska purpura","deeppink":"głęboki róż","lime":"limonkowy","oldlace":"ecru","chartreuse":"żółtooliwkowy","darkcyan":"ciemnoniebieskozielony","yellow":"żółty","linen":"lniany","olive":"oliwkowy","gold":"złoty","lawngreen":"trawiasty","lightyellow":"jasnożółty","tan":"śniady","darkviolet":"ciemnofiołkowy","lightslategrey":"jasny mysi","grey":"szary","darkkhaki":"ciemny khaki","green":"zielony","deepskyblue":"intensywny błękit nieba","aqua":"morski","sienna":"sjena","mintcream":"miętowokremowy","rosybrown":"różanobrązowy","mediumslateblue":"średni gołębi","magenta":"amarantowy","lightseagreen":"jasna zieleń morska","cyan":"niebieskozielony","olivedrab":"oliwkowozielony","darkgoldenrod":"ciemne stare złoto","slateblue":"gołębi","mediumaquamarine":"średnia akwamaryna","lavender":"lawendowy","mediumseagreen":"średnia zieleń morska","maroon":"rdzawoczerwony","darkslategray":"ciemny mysi","mediumturquoise":"średni turkusowy","ghostwhite":"sina biel","darkblue":"ciemnoniebieski","mediumvioletred":"średni fiołkowowoczerwony","brown":"brązowy","lightgray":"jasnoszary","sandybrown":"piaskowobrązowy","pink":"różowy","firebrick":"podpalana cegła","indigo":"indygo","snow":"śnieżny","darkorchid":"ciemna orchidea","turquoise":"turkusowy","chocolate":"czekoladowy","springgreen":"wiosenna zieleń","moccasin":"mokasynowy","navy":"granatowy","lemonchiffon":"babka cytrynowa","teal":"zielonomodry","floralwhite":"złamana biel","cornflowerblue":"niebieskochabrowy","paleturquoise":"bladoturkusowy","purple":"fioletowy","gainsboro":"jasnoniebieskawoszary","plum":"śliwkowy","red":"czerwony","blue":"niebieski","forestgreen":"leśna zieleń","darkgreen":"ciemnozielony","honeydew":"miodowy","darkseagreen":"ciemna zieleń morska","lightcoral":"jasnokoralowy","palevioletred":"bladofiołkowoczerwony","mediumpurple":"średni fioletowy","saddlebrown":"brąz skórzany","darkmagenta":"ciemnoamarantowy","thistle":"kwiat ostu","whitesmoke":"siwy","wheat":"pszeniczny","violet":"fiołkowy","lightskyblue":"jasny błękit nieba","goldenrod":"stare złoto","mediumblue":"średni niebieski","skyblue":"błękit nieba","crimson":"karmazynowy","darksalmon":"ciemnołososiowy","darkred":"ciemnoczerwony","darkslategrey":"ciemny mysi","peru":"palona glina","lightgrey":"jasnoszary","lightgoldenrodyellow":"jasne stare złoto","blanchedalmond":"obrany migdał","aliceblue":"bladoniebieski","bisque":"cielistobeżowy","slategray":"mysi","palegoldenrod":"blade stare złoto","darkorange":"ciemnopomarańczowy","aquamarine":"akwamaryna","lightgreen":"jasnozielony","burlywood":"piaskowobeżowy","dodgerblue":"niebieski Dodgersów","darkgray":"ciemnoszary","lightcyan":"jasnoniebieskozielony","powderblue":"jasnobladobłękitny","blueviolet":"błękitnofiołkowy","orchid":"orchidea","dimgray":"przyciemniony szary","beige":"beżowy","fuchsia":"fuksjowy","lavenderblush":"lawendoworóżowy","hotpink":"odblaskoworóżowy","steelblue":"stalowoniebieski","tomato":"pomidorowy","lightpink":"jasnoróżowy","limegreen":"limonkowozielony","indianred":"kasztanowy","papayawhip":"kremowa papaja","lightslategray":"jasny mysi","gray":"szary","mediumorchid":"średnia orchidea","cornsilk":"białożółty","black":"czarny","seagreen":"zieleń morska","darkslateblue":"ciemny gołębi","khaki":"khaki","lightblue":"jasnoniebieski","palegreen":"bladozielony","azure":"lazurowy","peachpuff":"cielisty brzoskwiniowy","darkolivegreen":"ciemnooliwkowozielony","yellowgreen":"żółtozielony"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Poprzednie wybory","nextMessage":"Więcej wyborów"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Anuluj","buttonSave":"Zapisz","itemClose":"Zamknij"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_pl.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_pl.js.uncompressed.js new file mode 100644 index 00000000..5be92aa5 --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_pl.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_pl',{ +'dijit/form/nls/validate':{"rangeMessage":"Ta wartość jest spoza zakresu.","invalidMessage":"Wprowadzona wartość jest niepoprawna.","missingMessage":"Ta wartość jest wymagana."} +, +'dijit/nls/loading':{"loadingState":"Ładowanie...","errorState":"Niestety, wystąpił błąd"} +, +'dojo/nls/colors':{"lightsteelblue":"jasnostalowoniebieski","orangered":"czerwona pomarańcza","midnightblue":"atramentowoniebieski","cadetblue":"szaroniebieski","seashell":"matowoliliowy","slategrey":"mysi","coral":"koralowy","darkturquoise":"ciemnoturkusowy","antiquewhite":"biel antyczna","mediumspringgreen":"średnia wiosenna zieleń","transparent":"przezroczysty","salmon":"łososiowy","darkgrey":"ciemnoszary","ivory":"kość słoniowa","greenyellow":"zielonożółty","mistyrose":"mglistoróżany","lightsalmon":"jasnołososiowy","silver":"srebrny","dimgrey":"przyciemniony szary","orange":"pomarańczowy","white":"biały","navajowhite":"biel Nawaho","royalblue":"królewska purpura","deeppink":"głęboki róż","lime":"limonkowy","oldlace":"ecru","chartreuse":"żółtooliwkowy","darkcyan":"ciemnoniebieskozielony","yellow":"żółty","linen":"lniany","olive":"oliwkowy","gold":"złoty","lawngreen":"trawiasty","lightyellow":"jasnożółty","tan":"śniady","darkviolet":"ciemnofiołkowy","lightslategrey":"jasny mysi","grey":"szary","darkkhaki":"ciemny khaki","green":"zielony","deepskyblue":"intensywny błękit nieba","aqua":"morski","sienna":"sjena","mintcream":"miętowokremowy","rosybrown":"różanobrązowy","mediumslateblue":"średni gołębi","magenta":"amarantowy","lightseagreen":"jasna zieleń morska","cyan":"niebieskozielony","olivedrab":"oliwkowozielony","darkgoldenrod":"ciemne stare złoto","slateblue":"gołębi","mediumaquamarine":"średnia akwamaryna","lavender":"lawendowy","mediumseagreen":"średnia zieleń morska","maroon":"rdzawoczerwony","darkslategray":"ciemny mysi","mediumturquoise":"średni turkusowy","ghostwhite":"sina biel","darkblue":"ciemnoniebieski","mediumvioletred":"średni fiołkowowoczerwony","brown":"brązowy","lightgray":"jasnoszary","sandybrown":"piaskowobrązowy","pink":"różowy","firebrick":"podpalana cegła","indigo":"indygo","snow":"śnieżny","darkorchid":"ciemna orchidea","turquoise":"turkusowy","chocolate":"czekoladowy","springgreen":"wiosenna zieleń","moccasin":"mokasynowy","navy":"granatowy","lemonchiffon":"babka cytrynowa","teal":"zielonomodry","floralwhite":"złamana biel","cornflowerblue":"niebieskochabrowy","paleturquoise":"bladoturkusowy","purple":"fioletowy","gainsboro":"jasnoniebieskawoszary","plum":"śliwkowy","red":"czerwony","blue":"niebieski","forestgreen":"leśna zieleń","darkgreen":"ciemnozielony","honeydew":"miodowy","darkseagreen":"ciemna zieleń morska","lightcoral":"jasnokoralowy","palevioletred":"bladofiołkowoczerwony","mediumpurple":"średni fioletowy","saddlebrown":"brąz skórzany","darkmagenta":"ciemnoamarantowy","thistle":"kwiat ostu","whitesmoke":"siwy","wheat":"pszeniczny","violet":"fiołkowy","lightskyblue":"jasny błękit nieba","goldenrod":"stare złoto","mediumblue":"średni niebieski","skyblue":"błękit nieba","crimson":"karmazynowy","darksalmon":"ciemnołososiowy","darkred":"ciemnoczerwony","darkslategrey":"ciemny mysi","peru":"palona glina","lightgrey":"jasnoszary","lightgoldenrodyellow":"jasne stare złoto","blanchedalmond":"obrany migdał","aliceblue":"bladoniebieski","bisque":"cielistobeżowy","slategray":"mysi","palegoldenrod":"blade stare złoto","darkorange":"ciemnopomarańczowy","aquamarine":"akwamaryna","lightgreen":"jasnozielony","burlywood":"piaskowobeżowy","dodgerblue":"niebieski Dodgersów","darkgray":"ciemnoszary","lightcyan":"jasnoniebieskozielony","powderblue":"jasnobladobłękitny","blueviolet":"błękitnofiołkowy","orchid":"orchidea","dimgray":"przyciemniony szary","beige":"beżowy","fuchsia":"fuksjowy","lavenderblush":"lawendoworóżowy","hotpink":"odblaskoworóżowy","steelblue":"stalowoniebieski","tomato":"pomidorowy","lightpink":"jasnoróżowy","limegreen":"limonkowozielony","indianred":"kasztanowy","papayawhip":"kremowa papaja","lightslategray":"jasny mysi","gray":"szary","mediumorchid":"średnia orchidea","cornsilk":"białożółty","black":"czarny","seagreen":"zieleń morska","darkslateblue":"ciemny gołębi","khaki":"khaki","lightblue":"jasnoniebieski","palegreen":"bladozielony","azure":"lazurowy","peachpuff":"cielisty brzoskwiniowy","darkolivegreen":"ciemnooliwkowozielony","yellowgreen":"żółtozielony"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Poprzednie wybory","nextMessage":"Więcej wyborów"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Anuluj","buttonSave":"Zapisz","itemClose":"Zamknij"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_pt-br.js b/lib/dojo/nls/tt-rss-layer_pt-br.js index c78390e9..9a279f3b 100644 --- a/lib/dojo/nls/tt-rss-layer_pt-br.js +++ b/lib/dojo/nls/tt-rss-layer_pt-br.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_pt-br");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.pt_br");dojo.nls.colors.pt_br={"lightsteelblue":"azul aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadet","seashell":"seashell","slategrey":"cinza ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","salmon":"salmão","darkgrey":"cinza escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa enevoado","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinza turvo","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul royal","deeppink":"rosa profundo","lime":"lima","oldlace":"cadarço velho","chartreuse":"chartreuse","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"oliva","gold":"dourado","lawngreen":"verde grama","lightyellow":"amarelo claro","tan":"tan","darkviolet":"violeta escuro","lightslategrey":"cinza ardósia claro","grey":"cinza","darkkhaki":"cáqui escuro","green":"verde","deepskyblue":"azul céu intenso","aqua":"aqua","sienna":"sienna","mintcream":"creme de menta","rosybrown":"marrom rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"verde oliva","darkgoldenrod":"goldenrod escuro","slateblue":"azul ardósia","mediumaquamarine":"água marinha médio","lavender":"lavanda","mediumseagreen":"verde marinho médio","maroon":"castanho","darkslategray":"cinza ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco ghost","darkblue":"azul escuro","mediumvioletred":"vermelho violeta médio","brown":"marrom","lightgray":"cinza claro","sandybrown":"marrom cor de areia","pink":"rosa","firebrick":"firebrick","indigo":"índigo","snow":"branco neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"moccasin","navy":"marinho","lemonchiffon":"limão chiffon","teal":"azul esverdeado","floralwhite":"branco floral","cornflowerblue":"azul centaurea","paleturquoise":"turquesa esbranquiçado","purple":"roxo","gainsboro":"gainsboro","plum":"ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"honeydew","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"vermelho violeta esbranquiçado","mediumpurple":"roxo médio","saddlebrown":"marrom saddle","darkmagenta":"magenta escuro","thistle":"thistle","whitesmoke":"fumaça branca","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"goldenrod","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinza ardósia escuro","peru":"peru","lightgrey":"cinza claro","lightgoldenrodyellow":"amarelo goldenrod claro","blanchedalmond":"amêndoa pelada","aliceblue":"azul alice","bisque":"bisque","slategray":"cinza ardósia","palegoldenrod":"goldenrod esbranquiçado","darkorange":"laranja escuro","aquamarine":"água marinha","lightgreen":"verde claro","burlywood":"burlywood","dodgerblue":"azul dodger","darkgray":"cinza escuro","lightcyan":"ciano claro","powderblue":"azul talco","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinza turvo","beige":"bege","fuchsia":"fúcsia","lavenderblush":"lavanda avermelhada","hotpink":"rosa quente","steelblue":"azul aço","tomato":"tomate","lightpink":"rosa claro","limegreen":"verde lima","indianred":"vermelho indiano","papayawhip":"creme de papaya","lightslategray":"cinza ardósia claro","gray":"cinza","mediumorchid":"orquídea médio","cornsilk":"cornsilk","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"cáqui","lightblue":"azul claro","palegreen":"verde esbranquiçado","azure":"azul celeste","peachpuff":"peach puff","darkolivegreen":"verde oliva escuro","yellowgreen":"verde amarelado"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.pt_br");dijit.nls.loading.pt_br={"loadingState":"Carregando...","errorState":"Desculpe, ocorreu um erro"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.pt_br");dijit.nls.common.pt_br={"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Salvar","itemClose":"Fechar"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.pt_br");dijit.form.nls.validate.pt_br={"rangeMessage":"Este valor está fora do intervalo. ","invalidMessage":"O valor inserido não é válido.","missingMessage":"Este valor é necessário."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.pt_br");dijit.form.nls.ComboBox.pt_br={"previousMessage":"Opções anteriores","nextMessage":"Mais opções"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.pt_br");dojo.cldr.nls.number.pt_br={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;(¤#,##0.00)","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_pt-br",{"dijit/form/nls/validate":{"rangeMessage":"Este valor está fora do intervalo. ","invalidMessage":"O valor inserido não é válido.","missingMessage":"Este valor é necessário."},"dijit/nls/loading":{"loadingState":"Carregando...","errorState":"Desculpe, ocorreu um erro"},"dojo/nls/colors":{"lightsteelblue":"azul aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadet","seashell":"seashell","slategrey":"cinza ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","transparent":"transparente","salmon":"salmão","darkgrey":"cinza escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa enevoado","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinza turvo","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul royal","deeppink":"rosa profundo","lime":"lima","oldlace":"cadarço velho","chartreuse":"chartreuse","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"oliva","gold":"dourado","lawngreen":"verde grama","lightyellow":"amarelo claro","tan":"tan","darkviolet":"violeta escuro","lightslategrey":"cinza ardósia claro","grey":"cinza","darkkhaki":"cáqui escuro","green":"verde","deepskyblue":"azul céu intenso","aqua":"aqua","sienna":"sienna","mintcream":"creme de menta","rosybrown":"marrom rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"verde oliva","darkgoldenrod":"goldenrod escuro","slateblue":"azul ardósia","mediumaquamarine":"água marinha médio","lavender":"lavanda","mediumseagreen":"verde marinho médio","maroon":"castanho","darkslategray":"cinza ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco ghost","darkblue":"azul escuro","mediumvioletred":"vermelho violeta médio","brown":"marrom","lightgray":"cinza claro","sandybrown":"marrom cor de areia","pink":"rosa","firebrick":"firebrick","indigo":"índigo","snow":"branco neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"moccasin","navy":"marinho","lemonchiffon":"limão chiffon","teal":"azul esverdeado","floralwhite":"branco floral","cornflowerblue":"azul centaurea","paleturquoise":"turquesa esbranquiçado","purple":"roxo","gainsboro":"gainsboro","plum":"ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"honeydew","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"vermelho violeta esbranquiçado","mediumpurple":"roxo médio","saddlebrown":"marrom saddle","darkmagenta":"magenta escuro","thistle":"thistle","whitesmoke":"fumaça branca","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"goldenrod","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinza ardósia escuro","peru":"peru","lightgrey":"cinza claro","lightgoldenrodyellow":"amarelo goldenrod claro","blanchedalmond":"amêndoa pelada","aliceblue":"azul alice","bisque":"bisque","slategray":"cinza ardósia","palegoldenrod":"goldenrod esbranquiçado","darkorange":"laranja escuro","aquamarine":"água marinha","lightgreen":"verde claro","burlywood":"burlywood","dodgerblue":"azul dodger","darkgray":"cinza escuro","lightcyan":"ciano claro","powderblue":"azul talco","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinza turvo","beige":"bege","fuchsia":"fúcsia","lavenderblush":"lavanda avermelhada","hotpink":"rosa quente","steelblue":"azul aço","tomato":"tomate","lightpink":"rosa claro","limegreen":"verde lima","indianred":"vermelho indiano","papayawhip":"creme de papaya","lightslategray":"cinza ardósia claro","gray":"cinza","mediumorchid":"orquídea médio","cornsilk":"cornsilk","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"cáqui","lightblue":"azul claro","palegreen":"verde esbranquiçado","azure":"azul celeste","peachpuff":"peach puff","darkolivegreen":"verde oliva escuro","yellowgreen":"verde amarelado"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00;(¤#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Opções anteriores","nextMessage":"Mais opções"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Salvar","itemClose":"Fechar"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_pt-br.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_pt-br.js.uncompressed.js new file mode 100644 index 00000000..0f5f2dfa --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_pt-br.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_pt-br',{ +'dijit/form/nls/validate':{"rangeMessage":"Este valor está fora do intervalo. ","invalidMessage":"O valor inserido não é válido.","missingMessage":"Este valor é necessário."} +, +'dijit/nls/loading':{"loadingState":"Carregando...","errorState":"Desculpe, ocorreu um erro"} +, +'dojo/nls/colors':{"lightsteelblue":"azul aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadet","seashell":"seashell","slategrey":"cinza ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","transparent":"transparente","salmon":"salmão","darkgrey":"cinza escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa enevoado","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinza turvo","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul royal","deeppink":"rosa profundo","lime":"lima","oldlace":"cadarço velho","chartreuse":"chartreuse","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"oliva","gold":"dourado","lawngreen":"verde grama","lightyellow":"amarelo claro","tan":"tan","darkviolet":"violeta escuro","lightslategrey":"cinza ardósia claro","grey":"cinza","darkkhaki":"cáqui escuro","green":"verde","deepskyblue":"azul céu intenso","aqua":"aqua","sienna":"sienna","mintcream":"creme de menta","rosybrown":"marrom rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"verde oliva","darkgoldenrod":"goldenrod escuro","slateblue":"azul ardósia","mediumaquamarine":"água marinha médio","lavender":"lavanda","mediumseagreen":"verde marinho médio","maroon":"castanho","darkslategray":"cinza ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco ghost","darkblue":"azul escuro","mediumvioletred":"vermelho violeta médio","brown":"marrom","lightgray":"cinza claro","sandybrown":"marrom cor de areia","pink":"rosa","firebrick":"firebrick","indigo":"índigo","snow":"branco neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"moccasin","navy":"marinho","lemonchiffon":"limão chiffon","teal":"azul esverdeado","floralwhite":"branco floral","cornflowerblue":"azul centaurea","paleturquoise":"turquesa esbranquiçado","purple":"roxo","gainsboro":"gainsboro","plum":"ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"honeydew","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"vermelho violeta esbranquiçado","mediumpurple":"roxo médio","saddlebrown":"marrom saddle","darkmagenta":"magenta escuro","thistle":"thistle","whitesmoke":"fumaça branca","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"goldenrod","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinza ardósia escuro","peru":"peru","lightgrey":"cinza claro","lightgoldenrodyellow":"amarelo goldenrod claro","blanchedalmond":"amêndoa pelada","aliceblue":"azul alice","bisque":"bisque","slategray":"cinza ardósia","palegoldenrod":"goldenrod esbranquiçado","darkorange":"laranja escuro","aquamarine":"água marinha","lightgreen":"verde claro","burlywood":"burlywood","dodgerblue":"azul dodger","darkgray":"cinza escuro","lightcyan":"ciano claro","powderblue":"azul talco","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinza turvo","beige":"bege","fuchsia":"fúcsia","lavenderblush":"lavanda avermelhada","hotpink":"rosa quente","steelblue":"azul aço","tomato":"tomate","lightpink":"rosa claro","limegreen":"verde lima","indianred":"vermelho indiano","papayawhip":"creme de papaya","lightslategray":"cinza ardósia claro","gray":"cinza","mediumorchid":"orquídea médio","cornsilk":"cornsilk","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"cáqui","lightblue":"azul claro","palegreen":"verde esbranquiçado","azure":"azul celeste","peachpuff":"peach puff","darkolivegreen":"verde oliva escuro","yellowgreen":"verde amarelado"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00;(¤#,##0.00)","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Opções anteriores","nextMessage":"Mais opções"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Salvar","itemClose":"Fechar"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_pt-pt.js b/lib/dojo/nls/tt-rss-layer_pt-pt.js index 7e805cd0..63440b1c 100644 --- a/lib/dojo/nls/tt-rss-layer_pt-pt.js +++ b/lib/dojo/nls/tt-rss-layer_pt-pt.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_pt-pt");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.pt_pt");dojo.nls.colors.pt_pt={"lightsteelblue":"azul-aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadete","seashell":"concha","slategrey":"cinzento ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","salmon":"salmão","darkgrey":"cinzento escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa pálido","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinzento esbatido","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul real","deeppink":"rosa profundo","lime":"lima","oldlace":"renda antiga","chartreuse":"amarelo esverdeado","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"azeitona","gold":"dourado","lawngreen":"verde relva","lightyellow":"amarelo claro","tan":"castanho claro","darkviolet":"violeta escuro","lightslategrey":"cinzento ardósia claro","grey":"cinzento","darkkhaki":"caqui escuro","green":"verde","deepskyblue":"azul céu profundo","aqua":"verde-água","sienna":"castanho-avermelhado","mintcream":"creme de menta","rosybrown":"castanho rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"azeitona claro","darkgoldenrod":"ouro velho escuro","slateblue":"azul ardósia","mediumaquamarine":"verde-azulado médio","lavender":"alfazema","mediumseagreen":"verde marinho médio","maroon":"bordeaux","darkslategray":"cinzento ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco sombreado","darkblue":"azul escuro","mediumvioletred":"violeta avermelhado médio","brown":"castanho","lightgray":"cinzento claro","sandybrown":"castanho areia","pink":"rosa","firebrick":"tijolo fogo","indigo":"índigo","snow":"branco-neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"mocassim","navy":"azul marinho","lemonchiffon":"limão chiffon","teal":"verde-azulado","floralwhite":"branco floral","cornflowerblue":"azul-violáceo","paleturquoise":"turquesa pálido","purple":"roxo","gainsboro":"cinzento azulado claro","plum":"cor-de-ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"mel","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"violeta avermelhado pálido","mediumpurple":"roxo médio","saddlebrown":"castanho sela","darkmagenta":"magenta escuro","thistle":"cardo","whitesmoke":"fumo branco","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"ouro velho","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinzento ardósia escuro","peru":"peru","lightgrey":"cinzento claro","lightgoldenrodyellow":"ouro velho amarelado claro","blanchedalmond":"amêndoa claro","aliceblue":"azul alice","bisque":"rosa-velho","slategray":"cinzento ardósia","palegoldenrod":"ouro velho pálido","darkorange":"laranja escuro","aquamarine":"verde-azulado","lightgreen":"verde claro","burlywood":"castanho pinho","dodgerblue":"azul furtivo","darkgray":"cinzento escuro","lightcyan":"ciano claro","powderblue":"azul de esmalte","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinzento esbatido","beige":"bege","fuchsia":"fúcsia","lavenderblush":"alfazema rosado","hotpink":"rosa forte","steelblue":"azul-aço","tomato":"vermelho tomate","lightpink":"rosa claro","limegreen":"verde-lima","indianred":"almagre","papayawhip":"creme de papaia","lightslategray":"cinzento ardósia claro","gray":"cinzento","mediumorchid":"orquídea médio","cornsilk":"branco seda","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"azul-celeste","peachpuff":"pêssego","darkolivegreen":"verde-azeitona escuro","yellowgreen":"verde amarelado"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.pt_pt");dijit.nls.loading.pt_pt={"loadingState":"A carregar...","errorState":"Lamentamos, mas ocorreu um erro"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.pt_pt");dijit.nls.common.pt_pt={"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Fechar"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.pt_pt");dijit.form.nls.validate.pt_pt={"rangeMessage":"Este valor encontra-se fora do intervalo.","invalidMessage":"O valor introduzido não é válido.","missingMessage":"Este valor é requerido."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.pt_pt");dijit.form.nls.ComboBox.pt_pt={"previousMessage":"Opções anteriores","nextMessage":"Mais opções"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.pt_pt");dojo.cldr.nls.number.pt_pt={"currencyFormat":"#,##0.00 ¤","group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_pt-pt",{"dijit/form/nls/validate":{"rangeMessage":"Este valor encontra-se fora do intervalo.","invalidMessage":"O valor introduzido não é válido.","missingMessage":"Este valor é requerido."},"dijit/nls/loading":{"loadingState":"A carregar...","errorState":"Lamentamos, mas ocorreu um erro"},"dojo/nls/colors":{"lightsteelblue":"azul-aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadete","seashell":"concha","slategrey":"cinzento ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","transparent":"transparente","salmon":"salmão","darkgrey":"cinzento escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa pálido","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinzento esbatido","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul real","deeppink":"rosa profundo","lime":"lima","oldlace":"renda antiga","chartreuse":"amarelo esverdeado","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"azeitona","gold":"dourado","lawngreen":"verde relva","lightyellow":"amarelo claro","tan":"castanho claro","darkviolet":"violeta escuro","lightslategrey":"cinzento ardósia claro","grey":"cinzento","darkkhaki":"caqui escuro","green":"verde","deepskyblue":"azul céu profundo","aqua":"verde-água","sienna":"castanho-avermelhado","mintcream":"creme de menta","rosybrown":"castanho rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"azeitona claro","darkgoldenrod":"ouro velho escuro","slateblue":"azul ardósia","mediumaquamarine":"verde-azulado médio","lavender":"alfazema","mediumseagreen":"verde marinho médio","maroon":"bordeaux","darkslategray":"cinzento ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco sombreado","darkblue":"azul escuro","mediumvioletred":"violeta avermelhado médio","brown":"castanho","lightgray":"cinzento claro","sandybrown":"castanho areia","pink":"rosa","firebrick":"tijolo fogo","indigo":"índigo","snow":"branco-neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"mocassim","navy":"azul marinho","lemonchiffon":"limão chiffon","teal":"verde-azulado","floralwhite":"branco floral","cornflowerblue":"azul-violáceo","paleturquoise":"turquesa pálido","purple":"roxo","gainsboro":"cinzento azulado claro","plum":"cor-de-ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"mel","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"violeta avermelhado pálido","mediumpurple":"roxo médio","saddlebrown":"castanho sela","darkmagenta":"magenta escuro","thistle":"cardo","whitesmoke":"fumo branco","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"ouro velho","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinzento ardósia escuro","peru":"peru","lightgrey":"cinzento claro","lightgoldenrodyellow":"ouro velho amarelado claro","blanchedalmond":"amêndoa claro","aliceblue":"azul alice","bisque":"rosa-velho","slategray":"cinzento ardósia","palegoldenrod":"ouro velho pálido","darkorange":"laranja escuro","aquamarine":"verde-azulado","lightgreen":"verde claro","burlywood":"castanho pinho","dodgerblue":"azul furtivo","darkgray":"cinzento escuro","lightcyan":"ciano claro","powderblue":"azul de esmalte","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinzento esbatido","beige":"bege","fuchsia":"fúcsia","lavenderblush":"alfazema rosado","hotpink":"rosa forte","steelblue":"azul-aço","tomato":"vermelho tomate","lightpink":"rosa claro","limegreen":"verde-lima","indianred":"almagre","papayawhip":"creme de papaia","lightslategray":"cinzento ardósia claro","gray":"cinzento","mediumorchid":"orquídea médio","cornsilk":"branco seda","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"azul-celeste","peachpuff":"pêssego","darkolivegreen":"verde-azeitona escuro","yellowgreen":"verde amarelado"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Opções anteriores","nextMessage":"Mais opções"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Fechar"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_pt-pt.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_pt-pt.js.uncompressed.js new file mode 100644 index 00000000..cdf2af2e --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_pt-pt.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_pt-pt',{ +'dijit/form/nls/validate':{"rangeMessage":"Este valor encontra-se fora do intervalo.","invalidMessage":"O valor introduzido não é válido.","missingMessage":"Este valor é requerido."} +, +'dijit/nls/loading':{"loadingState":"A carregar...","errorState":"Lamentamos, mas ocorreu um erro"} +, +'dojo/nls/colors':{"lightsteelblue":"azul-aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadete","seashell":"concha","slategrey":"cinzento ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","transparent":"transparente","salmon":"salmão","darkgrey":"cinzento escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa pálido","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinzento esbatido","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul real","deeppink":"rosa profundo","lime":"lima","oldlace":"renda antiga","chartreuse":"amarelo esverdeado","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"azeitona","gold":"dourado","lawngreen":"verde relva","lightyellow":"amarelo claro","tan":"castanho claro","darkviolet":"violeta escuro","lightslategrey":"cinzento ardósia claro","grey":"cinzento","darkkhaki":"caqui escuro","green":"verde","deepskyblue":"azul céu profundo","aqua":"verde-água","sienna":"castanho-avermelhado","mintcream":"creme de menta","rosybrown":"castanho rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"azeitona claro","darkgoldenrod":"ouro velho escuro","slateblue":"azul ardósia","mediumaquamarine":"verde-azulado médio","lavender":"alfazema","mediumseagreen":"verde marinho médio","maroon":"bordeaux","darkslategray":"cinzento ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco sombreado","darkblue":"azul escuro","mediumvioletred":"violeta avermelhado médio","brown":"castanho","lightgray":"cinzento claro","sandybrown":"castanho areia","pink":"rosa","firebrick":"tijolo fogo","indigo":"índigo","snow":"branco-neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"mocassim","navy":"azul marinho","lemonchiffon":"limão chiffon","teal":"verde-azulado","floralwhite":"branco floral","cornflowerblue":"azul-violáceo","paleturquoise":"turquesa pálido","purple":"roxo","gainsboro":"cinzento azulado claro","plum":"cor-de-ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"mel","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"violeta avermelhado pálido","mediumpurple":"roxo médio","saddlebrown":"castanho sela","darkmagenta":"magenta escuro","thistle":"cardo","whitesmoke":"fumo branco","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"ouro velho","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinzento ardósia escuro","peru":"peru","lightgrey":"cinzento claro","lightgoldenrodyellow":"ouro velho amarelado claro","blanchedalmond":"amêndoa claro","aliceblue":"azul alice","bisque":"rosa-velho","slategray":"cinzento ardósia","palegoldenrod":"ouro velho pálido","darkorange":"laranja escuro","aquamarine":"verde-azulado","lightgreen":"verde claro","burlywood":"castanho pinho","dodgerblue":"azul furtivo","darkgray":"cinzento escuro","lightcyan":"ciano claro","powderblue":"azul de esmalte","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinzento esbatido","beige":"bege","fuchsia":"fúcsia","lavenderblush":"alfazema rosado","hotpink":"rosa forte","steelblue":"azul-aço","tomato":"vermelho tomate","lightpink":"rosa claro","limegreen":"verde-lima","indianred":"almagre","papayawhip":"creme de papaia","lightslategray":"cinzento ardósia claro","gray":"cinzento","mediumorchid":"orquídea médio","cornsilk":"branco seda","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"caqui","lightblue":"azul claro","palegreen":"verde pálido","azure":"azul-celeste","peachpuff":"pêssego","darkolivegreen":"verde-azeitona escuro","yellowgreen":"verde amarelado"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Opções anteriores","nextMessage":"Mais opções"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Guardar","itemClose":"Fechar"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_pt.js b/lib/dojo/nls/tt-rss-layer_pt.js deleted file mode 100644 index 8cc90f5c..00000000 --- a/lib/dojo/nls/tt-rss-layer_pt.js +++ /dev/null @@ -1 +0,0 @@ -dojo.provide("dojo.nls.tt-rss-layer_pt");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.pt");dojo.nls.colors.pt={"lightsteelblue":"azul aço claro","orangered":"vermelho alaranjado","midnightblue":"azul meia-noite","cadetblue":"azul cadet","seashell":"seashell","slategrey":"cinza ardósia","coral":"coral","darkturquoise":"turquesa escuro","antiquewhite":"branco antigo","mediumspringgreen":"verde primavera médio","salmon":"salmão","darkgrey":"cinza escuro","ivory":"marfim","greenyellow":"amarelo esverdeado","mistyrose":"rosa enevoado","lightsalmon":"salmão claro","silver":"prateado","dimgrey":"cinza turvo","orange":"laranja","white":"branco","navajowhite":"branco navajo","royalblue":"azul royal","deeppink":"rosa profundo","lime":"lima","oldlace":"cadarço velho","chartreuse":"chartreuse","darkcyan":"ciano escuro","yellow":"amarelo","linen":"linho","olive":"oliva","gold":"dourado","lawngreen":"verde grama","lightyellow":"amarelo claro","tan":"tan","darkviolet":"violeta escuro","lightslategrey":"cinza ardósia claro","grey":"cinza","darkkhaki":"cáqui escuro","green":"verde","deepskyblue":"azul céu intenso","aqua":"aqua","sienna":"sienna","mintcream":"creme de menta","rosybrown":"marrom rosado","mediumslateblue":"azul ardósia médio","magenta":"magenta","lightseagreen":"verde marinho claro","cyan":"ciano","olivedrab":"verde oliva","darkgoldenrod":"goldenrod escuro","slateblue":"azul ardósia","mediumaquamarine":"água marinha médio","lavender":"lavanda","mediumseagreen":"verde marinho médio","maroon":"castanho","darkslategray":"cinza ardósia escuro","mediumturquoise":"turquesa médio","ghostwhite":"branco ghost","darkblue":"azul escuro","mediumvioletred":"vermelho violeta médio","brown":"marrom","lightgray":"cinza claro","sandybrown":"marrom cor de areia","pink":"rosa","firebrick":"firebrick","indigo":"índigo","snow":"branco neve","darkorchid":"orquídea escuro","turquoise":"turquesa","chocolate":"chocolate","springgreen":"verde primavera","moccasin":"moccasin","navy":"marinho","lemonchiffon":"limão chiffon","teal":"azul esverdeado","floralwhite":"branco floral","cornflowerblue":"azul centaurea","paleturquoise":"turquesa esbranquiçado","purple":"roxo","gainsboro":"gainsboro","plum":"ameixa","red":"vermelho","blue":"azul","forestgreen":"verde floresta","darkgreen":"verde escuro","honeydew":"honeydew","darkseagreen":"verde marinho escuro","lightcoral":"coral claro","palevioletred":"vermelho violeta esbranquiçado","mediumpurple":"roxo médio","saddlebrown":"marrom saddle","darkmagenta":"magenta escuro","thistle":"thistle","whitesmoke":"fumaça branca","wheat":"trigo","violet":"violeta","lightskyblue":"azul céu claro","goldenrod":"goldenrod","mediumblue":"azul médio","skyblue":"azul céu","crimson":"carmesim","darksalmon":"salmão escuro","darkred":"vermelho escuro","darkslategrey":"cinza ardósia escuro","peru":"peru","lightgrey":"cinza claro","lightgoldenrodyellow":"amarelo goldenrod claro","blanchedalmond":"amêndoa pelada","aliceblue":"azul alice","bisque":"bisque","slategray":"cinza ardósia","palegoldenrod":"goldenrod esbranquiçado","darkorange":"laranja escuro","aquamarine":"água marinha","lightgreen":"verde claro","burlywood":"burlywood","dodgerblue":"azul dodger","darkgray":"cinza escuro","lightcyan":"ciano claro","powderblue":"azul talco","blueviolet":"azul violeta","orchid":"orquídea","dimgray":"cinza turvo","beige":"bege","fuchsia":"fúcsia","lavenderblush":"lavanda avermelhada","hotpink":"rosa quente","steelblue":"azul aço","tomato":"tomate","lightpink":"rosa claro","limegreen":"verde lima","indianred":"vermelho indiano","papayawhip":"creme de papaya","lightslategray":"cinza ardósia claro","gray":"cinza","mediumorchid":"orquídea médio","cornsilk":"cornsilk","black":"preto","seagreen":"verde marinho","darkslateblue":"azul ardósia escuro","khaki":"cáqui","lightblue":"azul claro","palegreen":"verde esbranquiçado","azure":"azul celeste","peachpuff":"peach puff","darkolivegreen":"verde oliva escuro","yellowgreen":"verde amarelado"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.pt");dijit.nls.loading.pt={"loadingState":"Carregando...","errorState":"Desculpe, ocorreu um erro"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.pt");dijit.nls.common.pt={"buttonOk":"OK","buttonCancel":"Cancelar","buttonSave":"Salvar","itemClose":"Fechar"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.pt");dijit.form.nls.validate.pt={"rangeMessage":"Este valor está fora do intervalo. ","invalidMessage":"O valor inserido não é válido.","missingMessage":"Este valor é necessário."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.pt");dijit.form.nls.ComboBox.pt={"previousMessage":"Opções anteriores","nextMessage":"Mais opções"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.pt");dojo.cldr.nls.number.pt={"group":".","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;(¤#,##0.00)","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; diff --git a/lib/dojo/nls/tt-rss-layer_ru.js b/lib/dojo/nls/tt-rss-layer_ru.js index 293429a4..d2fe7075 100644 --- a/lib/dojo/nls/tt-rss-layer_ru.js +++ b/lib/dojo/nls/tt-rss-layer_ru.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_ru");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.ru");dojo.nls.colors.ru={"lightsteelblue":"светлый стальной","orangered":"оранжево-красный","midnightblue":"полуночно-синий","cadetblue":"серо-синий","seashell":"морская раковина","slategrey":"грифельно-серый","coral":"коралловый","darkturquoise":"темный бирюзовый","antiquewhite":"белый антик","mediumspringgreen":"нейтральный весенне-зеленый","salmon":"лососевый","darkgrey":"темно-серый","ivory":"слоновой кости","greenyellow":"зелено-желтый","mistyrose":"блекло-розовый","lightsalmon":"светло-лососевый","silver":"серебристый","dimgrey":"тускло-серый","orange":"оранжевый","white":"белый","navajowhite":"белый навахо","royalblue":"королевский голубой","deeppink":"темно-розовый","lime":"лайм","oldlace":"матово-белый","chartreuse":"желто-салатный","darkcyan":"темный циан","yellow":"желтый","linen":"хлопковый","olive":"оливковый","gold":"золотой","lawngreen":"зеленая лужайка","lightyellow":"светло-желтый","tan":"рыжевато-коричневый","darkviolet":"темно-фиолетовый","lightslategrey":"светлый грифельно-серый","grey":"серый","darkkhaki":"темный хаки","green":"зеленый","deepskyblue":"темный небесно-голубой","aqua":"зеленовато-голубой","sienna":"охра","mintcream":"мятно-кремовый","rosybrown":"розово-коричневый","mediumslateblue":"нейтральный грифельно-синий","magenta":"пурпурный","lightseagreen":"светлый морской волны","cyan":"циан","olivedrab":"желтовато-серый","darkgoldenrod":"темно-золотистый","slateblue":"грифельно-синий","mediumaquamarine":"нейтральный аквамарин","lavender":"бледно-лиловый","mediumseagreen":"нейтральный морской волны","maroon":"темно-бордовый","darkslategray":"темный грифельно-серый","mediumturquoise":"нейтральный бирюзовый","ghostwhite":"призрачно-белый","darkblue":"темно-синий","mediumvioletred":"нейтральный фиолетово-красный","brown":"коричневый","lightgray":"светло-серый","sandybrown":"коричнево-песчаный","pink":"розовый","firebrick":"кирпичный","indigo":"индиго","snow":"белоснежный","darkorchid":"темный орсель","turquoise":"бирюзовый","chocolate":"шоколадный","springgreen":"весенний зеленый","moccasin":"мокасин","navy":"темно-синий","lemonchiffon":"бледно-лимонный","teal":"чирок","floralwhite":"цветочно-белый","cornflowerblue":"фиолетово-синий","paleturquoise":"бледно-бирюзовый","purple":"фиолетовый","gainsboro":"бледно-серый","plum":"сливовый","red":"красный","blue":"синий","forestgreen":"зеленый лесной","darkgreen":"темно-зеленый","honeydew":"медовый","darkseagreen":"темный морской волны","lightcoral":"светло-коралловый","palevioletred":"бледный фиолетово-красный","mediumpurple":"нейтральный фиолетовый","saddlebrown":"кожано-коричневый","darkmagenta":"темно-пурпурный","thistle":"чертополох","whitesmoke":"дымчато-белый","wheat":"пшеница","violet":"фиолетовый","lightskyblue":"светлый небесно-голубой","goldenrod":"золотистый","mediumblue":"нейтральный синий","skyblue":"небесно-голубой","crimson":"малиновый","darksalmon":"темно-лососевый","darkred":"темно-красный","darkslategrey":"темный грифельно-серый","peru":"перу","lightgrey":"светло-серый","lightgoldenrodyellow":"светло-золотистый","blanchedalmond":"светло-миндальный","aliceblue":"серо-голубой","bisque":"бисквитный","slategray":"грифельно-серый","palegoldenrod":"бледно-золотистый","darkorange":"темно-оранжевый","aquamarine":"аквамарин","lightgreen":"светло-зеленый","burlywood":"светло-коричневый","dodgerblue":"бледно-синий","darkgray":"темно-серый","lightcyan":"светлый циан","powderblue":"пороховой","blueviolet":"сине-фиолетовый","orchid":"орсель","dimgray":"тускло-серый","beige":"бежевый","fuchsia":"фуксин","lavenderblush":"розовато-лиловый","hotpink":"красно-розовый","steelblue":"стальной","tomato":"помидор","lightpink":"светло-розовый","limegreen":"зеленый лайм","indianred":"индийский красный","papayawhip":"черенок папайи","lightslategray":"светлый грифельно-серый","gray":"серый","mediumorchid":"нейтральный орсель","cornsilk":"шелковый оттенок","black":"черный","seagreen":"морской волны","darkslateblue":"темный грифельно-синий","khaki":"хаки","lightblue":"светло-синий","palegreen":"бледно-зеленый","azure":"лазурный","peachpuff":"персиковый","darkolivegreen":"темно-оливковый","yellowgreen":"желто-зеленый"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.ru");dijit.nls.loading.ru={"loadingState":"Загрузка...","errorState":"Извините, возникла ошибка"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.ru");dijit.nls.common.ru={"buttonOk":"ОК","buttonCancel":"Отмена","buttonSave":"Сохранить","itemClose":"Закрыть"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.ru");dijit.form.nls.validate.ru={"rangeMessage":"Это значение вне диапазона.","invalidMessage":"Указано недопустимое значение.","missingMessage":"Это обязательное значение."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.ru");dijit.form.nls.ComboBox.ru={"previousMessage":"Предыдущие варианты","nextMessage":"Следующие варианты"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.ru");dojo.cldr.nls.number.ru={"group":" ","percentSign":"%","exponential":"E","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_ru",{"dijit/form/nls/validate":{"rangeMessage":"Это значение вне диапазона.","invalidMessage":"Указано недопустимое значение.","missingMessage":"Это обязательное значение."},"dijit/nls/loading":{"loadingState":"Загрузка...","errorState":"Извините, возникла ошибка"},"dojo/nls/colors":{"lightsteelblue":"светлый стальной","orangered":"оранжево-красный","midnightblue":"полуночно-синий","cadetblue":"серо-синий","seashell":"морская раковина","slategrey":"грифельно-серый","coral":"коралловый","darkturquoise":"темный бирюзовый","antiquewhite":"белый антик","mediumspringgreen":"нейтральный весенне-зеленый","transparent":"прозрачный","salmon":"лососевый","darkgrey":"темно-серый","ivory":"слоновой кости","greenyellow":"зелено-желтый","mistyrose":"блекло-розовый","lightsalmon":"светло-лососевый","silver":"серебристый","dimgrey":"тускло-серый","orange":"оранжевый","white":"белый","navajowhite":"белый навахо","royalblue":"королевский голубой","deeppink":"темно-розовый","lime":"лайм","oldlace":"матово-белый","chartreuse":"желто-салатный","darkcyan":"темный циан","yellow":"желтый","linen":"хлопковый","olive":"оливковый","gold":"золотой","lawngreen":"зеленая лужайка","lightyellow":"светло-желтый","tan":"рыжевато-коричневый","darkviolet":"темно-фиолетовый","lightslategrey":"светлый грифельно-серый","grey":"серый","darkkhaki":"темный хаки","green":"зеленый","deepskyblue":"темный небесно-голубой","aqua":"зеленовато-голубой","sienna":"охра","mintcream":"мятно-кремовый","rosybrown":"розово-коричневый","mediumslateblue":"нейтральный грифельно-синий","magenta":"пурпурный","lightseagreen":"светлый морской волны","cyan":"циан","olivedrab":"желтовато-серый","darkgoldenrod":"темно-золотистый","slateblue":"грифельно-синий","mediumaquamarine":"нейтральный аквамарин","lavender":"бледно-лиловый","mediumseagreen":"нейтральный морской волны","maroon":"темно-бордовый","darkslategray":"темный грифельно-серый","mediumturquoise":"нейтральный бирюзовый","ghostwhite":"призрачно-белый","darkblue":"темно-синий","mediumvioletred":"нейтральный фиолетово-красный","brown":"коричневый","lightgray":"светло-серый","sandybrown":"коричнево-песчаный","pink":"розовый","firebrick":"кирпичный","indigo":"индиго","snow":"белоснежный","darkorchid":"темный орсель","turquoise":"бирюзовый","chocolate":"шоколадный","springgreen":"весенний зеленый","moccasin":"мокасин","navy":"темно-синий","lemonchiffon":"бледно-лимонный","teal":"чирок","floralwhite":"цветочно-белый","cornflowerblue":"фиолетово-синий","paleturquoise":"бледно-бирюзовый","purple":"фиолетовый","gainsboro":"бледно-серый","plum":"сливовый","red":"красный","blue":"синий","forestgreen":"зеленый лесной","darkgreen":"темно-зеленый","honeydew":"медовый","darkseagreen":"темный морской волны","lightcoral":"светло-коралловый","palevioletred":"бледный фиолетово-красный","mediumpurple":"нейтральный фиолетовый","saddlebrown":"кожано-коричневый","darkmagenta":"темно-пурпурный","thistle":"чертополох","whitesmoke":"дымчато-белый","wheat":"пшеница","violet":"фиолетовый","lightskyblue":"светлый небесно-голубой","goldenrod":"золотистый","mediumblue":"нейтральный синий","skyblue":"небесно-голубой","crimson":"малиновый","darksalmon":"темно-лососевый","darkred":"темно-красный","darkslategrey":"темный грифельно-серый","peru":"перу","lightgrey":"светло-серый","lightgoldenrodyellow":"светло-золотистый","blanchedalmond":"светло-миндальный","aliceblue":"серо-голубой","bisque":"бисквитный","slategray":"грифельно-серый","palegoldenrod":"бледно-золотистый","darkorange":"темно-оранжевый","aquamarine":"аквамарин","lightgreen":"светло-зеленый","burlywood":"светло-коричневый","dodgerblue":"бледно-синий","darkgray":"темно-серый","lightcyan":"светлый циан","powderblue":"пороховой","blueviolet":"сине-фиолетовый","orchid":"орсель","dimgray":"тускло-серый","beige":"бежевый","fuchsia":"фуксин","lavenderblush":"розовато-лиловый","hotpink":"красно-розовый","steelblue":"стальной","tomato":"помидор","lightpink":"светло-розовый","limegreen":"зеленый лайм","indianred":"индийский красный","papayawhip":"черенок папайи","lightslategray":"светлый грифельно-серый","gray":"серый","mediumorchid":"нейтральный орсель","cornsilk":"шелковый оттенок","black":"черный","seagreen":"морской волны","darkslateblue":"темный грифельно-синий","khaki":"хаки","lightblue":"светло-синий","palegreen":"бледно-зеленый","azure":"лазурный","peachpuff":"персиковый","darkolivegreen":"темно-оливковый","yellowgreen":"желто-зеленый"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Предыдущие варианты","nextMessage":"Следующие варианты"},"dijit/nls/common":{"buttonOk":"ОК","buttonCancel":"Отмена","buttonSave":"Сохранить","itemClose":"Закрыть"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_ru.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_ru.js.uncompressed.js new file mode 100644 index 00000000..84fbc91d --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_ru.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_ru',{ +'dijit/form/nls/validate':{"rangeMessage":"Это значение вне диапазона.","invalidMessage":"Указано недопустимое значение.","missingMessage":"Это обязательное значение."} +, +'dijit/nls/loading':{"loadingState":"Загрузка...","errorState":"Извините, возникла ошибка"} +, +'dojo/nls/colors':{"lightsteelblue":"светлый стальной","orangered":"оранжево-красный","midnightblue":"полуночно-синий","cadetblue":"серо-синий","seashell":"морская раковина","slategrey":"грифельно-серый","coral":"коралловый","darkturquoise":"темный бирюзовый","antiquewhite":"белый антик","mediumspringgreen":"нейтральный весенне-зеленый","transparent":"прозрачный","salmon":"лососевый","darkgrey":"темно-серый","ivory":"слоновой кости","greenyellow":"зелено-желтый","mistyrose":"блекло-розовый","lightsalmon":"светло-лососевый","silver":"серебристый","dimgrey":"тускло-серый","orange":"оранжевый","white":"белый","navajowhite":"белый навахо","royalblue":"королевский голубой","deeppink":"темно-розовый","lime":"лайм","oldlace":"матово-белый","chartreuse":"желто-салатный","darkcyan":"темный циан","yellow":"желтый","linen":"хлопковый","olive":"оливковый","gold":"золотой","lawngreen":"зеленая лужайка","lightyellow":"светло-желтый","tan":"рыжевато-коричневый","darkviolet":"темно-фиолетовый","lightslategrey":"светлый грифельно-серый","grey":"серый","darkkhaki":"темный хаки","green":"зеленый","deepskyblue":"темный небесно-голубой","aqua":"зеленовато-голубой","sienna":"охра","mintcream":"мятно-кремовый","rosybrown":"розово-коричневый","mediumslateblue":"нейтральный грифельно-синий","magenta":"пурпурный","lightseagreen":"светлый морской волны","cyan":"циан","olivedrab":"желтовато-серый","darkgoldenrod":"темно-золотистый","slateblue":"грифельно-синий","mediumaquamarine":"нейтральный аквамарин","lavender":"бледно-лиловый","mediumseagreen":"нейтральный морской волны","maroon":"темно-бордовый","darkslategray":"темный грифельно-серый","mediumturquoise":"нейтральный бирюзовый","ghostwhite":"призрачно-белый","darkblue":"темно-синий","mediumvioletred":"нейтральный фиолетово-красный","brown":"коричневый","lightgray":"светло-серый","sandybrown":"коричнево-песчаный","pink":"розовый","firebrick":"кирпичный","indigo":"индиго","snow":"белоснежный","darkorchid":"темный орсель","turquoise":"бирюзовый","chocolate":"шоколадный","springgreen":"весенний зеленый","moccasin":"мокасин","navy":"темно-синий","lemonchiffon":"бледно-лимонный","teal":"чирок","floralwhite":"цветочно-белый","cornflowerblue":"фиолетово-синий","paleturquoise":"бледно-бирюзовый","purple":"фиолетовый","gainsboro":"бледно-серый","plum":"сливовый","red":"красный","blue":"синий","forestgreen":"зеленый лесной","darkgreen":"темно-зеленый","honeydew":"медовый","darkseagreen":"темный морской волны","lightcoral":"светло-коралловый","palevioletred":"бледный фиолетово-красный","mediumpurple":"нейтральный фиолетовый","saddlebrown":"кожано-коричневый","darkmagenta":"темно-пурпурный","thistle":"чертополох","whitesmoke":"дымчато-белый","wheat":"пшеница","violet":"фиолетовый","lightskyblue":"светлый небесно-голубой","goldenrod":"золотистый","mediumblue":"нейтральный синий","skyblue":"небесно-голубой","crimson":"малиновый","darksalmon":"темно-лососевый","darkred":"темно-красный","darkslategrey":"темный грифельно-серый","peru":"перу","lightgrey":"светло-серый","lightgoldenrodyellow":"светло-золотистый","blanchedalmond":"светло-миндальный","aliceblue":"серо-голубой","bisque":"бисквитный","slategray":"грифельно-серый","palegoldenrod":"бледно-золотистый","darkorange":"темно-оранжевый","aquamarine":"аквамарин","lightgreen":"светло-зеленый","burlywood":"светло-коричневый","dodgerblue":"бледно-синий","darkgray":"темно-серый","lightcyan":"светлый циан","powderblue":"пороховой","blueviolet":"сине-фиолетовый","orchid":"орсель","dimgray":"тускло-серый","beige":"бежевый","fuchsia":"фуксин","lavenderblush":"розовато-лиловый","hotpink":"красно-розовый","steelblue":"стальной","tomato":"помидор","lightpink":"светло-розовый","limegreen":"зеленый лайм","indianred":"индийский красный","papayawhip":"черенок папайи","lightslategray":"светлый грифельно-серый","gray":"серый","mediumorchid":"нейтральный орсель","cornsilk":"шелковый оттенок","black":"черный","seagreen":"морской волны","darkslateblue":"темный грифельно-синий","khaki":"хаки","lightblue":"светло-синий","palegreen":"бледно-зеленый","azure":"лазурный","peachpuff":"персиковый","darkolivegreen":"темно-оливковый","yellowgreen":"желто-зеленый"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Предыдущие варианты","nextMessage":"Следующие варианты"} +, +'dijit/nls/common':{"buttonOk":"ОК","buttonCancel":"Отмена","buttonSave":"Сохранить","itemClose":"Закрыть"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_sk.js b/lib/dojo/nls/tt-rss-layer_sk.js index 273f6203..3f99f014 100644 --- a/lib/dojo/nls/tt-rss-layer_sk.js +++ b/lib/dojo/nls/tt-rss-layer_sk.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_sk");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.sk");dojo.nls.colors.sk={"lightsteelblue":"oceľovo modrá svetlá","orangered":"oranžovo červená","midnightblue":"nočná modrá","cadetblue":"sivomodrá","seashell":"lastúrová","slategrey":"bridlicová sivá","coral":"koralová","darkturquoise":"tyrkysová tmavá","antiquewhite":"antická biela","mediumspringgreen":"jarná zelená stredná","salmon":"lososovo ružová","darkgrey":"tmavosivá","ivory":"slonovinová","greenyellow":"žltozelená","mistyrose":"zahmlená ruža","lightsalmon":"lososovo ružová svetlá","silver":"strieborná","dimgrey":"sivá matná","orange":"oranžová","white":"biela","navajowhite":"navajská biela","royalblue":"kráľovská modrá","deeppink":"hlboká ružová","lime":"lipová","oldlace":"stará čipka","chartreuse":"kartúza","darkcyan":"tmavozelenomodrá","yellow":"žltá","linen":"ľan","olive":"olivovo zelená","gold":"zlatá","lawngreen":"zelená tráva","lightyellow":"svetložltá","tan":"žltohnedá","darkviolet":"tmavofialová","lightslategrey":"bridlicová sivá svetlá","grey":"sivá","darkkhaki":"žltohnedá tmavá","green":"zelená","deepskyblue":"hlboká blankytná modrá","aqua":"svetlá zelenomodrá","sienna":"sienská","mintcream":"mätová krémová","rosybrown":"ružovo hnedá","mediumslateblue":"bridlicová modrá stredná","magenta":"purpurová","lightseagreen":"morská zelená svetlá","cyan":"zelenomodrá","olivedrab":"olivovo zelená fádna","darkgoldenrod":"zlatobyľová tmavá","slateblue":"bridlicová modrá","mediumaquamarine":"akvamarínová stredná","lavender":"levanduľová","mediumseagreen":"morská zelená stredná","maroon":"gaÅ¡tanovo hnedá","darkslategray":"bridlicová sivá tmavá","mediumturquoise":"tyrkysová stredná","ghostwhite":"biely tieň","darkblue":"tmavomodrá","mediumvioletred":"fialovočervená stredná","brown":"hnedá","lightgray":"svetlosivá","sandybrown":"pieskovo hnedá","pink":"ružová","firebrick":"pálená tehla","indigo":"fialovo modrá","snow":"snehobiela","darkorchid":"orchideovo ružová tmavá","turquoise":"tyrkysová","chocolate":"čokoládovo hnedá","springgreen":"jarná zelená","moccasin":"črievičníková","navy":"vojenská zelená","lemonchiffon":"citrónový Å¡ifón","teal":"tyrkysová","floralwhite":"kvetinová biela","cornflowerblue":"nevädzovo modrá","paleturquoise":"bledo tyrkysová","purple":"purpurová","gainsboro":"sivomodrá svetlá","plum":"slivková","red":"červená","blue":"modrá","forestgreen":"lesná zelená","darkgreen":"tmavozelená","honeydew":"ambrózia","darkseagreen":"morská zelená tmavá","lightcoral":"koralová svetlá","palevioletred":"bledá fialovo červená","mediumpurple":"purpurová stredná","saddlebrown":"sedlová hnedá","darkmagenta":"tmavopurpurová","thistle":"bodliaková fialová","whitesmoke":"biely dym","wheat":"pÅ¡eničná","violet":"fialová","lightskyblue":"blankytná modrá svetlá","goldenrod":"zlatobyľ","mediumblue":"stredne modrá","skyblue":"blankytná modrá","crimson":"karmínová","darksalmon":"lososovo ružová tmavá","darkred":"tmavočervená","darkslategrey":"bridlicová sivá tmavá","peru":"peru","lightgrey":"svetlosivá","lightgoldenrodyellow":"zlatobyľová svetlá","blanchedalmond":"lúpané mandle","aliceblue":"modrá alice","bisque":"biskvitová","slategray":"bridlicová sivá","palegoldenrod":"bledá zlatobyľová","darkorange":"tmavooranžová","aquamarine":"akvamarínová","lightgreen":"svetlozelená","burlywood":"pieskovo hnedá","dodgerblue":"modrá dodger","darkgray":"tmavosivá","lightcyan":"zelenomodrá svetlá","powderblue":"prášková modrá","blueviolet":"modrofialová","orchid":"orchideovo ružová","dimgray":"sivá matná","beige":"béžová","fuchsia":"purpurová","lavenderblush":"levanduľový rumenec","hotpink":"teplá ružová","steelblue":"oceľovo modrá","tomato":"paradajková červená","lightpink":"svetloružová","limegreen":"lipová zelená","indianred":"indická červená","papayawhip":"papájový krém","lightslategray":"bridlicová sivá svetlá","gray":"sivá","mediumorchid":"orchideovo ružová stredná","cornsilk":"hodvábna žltá","black":"čierna","seagreen":"morská zelená","darkslateblue":"bridlicová modrá tmavá","khaki":"khaki","lightblue":"svetlomodrá","palegreen":"bledozelená","azure":"azúrová","peachpuff":"broskyňová pena","darkolivegreen":"olivovozelená tmavá","yellowgreen":"žltozelená"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.sk");dijit.nls.loading.sk={"loadingState":"Zavádzanie...","errorState":"Nastala chyba"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.sk");dijit.nls.common.sk={"buttonOk":"OK","buttonCancel":"ZruÅ¡iÅ¥","buttonSave":"UložiÅ¥","itemClose":"ZatvoriÅ¥"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.sk");dijit.form.nls.validate.sk={"rangeMessage":"Táto hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota nie je platná.","missingMessage":"Táto hodnota je vyžadovaná."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.sk");dijit.form.nls.ComboBox.sk={"previousMessage":"Predchádzajúce voľby","nextMessage":"ĎalÅ¡ie voľby"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.sk");dojo.cldr.nls.number.sk={"currencyFormat":"#,##0.00 ¤","group":" ","decimal":",","scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","percentFormat":"#,##0%","decimalFormat":"#,##0.###","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_sk",{"dijit/form/nls/validate":{"rangeMessage":"Táto hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota nie je platná.","missingMessage":"Táto hodnota je vyžadovaná."},"dijit/nls/loading":{"loadingState":"Zavádzanie...","errorState":"Nastala chyba"},"dojo/nls/colors":{"lightsteelblue":"svetlá oceľovomodrá","orangered":"oranžovo červená","midnightblue":"polnočná modrá","cadetblue":"červeno modrá","seashell":"lastúrová","slategrey":"bridlicová sivá","coral":"koralová","darkturquoise":"tmavá tyrkysová","antiquewhite":"antická biela","mediumspringgreen":"stredná jarná zelená","transparent":"priesvitná","salmon":"lososová","darkgrey":"tmavosivá","ivory":"slonovina","greenyellow":"zelenožltá","mistyrose":"zahmlená ruža","lightsalmon":"svetlá lososová","silver":"strieborná","dimgrey":"matná sivá","orange":"oranžová","white":"biela","navajowhite":"navajská biela","royalblue":"kráľovská modrá","deeppink":"hlboká ružová","lime":"limetková","oldlace":"stará čipka","chartreuse":"kartúzska","darkcyan":"tmavá zelenomodrá","yellow":"žltá","linen":"ľan","olive":"olivová","gold":"zlatá","lawngreen":"trávová zelená","lightyellow":"svetložltá","tan":"žltohnedá","darkviolet":"tmavofialová","lightslategrey":"svetlá bridlicová sivá","grey":"sivá","darkkhaki":"tmavá žltohnedá","green":"zelená","deepskyblue":"hlboká modrá obloha","aqua":"vodová","sienna":"sienská","mintcream":"mätová krémová","rosybrown":"ružovo hnedá","mediumslateblue":"stredná bridlicová modrá","magenta":"purpurová","lightseagreen":"svetlá morská zelená","cyan":"zelenomodrá","olivedrab":"fádna olivová","darkgoldenrod":"tmavá zlatobyľ","slateblue":"bridlicová modrá","mediumaquamarine":"stredná akvamarínová","lavender":"levanduľa","mediumseagreen":"stredná morská zelená","maroon":"gaÅ¡tanová hnedá","darkslategray":"tmavá bridlicová sivá","mediumturquoise":"stredná tyrkysová","ghostwhite":"biela (ghost white)","darkblue":"tmavomodrá","mediumvioletred":"stredná fialovočervená","brown":"hnedá","lightgray":"svetlosivá","sandybrown":"piesková hnedá","pink":"ružová","firebrick":"pálená tehla","indigo":"indigo","snow":"snehová","darkorchid":"tmavá orchidea","turquoise":"tyrkysová","chocolate":"čokoládová","springgreen":"jarná zelená","moccasin":"mokasínová","navy":"námornícka","lemonchiffon":"citrónový Å¡ifón","teal":"zelenomodrá","floralwhite":"biely kvet","cornflowerblue":"nevädzová modrá","paleturquoise":"bledá tyrkysová","purple":"purpurová","gainsboro":"sivá - gainsboro","plum":"slivková","red":"červená","blue":"modrá","forestgreen":"lesná zelená","darkgreen":"tmavozelená","honeydew":"ambrózia","darkseagreen":"tmavá morská zelená","lightcoral":"svetlá koralová","palevioletred":"bledá fialovo červená","mediumpurple":"stredná purpurová","saddlebrown":"sedlová hnedá","darkmagenta":"tmavá purpurová","thistle":"bodliaková","whitesmoke":"biely dym","wheat":"pÅ¡eničná","violet":"fialová","lightskyblue":"svetlá modrá obloha","goldenrod":"zlatobyľ","mediumblue":"stredná modrá","skyblue":"modré nebo","crimson":"karmínová","darksalmon":"tmavá lososová","darkred":"tmavočervená","darkslategrey":"tmavá bridlicová sivá","peru":"peru","lightgrey":"svetlosivá","lightgoldenrodyellow":"svetlá zlatobyľová žltá","blanchedalmond":"bledá mandľová","aliceblue":"modrá (alice)","bisque":"porcelánová","slategray":"bridlicová sivá","palegoldenrod":"bledá zlatobyľová","darkorange":"tmavá oranžová","aquamarine":"akvamarínová","lightgreen":"svetlozelená","burlywood":"drevená hnedá","dodgerblue":"modrá (dodger)","darkgray":"tmavosivá","lightcyan":"svetlá zelenomodrá","powderblue":"prášková modrá","blueviolet":"modro-fialová","orchid":"orchideová","dimgray":"matná sivá","beige":"béžová","fuchsia":"fuchsia","lavenderblush":"rumencová levanduľa","hotpink":"horúca ružová","steelblue":"oceľovomodrá","tomato":"paradajková","lightpink":"svetloružová","limegreen":"limetková zelená","indianred":"indiánska červená","papayawhip":"papájový krém","lightslategray":"svetlá bridlicová sivá","gray":"sivá","mediumorchid":"stredná orchideová","cornsilk":"ôstie kukurice","black":"čierna","seagreen":"morská zelená","darkslateblue":"tmavá bridlicová modrá","khaki":"kaki","lightblue":"svetlomodrá","palegreen":"bledá zelená","azure":"azúrová","peachpuff":"broskyňový nádych","darkolivegreen":"tmavá olivovo zelená","yellowgreen":"žltozelená"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Predchádzajúce voľby","nextMessage":"ĎalÅ¡ie voľby"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"ZruÅ¡iÅ¥","buttonSave":"UložiÅ¥","itemClose":"ZatvoriÅ¥"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_sk.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_sk.js.uncompressed.js new file mode 100644 index 00000000..98c6c5ff --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_sk.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_sk',{ +'dijit/form/nls/validate':{"rangeMessage":"Táto hodnota je mimo rozsah.","invalidMessage":"Zadaná hodnota nie je platná.","missingMessage":"Táto hodnota je vyžadovaná."} +, +'dijit/nls/loading':{"loadingState":"Zavádzanie...","errorState":"Nastala chyba"} +, +'dojo/nls/colors':{"lightsteelblue":"svetlá oceľovomodrá","orangered":"oranžovo červená","midnightblue":"polnočná modrá","cadetblue":"červeno modrá","seashell":"lastúrová","slategrey":"bridlicová sivá","coral":"koralová","darkturquoise":"tmavá tyrkysová","antiquewhite":"antická biela","mediumspringgreen":"stredná jarná zelená","transparent":"priesvitná","salmon":"lososová","darkgrey":"tmavosivá","ivory":"slonovina","greenyellow":"zelenožltá","mistyrose":"zahmlená ruža","lightsalmon":"svetlá lososová","silver":"strieborná","dimgrey":"matná sivá","orange":"oranžová","white":"biela","navajowhite":"navajská biela","royalblue":"kráľovská modrá","deeppink":"hlboká ružová","lime":"limetková","oldlace":"stará čipka","chartreuse":"kartúzska","darkcyan":"tmavá zelenomodrá","yellow":"žltá","linen":"ľan","olive":"olivová","gold":"zlatá","lawngreen":"trávová zelená","lightyellow":"svetložltá","tan":"žltohnedá","darkviolet":"tmavofialová","lightslategrey":"svetlá bridlicová sivá","grey":"sivá","darkkhaki":"tmavá žltohnedá","green":"zelená","deepskyblue":"hlboká modrá obloha","aqua":"vodová","sienna":"sienská","mintcream":"mätová krémová","rosybrown":"ružovo hnedá","mediumslateblue":"stredná bridlicová modrá","magenta":"purpurová","lightseagreen":"svetlá morská zelená","cyan":"zelenomodrá","olivedrab":"fádna olivová","darkgoldenrod":"tmavá zlatobyľ","slateblue":"bridlicová modrá","mediumaquamarine":"stredná akvamarínová","lavender":"levanduľa","mediumseagreen":"stredná morská zelená","maroon":"gaÅ¡tanová hnedá","darkslategray":"tmavá bridlicová sivá","mediumturquoise":"stredná tyrkysová","ghostwhite":"biela (ghost white)","darkblue":"tmavomodrá","mediumvioletred":"stredná fialovočervená","brown":"hnedá","lightgray":"svetlosivá","sandybrown":"piesková hnedá","pink":"ružová","firebrick":"pálená tehla","indigo":"indigo","snow":"snehová","darkorchid":"tmavá orchidea","turquoise":"tyrkysová","chocolate":"čokoládová","springgreen":"jarná zelená","moccasin":"mokasínová","navy":"námornícka","lemonchiffon":"citrónový Å¡ifón","teal":"zelenomodrá","floralwhite":"biely kvet","cornflowerblue":"nevädzová modrá","paleturquoise":"bledá tyrkysová","purple":"purpurová","gainsboro":"sivá - gainsboro","plum":"slivková","red":"červená","blue":"modrá","forestgreen":"lesná zelená","darkgreen":"tmavozelená","honeydew":"ambrózia","darkseagreen":"tmavá morská zelená","lightcoral":"svetlá koralová","palevioletred":"bledá fialovo červená","mediumpurple":"stredná purpurová","saddlebrown":"sedlová hnedá","darkmagenta":"tmavá purpurová","thistle":"bodliaková","whitesmoke":"biely dym","wheat":"pÅ¡eničná","violet":"fialová","lightskyblue":"svetlá modrá obloha","goldenrod":"zlatobyľ","mediumblue":"stredná modrá","skyblue":"modré nebo","crimson":"karmínová","darksalmon":"tmavá lososová","darkred":"tmavočervená","darkslategrey":"tmavá bridlicová sivá","peru":"peru","lightgrey":"svetlosivá","lightgoldenrodyellow":"svetlá zlatobyľová žltá","blanchedalmond":"bledá mandľová","aliceblue":"modrá (alice)","bisque":"porcelánová","slategray":"bridlicová sivá","palegoldenrod":"bledá zlatobyľová","darkorange":"tmavá oranžová","aquamarine":"akvamarínová","lightgreen":"svetlozelená","burlywood":"drevená hnedá","dodgerblue":"modrá (dodger)","darkgray":"tmavosivá","lightcyan":"svetlá zelenomodrá","powderblue":"prášková modrá","blueviolet":"modro-fialová","orchid":"orchideová","dimgray":"matná sivá","beige":"béžová","fuchsia":"fuchsia","lavenderblush":"rumencová levanduľa","hotpink":"horúca ružová","steelblue":"oceľovomodrá","tomato":"paradajková","lightpink":"svetloružová","limegreen":"limetková zelená","indianred":"indiánska červená","papayawhip":"papájový krém","lightslategray":"svetlá bridlicová sivá","gray":"sivá","mediumorchid":"stredná orchideová","cornsilk":"ôstie kukurice","black":"čierna","seagreen":"morská zelená","darkslateblue":"tmavá bridlicová modrá","khaki":"kaki","lightblue":"svetlomodrá","palegreen":"bledá zelená","azure":"azúrová","peachpuff":"broskyňový nádych","darkolivegreen":"tmavá olivovo zelená","yellowgreen":"žltozelená"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Predchádzajúce voľby","nextMessage":"ĎalÅ¡ie voľby"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"ZruÅ¡iÅ¥","buttonSave":"UložiÅ¥","itemClose":"ZatvoriÅ¥"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_sl.js b/lib/dojo/nls/tt-rss-layer_sl.js index b9697650..afc0d4e0 100644 --- a/lib/dojo/nls/tt-rss-layer_sl.js +++ b/lib/dojo/nls/tt-rss-layer_sl.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_sl");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.sl");dojo.nls.colors.sl={"lightsteelblue":"svetlo kovinsko modra","orangered":"oranžno-rdeča","midnightblue":"polnočno modra","cadetblue":"kadetsko modra","seashell":"morska lupina","slategrey":"skrilasto siva","coral":"koralna","darkturquoise":"temno turkizna","antiquewhite":"antično bela","mediumspringgreen":"srednje pomladno zelena","salmon":"lososova","darkgrey":"temno siva","ivory":"slonokoščena","greenyellow":"zeleno-rumena","mistyrose":"megleno rožnata","lightsalmon":"svetlo lososova","silver":"srebrna","dimgrey":"pepelnato siva","orange":"oranžna","white":"bela","navajowhite":"navajo bela","royalblue":"kraljevsko modra","deeppink":"temno rožnata","lime":"limetasta","oldlace":"stara čipka","chartreuse":"chartreuse","darkcyan":"temno cijan","yellow":"rumena","linen":"lanena","olive":"olivna","gold":"zlata","lawngreen":"travniÅ¡ko zelena","lightyellow":"svetlo rumena","tan":"rumeno-rjava","darkviolet":"temno vijolična","lightslategrey":"svetlo skrilasto siva","grey":"siva","darkkhaki":"temno kaki","green":"zelena","deepskyblue":"temno nebeÅ¡ko modra","aqua":"akva","sienna":"sienna","mintcream":"metina krema","rosybrown":"rožnato rjava","mediumslateblue":"srednje skrilasto modra","magenta":"magenta","lightseagreen":"svetlo morsko zelena","cyan":"cijan","olivedrab":"umazano olivna","darkgoldenrod":"temna zlata rozga","slateblue":"skrilasto modra","mediumaquamarine":"srednji akvamarin","lavender":"sivka","mediumseagreen":"srednje morsko zelena","maroon":"kostanjeva","darkslategray":"temno skrilasto siva","mediumturquoise":"srednje turkizna","ghostwhite":"senčnato bela","darkblue":"temno modra","mediumvioletred":"srednje vijolično rdeča","brown":"rjava","lightgray":"svetlo siva","sandybrown":"peščeno rjava","pink":"rožnata","firebrick":"opečnata","indigo":"indigo","snow":"snežena","darkorchid":"temno orhidejasta","turquoise":"turkizna","chocolate":"čokoladna","springgreen":"pomladno zelena","moccasin":"mokasinasta","navy":"mornarska","lemonchiffon":"limonast Å¡ifon","teal":"modrozelena","floralwhite":"cvetno bela","cornflowerblue":"plavičasto modra","paleturquoise":"bledo turkizna","purple":"Å¡krlatna","gainsboro":"gainsboro","plum":"slivova","red":"rdeča","blue":"modra","forestgreen":"gozdno zelena","darkgreen":"temno zelena","honeydew":"medena rosa","darkseagreen":"temno morsko zelena","lightcoral":"svetlo koralna","palevioletred":"bledo vijolično-rdeča","mediumpurple":"srednje Å¡krlatna","saddlebrown":"sedlasto rjava","darkmagenta":"temna magenta","thistle":"osatna","whitesmoke":"megleno bela","wheat":"pÅ¡enična","violet":"vijolična","lightskyblue":"svetlo nebeÅ¡ko modra","goldenrod":"zlata rozga","mediumblue":"srednje modra","skyblue":"nebeÅ¡ko modra","crimson":"karminasta","darksalmon":"temno lososova","darkred":"temno rdeča","darkslategrey":"temno skrilasto siva","peru":"perujska","lightgrey":"svetlo siva","lightgoldenrodyellow":"svetlo rumena zlata rozga","blanchedalmond":"obledelo mandljeva","aliceblue":"alice blue modra","bisque":"porcelanasta","slategray":"skrilasto siva","palegoldenrod":"bleda zlata rozga","darkorange":"temno oranžna","aquamarine":"akvamarin","lightgreen":"svetlo zelena","burlywood":"peščeno sivo-rjava","dodgerblue":"dodgersko modra","darkgray":"temno siva","lightcyan":"svetlo cijan","powderblue":"kobaltovo modra","blueviolet":"modro vijolična","orchid":"orhidejasta","dimgray":"pepelnato siva","beige":"bež","fuchsia":"fuksija","lavenderblush":"rožnato sivka","hotpink":"kričeče rožnata","steelblue":"kovinsko modra","tomato":"paradižnikova","lightpink":"svetlo rožnata","limegreen":"apneno zelena","indianred":"indijansko rdeča","papayawhip":"papaja","lightslategray":"svetlo skrilasto siva","gray":"siva","mediumorchid":"srednje orhidejasta","cornsilk":"koruzna","black":"črna","seagreen":"morsko zelena","darkslateblue":"temno skrilasto modra","khaki":"kaki","lightblue":"svetlo modra","palegreen":"bledo zelena","azure":"azurno modra","peachpuff":"breskova","darkolivegreen":"temna olivno zelena","yellowgreen":"rumeno-zelena"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.sl");dijit.nls.loading.sl={"loadingState":"Nalaganje ...","errorState":"Oprostite, priÅ¡lo je do napake."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.sl");dijit.nls.common.sl={"buttonOk":"V redu","buttonCancel":"Prekliči","buttonSave":"Shrani","itemClose":"Zapri"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.sl");dijit.form.nls.validate.sl={"rangeMessage":"Ta vrednost je izven območja.","invalidMessage":"Vnesena vrednost ni veljavna.","missingMessage":"Ta vrednost je zahtevana."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.sl");dijit.form.nls.ComboBox.sl={"previousMessage":"PrejÅ¡nje izbire","nextMessage":"Dodatne izbire"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.sl");dojo.cldr.nls.number.sl={"group":".","percentSign":"%","exponential":"e","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_sl",{"dijit/form/nls/validate":{"rangeMessage":"Ta vrednost je izven območja.","invalidMessage":"Vnesena vrednost ni veljavna.","missingMessage":"Ta vrednost je zahtevana."},"dijit/nls/loading":{"loadingState":"Nalaganje ...","errorState":"Oprostite, priÅ¡lo je do napake."},"dojo/nls/colors":{"lightsteelblue":"svetlo kovinsko modra","orangered":"oranžno-rdeča","midnightblue":"polnočno modra","cadetblue":"kadetsko modra","seashell":"morska lupina","slategrey":"skrilasto siva","coral":"koralna","darkturquoise":"temno turkizna","antiquewhite":"antično bela","mediumspringgreen":"srednje pomladno zelena","transparent":"prosojno","salmon":"lososova","darkgrey":"temno siva","ivory":"slonokoščena","greenyellow":"zeleno-rumena","mistyrose":"megleno rožnata","lightsalmon":"svetlo lososova","silver":"srebrna","dimgrey":"pepelnato siva","orange":"oranžna","white":"bela","navajowhite":"navajo bela","royalblue":"kraljevsko modra","deeppink":"temno rožnata","lime":"limetasta","oldlace":"stara čipka","chartreuse":"chartreuse","darkcyan":"temno cijan","yellow":"rumena","linen":"lanena","olive":"olivna","gold":"zlata","lawngreen":"travniÅ¡ko zelena","lightyellow":"svetlo rumena","tan":"rumeno-rjava","darkviolet":"temno vijolična","lightslategrey":"svetlo skrilasto siva","grey":"siva","darkkhaki":"temno kaki","green":"zelena","deepskyblue":"temno nebeÅ¡ko modra","aqua":"akva","sienna":"sienna","mintcream":"metina krema","rosybrown":"rožnato rjava","mediumslateblue":"srednje skrilasto modra","magenta":"magenta","lightseagreen":"svetlo morsko zelena","cyan":"cijan","olivedrab":"umazano olivna","darkgoldenrod":"temna zlata rozga","slateblue":"skrilasto modra","mediumaquamarine":"srednji akvamarin","lavender":"sivka","mediumseagreen":"srednje morsko zelena","maroon":"kostanjeva","darkslategray":"temno skrilasto siva","mediumturquoise":"srednje turkizna","ghostwhite":"senčnato bela","darkblue":"temno modra","mediumvioletred":"srednje vijolično rdeča","brown":"rjava","lightgray":"svetlo siva","sandybrown":"peščeno rjava","pink":"rožnata","firebrick":"opečnata","indigo":"indigo","snow":"snežena","darkorchid":"temno orhidejasta","turquoise":"turkizna","chocolate":"čokoladna","springgreen":"pomladno zelena","moccasin":"mokasinasta","navy":"mornarska","lemonchiffon":"limonast Å¡ifon","teal":"modrozelena","floralwhite":"cvetno bela","cornflowerblue":"plavičasto modra","paleturquoise":"bledo turkizna","purple":"Å¡krlatna","gainsboro":"gainsboro","plum":"slivova","red":"rdeča","blue":"modra","forestgreen":"gozdno zelena","darkgreen":"temno zelena","honeydew":"medena rosa","darkseagreen":"temno morsko zelena","lightcoral":"svetlo koralna","palevioletred":"bledo vijolično-rdeča","mediumpurple":"srednje Å¡krlatna","saddlebrown":"sedlasto rjava","darkmagenta":"temna magenta","thistle":"osatna","whitesmoke":"megleno bela","wheat":"pÅ¡enična","violet":"vijolična","lightskyblue":"svetlo nebeÅ¡ko modra","goldenrod":"zlata rozga","mediumblue":"srednje modra","skyblue":"nebeÅ¡ko modra","crimson":"karminasta","darksalmon":"temno lososova","darkred":"temno rdeča","darkslategrey":"temno skrilasto siva","peru":"perujska","lightgrey":"svetlo siva","lightgoldenrodyellow":"svetlo rumena zlata rozga","blanchedalmond":"obledelo mandljeva","aliceblue":"alice blue modra","bisque":"porcelanasta","slategray":"skrilasto siva","palegoldenrod":"bleda zlata rozga","darkorange":"temno oranžna","aquamarine":"akvamarin","lightgreen":"svetlo zelena","burlywood":"peščeno sivo-rjava","dodgerblue":"dodgersko modra","darkgray":"temno siva","lightcyan":"svetlo cijan","powderblue":"kobaltovo modra","blueviolet":"modro vijolična","orchid":"orhidejasta","dimgray":"pepelnato siva","beige":"bež","fuchsia":"fuksija","lavenderblush":"rožnato sivka","hotpink":"kričeče rožnata","steelblue":"kovinsko modra","tomato":"paradižnikova","lightpink":"svetlo rožnata","limegreen":"apneno zelena","indianred":"indijansko rdeča","papayawhip":"papaja","lightslategray":"svetlo skrilasto siva","gray":"siva","mediumorchid":"srednje orhidejasta","cornsilk":"koruzna","black":"črna","seagreen":"morsko zelena","darkslateblue":"temno skrilasto modra","khaki":"kaki","lightblue":"svetlo modra","palegreen":"bledo zelena","azure":"azurno modra","peachpuff":"breskova","darkolivegreen":"temna olivno zelena","yellowgreen":"rumeno-zelena"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"e"},"dijit/form/nls/ComboBox":{"previousMessage":"PrejÅ¡nje izbire","nextMessage":"Dodatne izbire"},"dijit/nls/common":{"buttonOk":"V redu","buttonCancel":"Prekliči","buttonSave":"Shrani","itemClose":"Zapri"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_sl.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_sl.js.uncompressed.js new file mode 100644 index 00000000..fcc11280 --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_sl.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_sl',{ +'dijit/form/nls/validate':{"rangeMessage":"Ta vrednost je izven območja.","invalidMessage":"Vnesena vrednost ni veljavna.","missingMessage":"Ta vrednost je zahtevana."} +, +'dijit/nls/loading':{"loadingState":"Nalaganje ...","errorState":"Oprostite, priÅ¡lo je do napake."} +, +'dojo/nls/colors':{"lightsteelblue":"svetlo kovinsko modra","orangered":"oranžno-rdeča","midnightblue":"polnočno modra","cadetblue":"kadetsko modra","seashell":"morska lupina","slategrey":"skrilasto siva","coral":"koralna","darkturquoise":"temno turkizna","antiquewhite":"antično bela","mediumspringgreen":"srednje pomladno zelena","transparent":"prosojno","salmon":"lososova","darkgrey":"temno siva","ivory":"slonokoščena","greenyellow":"zeleno-rumena","mistyrose":"megleno rožnata","lightsalmon":"svetlo lososova","silver":"srebrna","dimgrey":"pepelnato siva","orange":"oranžna","white":"bela","navajowhite":"navajo bela","royalblue":"kraljevsko modra","deeppink":"temno rožnata","lime":"limetasta","oldlace":"stara čipka","chartreuse":"chartreuse","darkcyan":"temno cijan","yellow":"rumena","linen":"lanena","olive":"olivna","gold":"zlata","lawngreen":"travniÅ¡ko zelena","lightyellow":"svetlo rumena","tan":"rumeno-rjava","darkviolet":"temno vijolična","lightslategrey":"svetlo skrilasto siva","grey":"siva","darkkhaki":"temno kaki","green":"zelena","deepskyblue":"temno nebeÅ¡ko modra","aqua":"akva","sienna":"sienna","mintcream":"metina krema","rosybrown":"rožnato rjava","mediumslateblue":"srednje skrilasto modra","magenta":"magenta","lightseagreen":"svetlo morsko zelena","cyan":"cijan","olivedrab":"umazano olivna","darkgoldenrod":"temna zlata rozga","slateblue":"skrilasto modra","mediumaquamarine":"srednji akvamarin","lavender":"sivka","mediumseagreen":"srednje morsko zelena","maroon":"kostanjeva","darkslategray":"temno skrilasto siva","mediumturquoise":"srednje turkizna","ghostwhite":"senčnato bela","darkblue":"temno modra","mediumvioletred":"srednje vijolično rdeča","brown":"rjava","lightgray":"svetlo siva","sandybrown":"peščeno rjava","pink":"rožnata","firebrick":"opečnata","indigo":"indigo","snow":"snežena","darkorchid":"temno orhidejasta","turquoise":"turkizna","chocolate":"čokoladna","springgreen":"pomladno zelena","moccasin":"mokasinasta","navy":"mornarska","lemonchiffon":"limonast Å¡ifon","teal":"modrozelena","floralwhite":"cvetno bela","cornflowerblue":"plavičasto modra","paleturquoise":"bledo turkizna","purple":"Å¡krlatna","gainsboro":"gainsboro","plum":"slivova","red":"rdeča","blue":"modra","forestgreen":"gozdno zelena","darkgreen":"temno zelena","honeydew":"medena rosa","darkseagreen":"temno morsko zelena","lightcoral":"svetlo koralna","palevioletred":"bledo vijolično-rdeča","mediumpurple":"srednje Å¡krlatna","saddlebrown":"sedlasto rjava","darkmagenta":"temna magenta","thistle":"osatna","whitesmoke":"megleno bela","wheat":"pÅ¡enična","violet":"vijolična","lightskyblue":"svetlo nebeÅ¡ko modra","goldenrod":"zlata rozga","mediumblue":"srednje modra","skyblue":"nebeÅ¡ko modra","crimson":"karminasta","darksalmon":"temno lososova","darkred":"temno rdeča","darkslategrey":"temno skrilasto siva","peru":"perujska","lightgrey":"svetlo siva","lightgoldenrodyellow":"svetlo rumena zlata rozga","blanchedalmond":"obledelo mandljeva","aliceblue":"alice blue modra","bisque":"porcelanasta","slategray":"skrilasto siva","palegoldenrod":"bleda zlata rozga","darkorange":"temno oranžna","aquamarine":"akvamarin","lightgreen":"svetlo zelena","burlywood":"peščeno sivo-rjava","dodgerblue":"dodgersko modra","darkgray":"temno siva","lightcyan":"svetlo cijan","powderblue":"kobaltovo modra","blueviolet":"modro vijolična","orchid":"orhidejasta","dimgray":"pepelnato siva","beige":"bež","fuchsia":"fuksija","lavenderblush":"rožnato sivka","hotpink":"kričeče rožnata","steelblue":"kovinsko modra","tomato":"paradižnikova","lightpink":"svetlo rožnata","limegreen":"apneno zelena","indianred":"indijansko rdeča","papayawhip":"papaja","lightslategray":"svetlo skrilasto siva","gray":"siva","mediumorchid":"srednje orhidejasta","cornsilk":"koruzna","black":"črna","seagreen":"morsko zelena","darkslateblue":"temno skrilasto modra","khaki":"kaki","lightblue":"svetlo modra","palegreen":"bledo zelena","azure":"azurno modra","peachpuff":"breskova","darkolivegreen":"temna olivno zelena","yellowgreen":"rumeno-zelena"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"e"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"PrejÅ¡nje izbire","nextMessage":"Dodatne izbire"} +, +'dijit/nls/common':{"buttonOk":"V redu","buttonCancel":"Prekliči","buttonSave":"Shrani","itemClose":"Zapri"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_sv.js b/lib/dojo/nls/tt-rss-layer_sv.js index d52287cf..551c6496 100644 --- a/lib/dojo/nls/tt-rss-layer_sv.js +++ b/lib/dojo/nls/tt-rss-layer_sv.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_sv");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.sv");dojo.nls.colors.sv={"lightsteelblue":"ljust stÃ¥lblÃ¥tt","orangered":"orangerött","midnightblue":"midnattsblÃ¥tt","cadetblue":"kadettblÃ¥tt","seashell":"snäckskal","slategrey":"skiffergrÃ¥tt","coral":"korall","darkturquoise":"mörkturkost","antiquewhite":"antikvitt","mediumspringgreen":"mellanvÃ¥rgrönt","salmon":"laxfärgat","darkgrey":"mörkgrÃ¥tt","ivory":"elfenbensvitt","greenyellow":"gröngult","mistyrose":"dunkelrosa","lightsalmon":"ljust laxfärgat","silver":"silver","dimgrey":"smutsgrÃ¥tt","orange":"orange","white":"vitt","navajowhite":"navajovitt","royalblue":"kungligt blÃ¥tt","deeppink":"djuprosa","lime":"lime","oldlace":"spetsvitt","chartreuse":"chartreuse","darkcyan":"mörkt cyan","yellow":"gult","linen":"linne","olive":"olivfärgat","gold":"guld","lawngreen":"gräsmattegrönt","lightyellow":"ljusgult","tan":"mellanbrunt","darkviolet":"mörkviolett","lightslategrey":"ljust skiffergrÃ¥tt","grey":"grÃ¥tt","darkkhaki":"mörkt kaki","green":"grönt","deepskyblue":"mörkt himmelsblÃ¥tt","aqua":"akvamarin","sienna":"sienna","mintcream":"mintgrädde","rosybrown":"rosenbrunt","mediumslateblue":"mellanskifferblÃ¥tt","magenta":"magenta","lightseagreen":"ljust havsgrönt","cyan":"cyan","olivedrab":"olivsmutsgult","darkgoldenrod":"mörkt gullris","slateblue":"skifferblÃ¥tt","mediumaquamarine":"mellanakvamarin","lavender":"lavendel","mediumseagreen":"mellanhavsgrönt","maroon":"rödbrunt","darkslategray":"mörkt skiffergrÃ¥tt","mediumturquoise":"mellanturkost","ghostwhite":"spökvitt","darkblue":"mörkblÃ¥tt","mediumvioletred":"mellanviolettrött","brown":"brunt","lightgray":"ljusgrÃ¥tt","sandybrown":"sandbrunt","pink":"rosa","firebrick":"tegelstensrött","indigo":"indigo","snow":"snö","darkorchid":"mörkt orkidé","turquoise":"turkost","chocolate":"choklad","springgreen":"vÃ¥rgrönt","moccasin":"mockasin","navy":"marinblÃ¥tt","lemonchiffon":"citronchiffong","teal":"blÃ¥grönt","floralwhite":"blomvitt","cornflowerblue":"kornblÃ¥tt","paleturquoise":"blekturkost","purple":"lila","gainsboro":"gainsboro","plum":"plommon","red":"rött","blue":"blÃ¥tt","forestgreen":"skogsgrönt","darkgreen":"mörkgrönt","honeydew":"honungsdagg","darkseagreen":"mörkt havsgrönt","lightcoral":"ljuskorall","palevioletred":"blekviolettrött","mediumpurple":"mellanlila","saddlebrown":"sadelbrunt","darkmagenta":"mörk magenta","thistle":"tistel","whitesmoke":"vit rök","wheat":"vete","violet":"violett","lightskyblue":"ljust himmelsblÃ¥tt","goldenrod":"gullris","mediumblue":"mellanblÃ¥tt","skyblue":"himmelsblÃ¥tt","crimson":"karmosinrött","darksalmon":"mörkt laxfärgat","darkred":"mörkrött","darkslategrey":"mörkt skiffergrÃ¥tt","peru":"peru","lightgrey":"ljusgrÃ¥tt","lightgoldenrodyellow":"ljust gullrisgult","blanchedalmond":"skÃ¥llad mandel","aliceblue":"aliceblÃ¥","bisque":"biskvi","slategray":"skiffergrÃ¥tt","palegoldenrod":"blekt gullris","darkorange":"mörkorange","aquamarine":"akvamarin","lightgreen":"ljusgrönt","burlywood":"träfärgat","dodgerblue":"dodgerblÃ¥tt","darkgray":"mörkgrÃ¥tt","lightcyan":"ljust cyan","powderblue":"pulverblÃ¥tt","blueviolet":"blÃ¥violett","orchid":"orkidé","dimgray":"smutsgrÃ¥tt","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelskimrande","hotpink":"varmrosa","steelblue":"stÃ¥lblÃ¥tt","tomato":"tomatrött","lightpink":"ljusrosa","limegreen":"limegrönt","indianred":"indianrött","papayawhip":"papayaröra","lightslategray":"ljust skiffergrÃ¥tt","gray":"grÃ¥tt","mediumorchid":"mellanorkidé","cornsilk":"gulvitt","black":"svart","seagreen":"havsgrönt","darkslateblue":"mörkt skifferblÃ¥tt","khaki":"kaki","lightblue":"ljusblÃ¥tt","palegreen":"blekgrönt","azure":"azurblÃ¥tt","peachpuff":"persika","darkolivegreen":"mörkt olivgrönt","yellowgreen":"gulgrönt"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.sv");dijit.nls.loading.sv={"loadingState":"Läser in...","errorState":"Det uppstod ett fel."};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.sv");dijit.nls.common.sv={"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Spara","itemClose":"Stäng"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.sv");dijit.form.nls.validate.sv={"rangeMessage":"Värdet är utanför intervallet.","invalidMessage":"Det angivna värdet är ogiltigt.","missingMessage":"Värdet är obligatoriskt."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.sv");dijit.form.nls.ComboBox.sv={"previousMessage":"FöregÃ¥ende alternativ","nextMessage":"Fler alternativ"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.sv");dojo.cldr.nls.number.sv={"group":" ","percentSign":"%","exponential":"×10^","percentFormat":"#,##0 %","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"−","decimal":",","nan":"¤¤¤","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_sv",{"dijit/form/nls/validate":{"rangeMessage":"Värdet är utanför intervallet.","invalidMessage":"Det angivna värdet är ogiltigt.","missingMessage":"Värdet är obligatoriskt."},"dijit/nls/loading":{"loadingState":"Läser in...","errorState":"Det uppstod ett fel."},"dojo/nls/colors":{"lightsteelblue":"ljust stÃ¥lblÃ¥tt","orangered":"orangerött","midnightblue":"midnattsblÃ¥tt","cadetblue":"kadettblÃ¥tt","seashell":"snäckskal","slategrey":"skiffergrÃ¥tt","coral":"korall","darkturquoise":"mörkturkost","antiquewhite":"antikvitt","mediumspringgreen":"mellanvÃ¥rgrönt","transparent":"transparent","salmon":"laxfärgat","darkgrey":"mörkgrÃ¥tt","ivory":"elfenbensvitt","greenyellow":"gröngult","mistyrose":"dunkelrosa","lightsalmon":"ljust laxfärgat","silver":"silver","dimgrey":"smutsgrÃ¥tt","orange":"orange","white":"vitt","navajowhite":"navajovitt","royalblue":"kungligt blÃ¥tt","deeppink":"djuprosa","lime":"lime","oldlace":"spetsvitt","chartreuse":"chartreuse","darkcyan":"mörkt cyan","yellow":"gult","linen":"linne","olive":"olivfärgat","gold":"guld","lawngreen":"gräsmattegrönt","lightyellow":"ljusgult","tan":"mellanbrunt","darkviolet":"mörkviolett","lightslategrey":"ljust skiffergrÃ¥tt","grey":"grÃ¥tt","darkkhaki":"mörkt kaki","green":"grönt","deepskyblue":"mörkt himmelsblÃ¥tt","aqua":"akvamarin","sienna":"sienna","mintcream":"mintgrädde","rosybrown":"rosenbrunt","mediumslateblue":"mellanskifferblÃ¥tt","magenta":"magenta","lightseagreen":"ljust havsgrönt","cyan":"cyan","olivedrab":"olivsmutsgult","darkgoldenrod":"mörkt gullris","slateblue":"skifferblÃ¥tt","mediumaquamarine":"mellanakvamarin","lavender":"lavendel","mediumseagreen":"mellanhavsgrönt","maroon":"rödbrunt","darkslategray":"mörkt skiffergrÃ¥tt","mediumturquoise":"mellanturkost","ghostwhite":"spökvitt","darkblue":"mörkblÃ¥tt","mediumvioletred":"mellanviolettrött","brown":"brunt","lightgray":"ljusgrÃ¥tt","sandybrown":"sandbrunt","pink":"rosa","firebrick":"tegelstensrött","indigo":"indigo","snow":"snö","darkorchid":"mörkt orkidé","turquoise":"turkost","chocolate":"choklad","springgreen":"vÃ¥rgrönt","moccasin":"mockasin","navy":"marinblÃ¥tt","lemonchiffon":"citronchiffong","teal":"blÃ¥grönt","floralwhite":"blomvitt","cornflowerblue":"kornblÃ¥tt","paleturquoise":"blekturkost","purple":"lila","gainsboro":"gainsboro","plum":"plommon","red":"rött","blue":"blÃ¥tt","forestgreen":"skogsgrönt","darkgreen":"mörkgrönt","honeydew":"honungsdagg","darkseagreen":"mörkt havsgrönt","lightcoral":"ljuskorall","palevioletred":"blekviolettrött","mediumpurple":"mellanlila","saddlebrown":"sadelbrunt","darkmagenta":"mörk magenta","thistle":"tistel","whitesmoke":"vit rök","wheat":"vete","violet":"violett","lightskyblue":"ljust himmelsblÃ¥tt","goldenrod":"gullris","mediumblue":"mellanblÃ¥tt","skyblue":"himmelsblÃ¥tt","crimson":"karmosinrött","darksalmon":"mörkt laxfärgat","darkred":"mörkrött","darkslategrey":"mörkt skiffergrÃ¥tt","peru":"peru","lightgrey":"ljusgrÃ¥tt","lightgoldenrodyellow":"ljust gullrisgult","blanchedalmond":"skÃ¥llad mandel","aliceblue":"aliceblÃ¥","bisque":"biskvi","slategray":"skiffergrÃ¥tt","palegoldenrod":"blekt gullris","darkorange":"mörkorange","aquamarine":"akvamarin","lightgreen":"ljusgrönt","burlywood":"träfärgat","dodgerblue":"dodgerblÃ¥tt","darkgray":"mörkgrÃ¥tt","lightcyan":"ljust cyan","powderblue":"pulverblÃ¥tt","blueviolet":"blÃ¥violett","orchid":"orkidé","dimgray":"smutsgrÃ¥tt","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelskimrande","hotpink":"varmrosa","steelblue":"stÃ¥lblÃ¥tt","tomato":"tomatrött","lightpink":"ljusrosa","limegreen":"limegrönt","indianred":"indianrött","papayawhip":"papayaröra","lightslategray":"ljust skiffergrÃ¥tt","gray":"grÃ¥tt","mediumorchid":"mellanorkidé","cornsilk":"gulvitt","black":"svart","seagreen":"havsgrönt","darkslateblue":"mörkt skifferblÃ¥tt","khaki":"kaki","lightblue":"ljusblÃ¥tt","palegreen":"blekgrönt","azure":"azurblÃ¥tt","peachpuff":"persika","darkolivegreen":"mörkt olivgrönt","yellowgreen":"gulgrönt"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"−","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"¤¤¤","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"×10^"},"dijit/form/nls/ComboBox":{"previousMessage":"FöregÃ¥ende alternativ","nextMessage":"Fler alternativ"},"dijit/nls/common":{"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Spara","itemClose":"Stäng"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_sv.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_sv.js.uncompressed.js new file mode 100644 index 00000000..5d179927 --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_sv.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_sv',{ +'dijit/form/nls/validate':{"rangeMessage":"Värdet är utanför intervallet.","invalidMessage":"Det angivna värdet är ogiltigt.","missingMessage":"Värdet är obligatoriskt."} +, +'dijit/nls/loading':{"loadingState":"Läser in...","errorState":"Det uppstod ett fel."} +, +'dojo/nls/colors':{"lightsteelblue":"ljust stÃ¥lblÃ¥tt","orangered":"orangerött","midnightblue":"midnattsblÃ¥tt","cadetblue":"kadettblÃ¥tt","seashell":"snäckskal","slategrey":"skiffergrÃ¥tt","coral":"korall","darkturquoise":"mörkturkost","antiquewhite":"antikvitt","mediumspringgreen":"mellanvÃ¥rgrönt","transparent":"transparent","salmon":"laxfärgat","darkgrey":"mörkgrÃ¥tt","ivory":"elfenbensvitt","greenyellow":"gröngult","mistyrose":"dunkelrosa","lightsalmon":"ljust laxfärgat","silver":"silver","dimgrey":"smutsgrÃ¥tt","orange":"orange","white":"vitt","navajowhite":"navajovitt","royalblue":"kungligt blÃ¥tt","deeppink":"djuprosa","lime":"lime","oldlace":"spetsvitt","chartreuse":"chartreuse","darkcyan":"mörkt cyan","yellow":"gult","linen":"linne","olive":"olivfärgat","gold":"guld","lawngreen":"gräsmattegrönt","lightyellow":"ljusgult","tan":"mellanbrunt","darkviolet":"mörkviolett","lightslategrey":"ljust skiffergrÃ¥tt","grey":"grÃ¥tt","darkkhaki":"mörkt kaki","green":"grönt","deepskyblue":"mörkt himmelsblÃ¥tt","aqua":"akvamarin","sienna":"sienna","mintcream":"mintgrädde","rosybrown":"rosenbrunt","mediumslateblue":"mellanskifferblÃ¥tt","magenta":"magenta","lightseagreen":"ljust havsgrönt","cyan":"cyan","olivedrab":"olivsmutsgult","darkgoldenrod":"mörkt gullris","slateblue":"skifferblÃ¥tt","mediumaquamarine":"mellanakvamarin","lavender":"lavendel","mediumseagreen":"mellanhavsgrönt","maroon":"rödbrunt","darkslategray":"mörkt skiffergrÃ¥tt","mediumturquoise":"mellanturkost","ghostwhite":"spökvitt","darkblue":"mörkblÃ¥tt","mediumvioletred":"mellanviolettrött","brown":"brunt","lightgray":"ljusgrÃ¥tt","sandybrown":"sandbrunt","pink":"rosa","firebrick":"tegelstensrött","indigo":"indigo","snow":"snö","darkorchid":"mörkt orkidé","turquoise":"turkost","chocolate":"choklad","springgreen":"vÃ¥rgrönt","moccasin":"mockasin","navy":"marinblÃ¥tt","lemonchiffon":"citronchiffong","teal":"blÃ¥grönt","floralwhite":"blomvitt","cornflowerblue":"kornblÃ¥tt","paleturquoise":"blekturkost","purple":"lila","gainsboro":"gainsboro","plum":"plommon","red":"rött","blue":"blÃ¥tt","forestgreen":"skogsgrönt","darkgreen":"mörkgrönt","honeydew":"honungsdagg","darkseagreen":"mörkt havsgrönt","lightcoral":"ljuskorall","palevioletred":"blekviolettrött","mediumpurple":"mellanlila","saddlebrown":"sadelbrunt","darkmagenta":"mörk magenta","thistle":"tistel","whitesmoke":"vit rök","wheat":"vete","violet":"violett","lightskyblue":"ljust himmelsblÃ¥tt","goldenrod":"gullris","mediumblue":"mellanblÃ¥tt","skyblue":"himmelsblÃ¥tt","crimson":"karmosinrött","darksalmon":"mörkt laxfärgat","darkred":"mörkrött","darkslategrey":"mörkt skiffergrÃ¥tt","peru":"peru","lightgrey":"ljusgrÃ¥tt","lightgoldenrodyellow":"ljust gullrisgult","blanchedalmond":"skÃ¥llad mandel","aliceblue":"aliceblÃ¥","bisque":"biskvi","slategray":"skiffergrÃ¥tt","palegoldenrod":"blekt gullris","darkorange":"mörkorange","aquamarine":"akvamarin","lightgreen":"ljusgrönt","burlywood":"träfärgat","dodgerblue":"dodgerblÃ¥tt","darkgray":"mörkgrÃ¥tt","lightcyan":"ljust cyan","powderblue":"pulverblÃ¥tt","blueviolet":"blÃ¥violett","orchid":"orkidé","dimgray":"smutsgrÃ¥tt","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavendelskimrande","hotpink":"varmrosa","steelblue":"stÃ¥lblÃ¥tt","tomato":"tomatrött","lightpink":"ljusrosa","limegreen":"limegrönt","indianred":"indianrött","papayawhip":"papayaröra","lightslategray":"ljust skiffergrÃ¥tt","gray":"grÃ¥tt","mediumorchid":"mellanorkidé","cornsilk":"gulvitt","black":"svart","seagreen":"havsgrönt","darkslateblue":"mörkt skifferblÃ¥tt","khaki":"kaki","lightblue":"ljusblÃ¥tt","palegreen":"blekgrönt","azure":"azurblÃ¥tt","peachpuff":"persika","darkolivegreen":"mörkt olivgrönt","yellowgreen":"gulgrönt"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"−","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"¤¤¤","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":" ","percentFormat":"#,##0 %","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"×10^"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"FöregÃ¥ende alternativ","nextMessage":"Fler alternativ"} +, +'dijit/nls/common':{"buttonOk":"OK","buttonCancel":"Avbryt","buttonSave":"Spara","itemClose":"Stäng"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_th.js b/lib/dojo/nls/tt-rss-layer_th.js index 95820b7b..b1f871bd 100644 --- a/lib/dojo/nls/tt-rss-layer_th.js +++ b/lib/dojo/nls/tt-rss-layer_th.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_th");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.th");dojo.nls.colors.th={"lightsteelblue":"light steel blue","orangered":"ส้มแกมแดง","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"เทาเข้ม","ivory":"งาช้าง","greenyellow":"เขียวแกมเหลือง","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"เงิน","dimgrey":"dim gray","orange":"ส้ม","white":"ขาว","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"ชมพูเข้ม","lime":"เหลืองมะนาว","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"เขียวแกมน้ำเงินเข้ม","yellow":"เหลือง","linen":"linen","olive":"โอลีฟ","gold":"ทอง","lawngreen":"lawn green","lightyellow":"เหลืองอ่อน","tan":"tan","darkviolet":"ม่วงเข้ม","lightslategrey":"light slate gray","grey":"เทา","darkkhaki":"dark khaki","green":"เขียว","deepskyblue":"deep sky blue","aqua":"ฟ้าน้ำทะเล","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"แดงแกมม่วง","lightseagreen":"light sea green","cyan":"เขียวแกมน้ำเงิน","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"ม่วงลาเวนเดอร์","mediumseagreen":"medium sea green","maroon":"น้ำตาลแดง","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"น้ำเงินเข้ม","mediumvioletred":"medium violet-red","brown":"น้ำตาล","lightgray":"เทาอ่อน","sandybrown":"sandy brown","pink":"ชมพู","firebrick":"สีอิฐ","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"ช็อกโกแลต","springgreen":"spring green","moccasin":"ม็อคค่า","navy":"น้ำเงินเข้ม","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"ม่วง","gainsboro":"gainsboro","plum":"plum","red":"แดง","blue":"น้ำเงิน","forestgreen":"forest green","darkgreen":"เขียวเข้ม","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"แดงแกมม่วงเข้ม","thistle":"thistle","whitesmoke":"ขาวควัน","wheat":"wheat","violet":"ม่วง","lightskyblue":"ฟ้าอ่อน","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"แดงเลือดหมู","darksalmon":"dark salmon","darkred":"แดงเข้ม","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"เทาอ่อน","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"ส้มเข้ม","aquamarine":"aquamarine","lightgreen":"เขียวอ่อน","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"เทาเข้ม","lightcyan":"เขียวแกมน้ำเงินอ่อน","powderblue":"powder blue","blueviolet":"น้ำเงินม่วง","orchid":"orchid","dimgray":"dim gray","beige":"น้ำตาลเบจ","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"ชมพูอ่อน","limegreen":"เขียวมะนาว","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"เทา","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"ดำ","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"น้ำเงินอ่อน","palegreen":"pale green","azure":"น้ำเงินฟ้า","peachpuff":"peach puff","darkolivegreen":"เขียวโอลีฟเข้ม","yellowgreen":"เหลืองแกมเขียว"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.th");dijit.nls.loading.th={"loadingState":"กำลังโหลด...","errorState":"ขออภัย เกิดข้อผิดพลาด"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.th");dijit.nls.common.th={"buttonOk":"ตกลง","buttonCancel":"ยกเลิก","buttonSave":"บันทึก","itemClose":"ปิด"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.th");dijit.form.nls.validate.th={"rangeMessage":"ค่านี้เกินช่วง","invalidMessage":"ค่าที่ป้อนไม่ถูกต้อง","missingMessage":"จำเป็นต้องมีค่านี้"};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.th");dijit.form.nls.ComboBox.th={"previousMessage":"การเลือกก่อนหน้า","nextMessage":"การเลือกเพิ่มเติม"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.th");dojo.cldr.nls.number.th={"group":",","percentSign":"%","exponential":"E","percentFormat":"#,##0%","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":".","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"¤#,##0.00;¤-#,##0.00","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_th",{"dijit/form/nls/validate":{"rangeMessage":"ค่านี้เกินช่วง","invalidMessage":"ค่าที่ป้อนไม่ถูกต้อง","missingMessage":"จำเป็นต้องมีค่านี้"},"dijit/nls/loading":{"loadingState":"กำลังโหลด...","errorState":"ขออภัย เกิดข้อผิดพลาด"},"dojo/nls/colors":{"lightsteelblue":"light steel blue","orangered":"ส้มแกมแดง","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"สีใส","salmon":"salmon","darkgrey":"เทาเข้ม","ivory":"งาช้าง","greenyellow":"เขียวแกมเหลือง","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"เงิน","dimgrey":"dim gray","orange":"ส้ม","white":"ขาว","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"ชมพูเข้ม","lime":"เหลืองมะนาว","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"เขียวแกมน้ำเงินเข้ม","yellow":"เหลือง","linen":"linen","olive":"โอลีฟ","gold":"ทอง","lawngreen":"lawn green","lightyellow":"เหลืองอ่อน","tan":"tan","darkviolet":"ม่วงเข้ม","lightslategrey":"light slate gray","grey":"เทา","darkkhaki":"dark khaki","green":"เขียว","deepskyblue":"deep sky blue","aqua":"ฟ้าน้ำทะเล","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"แดงแกมม่วง","lightseagreen":"light sea green","cyan":"เขียวแกมน้ำเงิน","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"ม่วงลาเวนเดอร์","mediumseagreen":"medium sea green","maroon":"น้ำตาลแดง","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"น้ำเงินเข้ม","mediumvioletred":"medium violet-red","brown":"น้ำตาล","lightgray":"เทาอ่อน","sandybrown":"sandy brown","pink":"ชมพู","firebrick":"สีอิฐ","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"ช็อกโกแลต","springgreen":"spring green","moccasin":"ม็อคค่า","navy":"น้ำเงินเข้ม","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"ม่วง","gainsboro":"gainsboro","plum":"plum","red":"แดง","blue":"น้ำเงิน","forestgreen":"forest green","darkgreen":"เขียวเข้ม","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"แดงแกมม่วงเข้ม","thistle":"thistle","whitesmoke":"ขาวควัน","wheat":"wheat","violet":"ม่วง","lightskyblue":"ฟ้าอ่อน","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"แดงเลือดหมู","darksalmon":"dark salmon","darkred":"แดงเข้ม","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"เทาอ่อน","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"ส้มเข้ม","aquamarine":"aquamarine","lightgreen":"เขียวอ่อน","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"เทาเข้ม","lightcyan":"เขียวแกมน้ำเงินอ่อน","powderblue":"powder blue","blueviolet":"น้ำเงินม่วง","orchid":"orchid","dimgray":"dim gray","beige":"น้ำตาลเบจ","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"ชมพูอ่อน","limegreen":"เขียวมะนาว","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"เทา","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"ดำ","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"น้ำเงินอ่อน","palegreen":"pale green","azure":"น้ำเงินฟ้า","peachpuff":"peach puff","darkolivegreen":"เขียวโอลีฟเข้ม","yellowgreen":"เหลืองแกมเขียว"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00;¤-#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"การเลือกก่อนหน้า","nextMessage":"การเลือกเพิ่มเติม"},"dijit/nls/common":{"buttonOk":"ตกลง","buttonCancel":"ยกเลิก","buttonSave":"บันทึก","itemClose":"ปิด"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_th.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_th.js.uncompressed.js new file mode 100644 index 00000000..003f3d3c --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_th.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_th',{ +'dijit/form/nls/validate':{"rangeMessage":"ค่านี้เกินช่วง","invalidMessage":"ค่าที่ป้อนไม่ถูกต้อง","missingMessage":"จำเป็นต้องมีค่านี้"} +, +'dijit/nls/loading':{"loadingState":"กำลังโหลด...","errorState":"ขออภัย เกิดข้อผิดพลาด"} +, +'dojo/nls/colors':{"lightsteelblue":"light steel blue","orangered":"ส้มแกมแดง","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","transparent":"สีใส","salmon":"salmon","darkgrey":"เทาเข้ม","ivory":"งาช้าง","greenyellow":"เขียวแกมเหลือง","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"เงิน","dimgrey":"dim gray","orange":"ส้ม","white":"ขาว","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"ชมพูเข้ม","lime":"เหลืองมะนาว","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"เขียวแกมน้ำเงินเข้ม","yellow":"เหลือง","linen":"linen","olive":"โอลีฟ","gold":"ทอง","lawngreen":"lawn green","lightyellow":"เหลืองอ่อน","tan":"tan","darkviolet":"ม่วงเข้ม","lightslategrey":"light slate gray","grey":"เทา","darkkhaki":"dark khaki","green":"เขียว","deepskyblue":"deep sky blue","aqua":"ฟ้าน้ำทะเล","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"แดงแกมม่วง","lightseagreen":"light sea green","cyan":"เขียวแกมน้ำเงิน","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"ม่วงลาเวนเดอร์","mediumseagreen":"medium sea green","maroon":"น้ำตาลแดง","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"น้ำเงินเข้ม","mediumvioletred":"medium violet-red","brown":"น้ำตาล","lightgray":"เทาอ่อน","sandybrown":"sandy brown","pink":"ชมพู","firebrick":"สีอิฐ","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"ช็อกโกแลต","springgreen":"spring green","moccasin":"ม็อคค่า","navy":"น้ำเงินเข้ม","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"ม่วง","gainsboro":"gainsboro","plum":"plum","red":"แดง","blue":"น้ำเงิน","forestgreen":"forest green","darkgreen":"เขียวเข้ม","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"แดงแกมม่วงเข้ม","thistle":"thistle","whitesmoke":"ขาวควัน","wheat":"wheat","violet":"ม่วง","lightskyblue":"ฟ้าอ่อน","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"แดงเลือดหมู","darksalmon":"dark salmon","darkred":"แดงเข้ม","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"เทาอ่อน","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"ส้มเข้ม","aquamarine":"aquamarine","lightgreen":"เขียวอ่อน","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"เทาเข้ม","lightcyan":"เขียวแกมน้ำเงินอ่อน","powderblue":"powder blue","blueviolet":"น้ำเงินม่วง","orchid":"orchid","dimgray":"dim gray","beige":"น้ำตาลเบจ","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"ชมพูอ่อน","limegreen":"เขียวมะนาว","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"เทา","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"ดำ","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"น้ำเงินอ่อน","palegreen":"pale green","azure":"น้ำเงินฟ้า","peachpuff":"peach puff","darkolivegreen":"เขียวโอลีฟเข้ม","yellowgreen":"เหลืองแกมเขียว"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00;¤-#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"การเลือกก่อนหน้า","nextMessage":"การเลือกเพิ่มเติม"} +, +'dijit/nls/common':{"buttonOk":"ตกลง","buttonCancel":"ยกเลิก","buttonSave":"บันทึก","itemClose":"ปิด"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_tr.js b/lib/dojo/nls/tt-rss-layer_tr.js index 163130bf..30e824e0 100644 --- a/lib/dojo/nls/tt-rss-layer_tr.js +++ b/lib/dojo/nls/tt-rss-layer_tr.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_tr");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.tr");dojo.nls.colors.tr={"lightsteelblue":"açık metalik mavi","orangered":"turuncu kırmızı","midnightblue":"gece mavisi","cadetblue":"denizci mavisi","seashell":"deniz kabuğu","slategrey":"arduvaz grisi","coral":"mercan","darkturquoise":"koyu turkuaz","antiquewhite":"antik beyaz","mediumspringgreen":"orta bahar yeşili","salmon":"somon","darkgrey":"koyu gri","ivory":"fildişi","greenyellow":"yeşil-sarı","mistyrose":"gülkurusu","lightsalmon":"açık somon","silver":"gümüş","dimgrey":"soluk gri","orange":"turuncu","white":"beyaz","navajowhite":"navajo beyazı","royalblue":"parlak koyu mavi","deeppink":"koyu pembe","lime":"limon yeşili","oldlace":"eski dantel","chartreuse":"chartreuse","darkcyan":"koyu camgöbeği","yellow":"sarı","linen":"keten","olive":"zeytin","gold":"altın","lawngreen":"çimen yeşili","lightyellow":"açık sarı","tan":"güneş yanığı","darkviolet":"koyu eflatun","lightslategrey":"açık arduvaz grisi","grey":"gri","darkkhaki":"koyu haki","green":"yeşil","deepskyblue":"koyu gök mavisi","aqua":"deniz mavisi","sienna":"koyu kahve","mintcream":"naneli krem","rosybrown":"pembemsi kahverengi","mediumslateblue":"orta arduvaz mavisi","magenta":"macenta","lightseagreen":"açık deniz yeşili","cyan":"camgöbeği","olivedrab":"asker yeşili","darkgoldenrod":"koyu sarı","slateblue":"arduvaz mavisi","mediumaquamarine":"orta akuamarin","lavender":"lavanta","mediumseagreen":"orta deniz yeşili","maroon":"kestane","darkslategray":"koyu arduvaz grisi","mediumturquoise":"orta turkuaz","ghostwhite":"silik beyaz","darkblue":"koyu mavi","mediumvioletred":"orta menekşe kırmızısı","brown":"kahverengi","lightgray":"açık gri","sandybrown":"kum rengi","pink":"pembe","firebrick":"canlı kiremit","indigo":"çivit mavisi","snow":"kar","darkorchid":"koyu orkide","turquoise":"turkuaz","chocolate":"çikolata","springgreen":"bahar yeşili","moccasin":"mokosen","navy":"lacivert","lemonchiffon":"limoni","teal":"Teal mavi","floralwhite":"çiçek beyazı","cornflowerblue":"peygamber çiçeği mavisi","paleturquoise":"soluk turkuaz","purple":"mor","gainsboro":"gainsboro","plum":"erik","red":"kırmızı","blue":"mavi","forestgreen":"koyu deniz yeşili","darkgreen":"koyu yeşil","honeydew":"çam sakızı","darkseagreen":"koyu deniz yeşili","lightcoral":"açık mercan","palevioletred":"soluk menekşe kırmızısı","mediumpurple":"orta mor","saddlebrown":"açık kahve","darkmagenta":"koyu mor","thistle":"devedikeni","whitesmoke":"beyaz duman","wheat":"buğday","violet":"eflatun","lightskyblue":"açık gök mavisi","goldenrod":"sarısabır","mediumblue":"orta mavi","skyblue":"gök mavisi","crimson":"crimson","darksalmon":"koyu somon","darkred":"koyu kırmızı","darkslategrey":"koyu arduvaz grisi","peru":"peru","lightgrey":"açık gri","lightgoldenrodyellow":"açık sarısabır","blanchedalmond":"soluk badem","aliceblue":"alice mavisi","bisque":"bisküvi","slategray":"arduvaz grisi","palegoldenrod":"soluk sarısabır","darkorange":"koyu turuncu","aquamarine":"akuamarin","lightgreen":"açık yeşil","burlywood":"sarımsı kahverengi","dodgerblue":"toz mavisi","darkgray":"koyu gri","lightcyan":"açık camgöbeği","powderblue":"pudra mavisi","blueviolet":"mavi-mor","orchid":"orkide","dimgray":"soluk gri","beige":"bej","fuchsia":"fuşya","lavenderblush":"lavanta pembesi","hotpink":"sıcak pembe","steelblue":"metalik mavi","tomato":"domates","lightpink":"açık pembe","limegreen":"küf yeşili","indianred":"kızılderili kırmızısı","papayawhip":"papaya sapı","lightslategray":"açık arduvaz grisi","gray":"gri","mediumorchid":"orta orkide","cornsilk":"mısır rengi","black":"siyah","seagreen":"deniz yeşili","darkslateblue":"koyu arduvaz mavisi","khaki":"haki","lightblue":"açık mavi","palegreen":"soluk yeşil","azure":"azur mavisi","peachpuff":"açık şeftali","darkolivegreen":"koyu zeytin yeşili","yellowgreen":"sarı yeşil"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.tr");dijit.nls.loading.tr={"loadingState":"Yükleniyor...","errorState":"Üzgünüz, bir hata oluştu"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.tr");dijit.nls.common.tr={"buttonOk":"Tamam","buttonCancel":"Ä°ptal","buttonSave":"Kaydet","itemClose":"Kapat"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.tr");dijit.form.nls.validate.tr={"rangeMessage":"Bu değer aralık dışında.","invalidMessage":"Girilen değer geçersiz.","missingMessage":"Bu değer gerekli."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.tr");dijit.form.nls.ComboBox.tr={"previousMessage":"Önceki seçenekler","nextMessage":"Diğer seçenekler"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.tr");dojo.cldr.nls.number.tr={"group":".","percentSign":"%","exponential":"E","percentFormat":"% #,##0","scientificFormat":"#E0","list":";","infinity":"∞","patternDigit":"#","minusSign":"-","decimal":",","nan":"NaN","nativeZeroDigit":"0","perMille":"‰","decimalFormat":"#,##0.###","currencyFormat":"#,##0.00 ¤","plusSign":"+","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","currencySpacing-beforeCurrency-insertBetween":" "}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_tr",{"dijit/form/nls/validate":{"rangeMessage":"Bu değer aralık dışında.","invalidMessage":"Girilen değer geçersiz.","missingMessage":"Bu değer gerekli."},"dijit/nls/loading":{"loadingState":"Yükleniyor...","errorState":"Üzgünüz, bir hata oluştu"},"dojo/nls/colors":{"lightsteelblue":"açık metalik mavi","orangered":"turuncu kırmızı","midnightblue":"gece mavisi","cadetblue":"denizci mavisi","seashell":"deniz kabuğu","slategrey":"arduvaz grisi","coral":"mercan","darkturquoise":"koyu turkuaz","antiquewhite":"antik beyaz","mediumspringgreen":"orta bahar yeşili","transparent":"saydam","salmon":"somon","darkgrey":"koyu gri","ivory":"fildişi","greenyellow":"yeşil-sarı","mistyrose":"gülkurusu","lightsalmon":"açık somon","silver":"gümüş","dimgrey":"soluk gri","orange":"turuncu","white":"beyaz","navajowhite":"navajo beyazı","royalblue":"parlak koyu mavi","deeppink":"koyu pembe","lime":"limon yeşili","oldlace":"eski dantel","chartreuse":"chartreuse","darkcyan":"koyu camgöbeği","yellow":"sarı","linen":"keten","olive":"zeytin","gold":"altın","lawngreen":"çimen yeşili","lightyellow":"açık sarı","tan":"güneş yanığı","darkviolet":"koyu eflatun","lightslategrey":"açık arduvaz grisi","grey":"gri","darkkhaki":"koyu haki","green":"yeşil","deepskyblue":"koyu gök mavisi","aqua":"deniz mavisi","sienna":"koyu kahve","mintcream":"naneli krem","rosybrown":"pembemsi kahverengi","mediumslateblue":"orta arduvaz mavisi","magenta":"macenta","lightseagreen":"açık deniz yeşili","cyan":"camgöbeği","olivedrab":"asker yeşili","darkgoldenrod":"koyu sarı","slateblue":"arduvaz mavisi","mediumaquamarine":"orta akuamarin","lavender":"lavanta","mediumseagreen":"orta deniz yeşili","maroon":"kestane","darkslategray":"koyu arduvaz grisi","mediumturquoise":"orta turkuaz","ghostwhite":"silik beyaz","darkblue":"koyu mavi","mediumvioletred":"orta menekşe kırmızısı","brown":"kahverengi","lightgray":"açık gri","sandybrown":"kum rengi","pink":"pembe","firebrick":"canlı kiremit","indigo":"çivit mavisi","snow":"kar","darkorchid":"koyu orkide","turquoise":"turkuaz","chocolate":"çikolata","springgreen":"bahar yeşili","moccasin":"mokosen","navy":"lacivert","lemonchiffon":"limoni","teal":"Teal mavi","floralwhite":"çiçek beyazı","cornflowerblue":"peygamber çiçeği mavisi","paleturquoise":"soluk turkuaz","purple":"mor","gainsboro":"gainsboro","plum":"erik","red":"kırmızı","blue":"mavi","forestgreen":"koyu deniz yeşili","darkgreen":"koyu yeşil","honeydew":"çam sakızı","darkseagreen":"koyu deniz yeşili","lightcoral":"açık mercan","palevioletred":"soluk menekşe kırmızısı","mediumpurple":"orta mor","saddlebrown":"açık kahve","darkmagenta":"koyu mor","thistle":"devedikeni","whitesmoke":"beyaz duman","wheat":"buğday","violet":"eflatun","lightskyblue":"açık gök mavisi","goldenrod":"sarısabır","mediumblue":"orta mavi","skyblue":"gök mavisi","crimson":"crimson","darksalmon":"koyu somon","darkred":"koyu kırmızı","darkslategrey":"koyu arduvaz grisi","peru":"peru","lightgrey":"açık gri","lightgoldenrodyellow":"açık sarısabır","blanchedalmond":"soluk badem","aliceblue":"alice mavisi","bisque":"bisküvi","slategray":"arduvaz grisi","palegoldenrod":"soluk sarısabır","darkorange":"koyu turuncu","aquamarine":"akuamarin","lightgreen":"açık yeşil","burlywood":"sarımsı kahverengi","dodgerblue":"toz mavisi","darkgray":"koyu gri","lightcyan":"açık camgöbeği","powderblue":"pudra mavisi","blueviolet":"mavi-mor","orchid":"orkide","dimgray":"soluk gri","beige":"bej","fuchsia":"fuşya","lavenderblush":"lavanta pembesi","hotpink":"sıcak pembe","steelblue":"metalik mavi","tomato":"domates","lightpink":"açık pembe","limegreen":"küf yeşili","indianred":"kızılderili kırmızısı","papayawhip":"papaya sapı","lightslategray":"açık arduvaz grisi","gray":"gri","mediumorchid":"orta orkide","cornsilk":"mısır rengi","black":"siyah","seagreen":"deniz yeşili","darkslateblue":"koyu arduvaz mavisi","khaki":"haki","lightblue":"açık mavi","palegreen":"soluk yeşil","azure":"azur mavisi","peachpuff":"açık şeftali","darkolivegreen":"koyu zeytin yeşili","yellowgreen":"sarı yeşil"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"% #,##0","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"Önceki seçenekler","nextMessage":"Diğer seçenekler"},"dijit/nls/common":{"buttonOk":"Tamam","buttonCancel":"Ä°ptal","buttonSave":"Kaydet","itemClose":"Kapat"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_tr.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_tr.js.uncompressed.js new file mode 100644 index 00000000..444d7afe --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_tr.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_tr',{ +'dijit/form/nls/validate':{"rangeMessage":"Bu değer aralık dışında.","invalidMessage":"Girilen değer geçersiz.","missingMessage":"Bu değer gerekli."} +, +'dijit/nls/loading':{"loadingState":"Yükleniyor...","errorState":"Üzgünüz, bir hata oluştu"} +, +'dojo/nls/colors':{"lightsteelblue":"açık metalik mavi","orangered":"turuncu kırmızı","midnightblue":"gece mavisi","cadetblue":"denizci mavisi","seashell":"deniz kabuğu","slategrey":"arduvaz grisi","coral":"mercan","darkturquoise":"koyu turkuaz","antiquewhite":"antik beyaz","mediumspringgreen":"orta bahar yeşili","transparent":"saydam","salmon":"somon","darkgrey":"koyu gri","ivory":"fildişi","greenyellow":"yeşil-sarı","mistyrose":"gülkurusu","lightsalmon":"açık somon","silver":"gümüş","dimgrey":"soluk gri","orange":"turuncu","white":"beyaz","navajowhite":"navajo beyazı","royalblue":"parlak koyu mavi","deeppink":"koyu pembe","lime":"limon yeşili","oldlace":"eski dantel","chartreuse":"chartreuse","darkcyan":"koyu camgöbeği","yellow":"sarı","linen":"keten","olive":"zeytin","gold":"altın","lawngreen":"çimen yeşili","lightyellow":"açık sarı","tan":"güneş yanığı","darkviolet":"koyu eflatun","lightslategrey":"açık arduvaz grisi","grey":"gri","darkkhaki":"koyu haki","green":"yeşil","deepskyblue":"koyu gök mavisi","aqua":"deniz mavisi","sienna":"koyu kahve","mintcream":"naneli krem","rosybrown":"pembemsi kahverengi","mediumslateblue":"orta arduvaz mavisi","magenta":"macenta","lightseagreen":"açık deniz yeşili","cyan":"camgöbeği","olivedrab":"asker yeşili","darkgoldenrod":"koyu sarı","slateblue":"arduvaz mavisi","mediumaquamarine":"orta akuamarin","lavender":"lavanta","mediumseagreen":"orta deniz yeşili","maroon":"kestane","darkslategray":"koyu arduvaz grisi","mediumturquoise":"orta turkuaz","ghostwhite":"silik beyaz","darkblue":"koyu mavi","mediumvioletred":"orta menekşe kırmızısı","brown":"kahverengi","lightgray":"açık gri","sandybrown":"kum rengi","pink":"pembe","firebrick":"canlı kiremit","indigo":"çivit mavisi","snow":"kar","darkorchid":"koyu orkide","turquoise":"turkuaz","chocolate":"çikolata","springgreen":"bahar yeşili","moccasin":"mokosen","navy":"lacivert","lemonchiffon":"limoni","teal":"Teal mavi","floralwhite":"çiçek beyazı","cornflowerblue":"peygamber çiçeği mavisi","paleturquoise":"soluk turkuaz","purple":"mor","gainsboro":"gainsboro","plum":"erik","red":"kırmızı","blue":"mavi","forestgreen":"koyu deniz yeşili","darkgreen":"koyu yeşil","honeydew":"çam sakızı","darkseagreen":"koyu deniz yeşili","lightcoral":"açık mercan","palevioletred":"soluk menekşe kırmızısı","mediumpurple":"orta mor","saddlebrown":"açık kahve","darkmagenta":"koyu mor","thistle":"devedikeni","whitesmoke":"beyaz duman","wheat":"buğday","violet":"eflatun","lightskyblue":"açık gök mavisi","goldenrod":"sarısabır","mediumblue":"orta mavi","skyblue":"gök mavisi","crimson":"crimson","darksalmon":"koyu somon","darkred":"koyu kırmızı","darkslategrey":"koyu arduvaz grisi","peru":"peru","lightgrey":"açık gri","lightgoldenrodyellow":"açık sarısabır","blanchedalmond":"soluk badem","aliceblue":"alice mavisi","bisque":"bisküvi","slategray":"arduvaz grisi","palegoldenrod":"soluk sarısabır","darkorange":"koyu turuncu","aquamarine":"akuamarin","lightgreen":"açık yeşil","burlywood":"sarımsı kahverengi","dodgerblue":"toz mavisi","darkgray":"koyu gri","lightcyan":"açık camgöbeği","powderblue":"pudra mavisi","blueviolet":"mavi-mor","orchid":"orkide","dimgray":"soluk gri","beige":"bej","fuchsia":"fuşya","lavenderblush":"lavanta pembesi","hotpink":"sıcak pembe","steelblue":"metalik mavi","tomato":"domates","lightpink":"açık pembe","limegreen":"küf yeşili","indianred":"kızılderili kırmızısı","papayawhip":"papaya sapı","lightslategray":"açık arduvaz grisi","gray":"gri","mediumorchid":"orta orkide","cornsilk":"mısır rengi","black":"siyah","seagreen":"deniz yeşili","darkslateblue":"koyu arduvaz mavisi","khaki":"haki","lightblue":"açık mavi","palegreen":"soluk yeşil","azure":"azur mavisi","peachpuff":"açık şeftali","darkolivegreen":"koyu zeytin yeşili","yellowgreen":"sarı yeşil"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"#,##0.00 ¤","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":".","percentFormat":"% #,##0","decimalFormat":"#,##0.###","decimal":",","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"Önceki seçenekler","nextMessage":"Diğer seçenekler"} +, +'dijit/nls/common':{"buttonOk":"Tamam","buttonCancel":"Ä°ptal","buttonSave":"Kaydet","itemClose":"Kapat"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_xx.js b/lib/dojo/nls/tt-rss-layer_xx.js deleted file mode 100644 index a4f0b853..00000000 --- a/lib/dojo/nls/tt-rss-layer_xx.js +++ /dev/null @@ -1 +0,0 @@ -dojo.provide("dojo.nls.tt-rss-layer_xx");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.xx");dojo.nls.colors.xx={"lightsteelblue":"light steel blue","orangered":"orange red","midnightblue":"midnight blue","cadetblue":"cadet blue","seashell":"seashell","slategrey":"slate gray","coral":"coral","darkturquoise":"dark turquoise","antiquewhite":"antique white","mediumspringgreen":"medium spring green","salmon":"salmon","darkgrey":"dark gray","ivory":"ivory","greenyellow":"green-yellow","mistyrose":"misty rose","lightsalmon":"light salmon","silver":"silver","dimgrey":"dim gray","orange":"orange","white":"white","navajowhite":"navajo white","royalblue":"royal blue","deeppink":"deep pink","lime":"lime","oldlace":"old lace","chartreuse":"chartreuse","darkcyan":"dark cyan","yellow":"yellow","linen":"linen","olive":"olive","gold":"gold","lawngreen":"lawn green","lightyellow":"light yellow","tan":"tan","darkviolet":"dark violet","lightslategrey":"light slate gray","grey":"gray","darkkhaki":"dark khaki","green":"green","deepskyblue":"deep sky blue","aqua":"aqua","sienna":"sienna","mintcream":"mint cream","rosybrown":"rosy brown","mediumslateblue":"medium slate blue","magenta":"magenta","lightseagreen":"light sea green","cyan":"cyan","olivedrab":"olive drab","darkgoldenrod":"dark goldenrod","slateblue":"slate blue","mediumaquamarine":"medium aquamarine","lavender":"lavender","mediumseagreen":"medium sea green","maroon":"maroon","darkslategray":"dark slate gray","mediumturquoise":"medium turquoise","ghostwhite":"ghost white","darkblue":"dark blue","mediumvioletred":"medium violet-red","brown":"brown","lightgray":"light gray","sandybrown":"sandy brown","pink":"pink","firebrick":"fire brick","indigo":"indigo","snow":"snow","darkorchid":"dark orchid","turquoise":"turquoise","chocolate":"chocolate","springgreen":"spring green","moccasin":"moccasin","navy":"navy","lemonchiffon":"lemon chiffon","teal":"teal","floralwhite":"floral white","cornflowerblue":"cornflower blue","paleturquoise":"pale turquoise","purple":"purple","gainsboro":"gainsboro","plum":"plum","red":"red","blue":"blue","forestgreen":"forest green","darkgreen":"dark green","honeydew":"honeydew","darkseagreen":"dark sea green","lightcoral":"light coral","palevioletred":"pale violet-red","mediumpurple":"medium purple","saddlebrown":"saddle brown","darkmagenta":"dark magenta","thistle":"thistle","whitesmoke":"white smoke","wheat":"wheat","violet":"violet","lightskyblue":"light sky blue","goldenrod":"goldenrod","mediumblue":"medium blue","skyblue":"sky blue","crimson":"crimson","darksalmon":"dark salmon","darkred":"dark red","darkslategrey":"dark slate gray","peru":"peru","lightgrey":"light gray","lightgoldenrodyellow":"light goldenrod yellow","blanchedalmond":"blanched almond","aliceblue":"alice blue","bisque":"bisque","slategray":"slate gray","palegoldenrod":"pale goldenrod","darkorange":"dark orange","aquamarine":"aquamarine","lightgreen":"light green","burlywood":"burlywood","dodgerblue":"dodger blue","darkgray":"dark gray","lightcyan":"light cyan","powderblue":"powder blue","blueviolet":"blue-violet","orchid":"orchid","dimgray":"dim gray","beige":"beige","fuchsia":"fuchsia","lavenderblush":"lavender blush","hotpink":"hot pink","steelblue":"steel blue","tomato":"tomato","lightpink":"light pink","limegreen":"lime green","indianred":"indian red","papayawhip":"papaya whip","lightslategray":"light slate gray","gray":"gray","mediumorchid":"medium orchid","cornsilk":"cornsilk","black":"black","seagreen":"sea green","darkslateblue":"dark slate blue","khaki":"khaki","lightblue":"light blue","palegreen":"pale green","azure":"azure","peachpuff":"peach puff","darkolivegreen":"dark olive green","yellowgreen":"yellow green"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.xx");dijit.nls.loading.xx={"loadingState":"Loading...","errorState":"Sorry, an error occurred"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.xx");dijit.nls.common.xx={"buttonOk":"OK","buttonCancel":"Cancel","buttonSave":"Save","itemClose":"Close"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.xx");dijit.form.nls.validate.xx={"rangeMessage":"This value is out of range.","invalidMessage":"The value entered is not valid.","missingMessage":"This value is required."};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.xx");dijit.form.nls.ComboBox.xx={"previousMessage":"Previous choices","nextMessage":"More choices"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.xx");dojo.cldr.nls.number.xx={"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤ #,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}; diff --git a/lib/dojo/nls/tt-rss-layer_zh-cn.js b/lib/dojo/nls/tt-rss-layer_zh-cn.js index e16eeb4b..b1ad719c 100644 --- a/lib/dojo/nls/tt-rss-layer_zh-cn.js +++ b/lib/dojo/nls/tt-rss-layer_zh-cn.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_zh-cn");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.zh_cn");dojo.nls.colors.zh_cn={"lightsteelblue":"浅钢蓝色","orangered":"桔红色","midnightblue":"蓝黑色","cadetblue":"军队蓝","seashell":"贝壳白","slategrey":"石板灰","coral":"珊瑚红","darkturquoise":"深青绿色","antiquewhite":"古董白","mediumspringgreen":"淡草绿色","salmon":"橙红色","darkgrey":"深灰色","ivory":"象牙色","greenyellow":"绿黄色","mistyrose":"粉红玫瑰","lightsalmon":"浅橙红色","silver":"银白色","dimgrey":"暗灰色","orange":"橙色","white":"白色","navajowhite":"印地安黄","royalblue":"亮蓝色","deeppink":"深粉色","lime":"酸橙色","oldlace":"旧布黄","chartreuse":"浅黄绿色","darkcyan":"深青色","yellow":"黄色","linen":"亚麻布色","olive":"橄榄色","gold":"金黄色","lawngreen":"草绿色","lightyellow":"浅黄色","tan":"茶色","darkviolet":"深紫罗兰","lightslategrey":"浅石板灰","grey":"灰色","darkkhaki":"深褐色","green":"绿色","deepskyblue":"深天蓝色","aqua":"水绿色","sienna":"赭色","mintcream":"薄荷乳白","rosybrown":"玫瑰褐色","mediumslateblue":"淡灰蓝色","magenta":"洋红色","lightseagreen":"浅海绿色","cyan":"青色","olivedrab":"暗橄榄色","darkgoldenrod":"深金黄色","slateblue":"石板蓝","mediumaquamarine":"淡碧绿色","lavender":"淡紫色","mediumseagreen":"淡海绿色","maroon":"褐紫红色","darkslategray":"深石板灰","mediumturquoise":"淡青绿色","ghostwhite":"苍白","darkblue":"深蓝色","mediumvioletred":"淡紫罗兰","brown":"褐色","lightgray":"浅灰色","sandybrown":"浅褐色","pink":"粉红色","firebrick":"砖红色","indigo":"靛蓝色","snow":"雪白","darkorchid":"暗兰花紫","turquoise":"青绿色","chocolate":"巧克力色","springgreen":"浅草绿色","moccasin":"鹿皮黄","navy":"藏青色","lemonchiffon":"柠檬色","teal":"青色","floralwhite":"花白","cornflowerblue":"藏蓝色","paleturquoise":"淡青绿色","purple":"紫色","gainsboro":"亮灰色","plum":"梅红色","red":"红色","blue":"蓝色","forestgreen":"森林绿","darkgreen":"深绿色","honeydew":"蜜色","darkseagreen":"深海绿色","lightcoral":"浅珊瑚红","palevioletred":"浅紫罗兰","mediumpurple":"淡紫色","saddlebrown":"鞍具褐色","darkmagenta":"深洋红色","thistle":"蓟色","whitesmoke":"烟白色","wheat":"淡黄色","violet":"紫罗兰色","lightskyblue":"浅天蓝色","goldenrod":"鲜黄","mediumblue":"淡蓝色","skyblue":"天蓝色","crimson":"绯红色","darksalmon":"深橙红","darkred":"深红色","darkslategrey":"深石板灰","peru":"秘鲁棕","lightgrey":"浅灰色","lightgoldenrodyellow":"浅金黄色","blanchedalmond":"杏仁白","aliceblue":"艾莉斯蓝","bisque":"乳黄色","slategray":"石板灰","palegoldenrod":"浅金黄色","darkorange":"深橙色","aquamarine":"碧绿色","lightgreen":"浅绿色","burlywood":"原木色","dodgerblue":"宝蓝","darkgray":"深灰色","lightcyan":"浅青色","powderblue":"粉蓝色","blueviolet":"蓝紫色","orchid":"兰花紫","dimgray":"暗灰色","beige":"米色","fuchsia":"紫红色","lavenderblush":"淡紫红色","hotpink":"暗粉","steelblue":"钢蓝色","tomato":"番茄色","lightpink":"浅粉色","limegreen":"暗黄绿色","indianred":"印度红","papayawhip":"粉木瓜橙","lightslategray":"浅石板灰","gray":"灰色","mediumorchid":"淡兰花紫","cornsilk":"玉米黄","black":"黑色","seagreen":"海绿色","darkslateblue":"深石板蓝","khaki":"黄褐色","lightblue":"淡蓝色","palegreen":"淡绿色","azure":"浅天蓝","peachpuff":"粉桃红","darkolivegreen":"深橄榄绿色","yellowgreen":"黄绿色"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.zh_cn");dijit.nls.loading.zh_cn={"loadingState":"正在加载...","errorState":"对不起,发生了错误"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.zh_cn");dijit.nls.common.zh_cn={"buttonOk":"确定","buttonCancel":"取消","buttonSave":"保存","itemClose":"关闭"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.zh_cn");dijit.form.nls.validate.zh_cn={"rangeMessage":"此值超出范围。","invalidMessage":"输入的值无效。","missingMessage":"此值是必需值。"};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.zh_cn");dijit.form.nls.ComboBox.zh_cn={"previousMessage":"先前选项","nextMessage":"更多选项"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.zh_cn");dojo.cldr.nls.number.zh_cn={"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_zh-cn",{"dijit/form/nls/validate":{"rangeMessage":"此值超出范围。","invalidMessage":"输入的值无效。","missingMessage":"此值是必需值。"},"dijit/nls/loading":{"loadingState":"正在加载...","errorState":"对不起,发生了错误"},"dojo/nls/colors":{"lightsteelblue":"浅钢蓝色","orangered":"橙红色","midnightblue":"深蓝色","cadetblue":"灰蓝色","seashell":"海贝色","slategrey":"灰石色","coral":"珊瑚色","darkturquoise":"深粉蓝","antiquewhite":"古董白","mediumspringgreen":"间春绿色","transparent":"透明的","salmon":"橙红","darkgrey":"深灰色","ivory":"象牙色","greenyellow":"绿黄色","mistyrose":"浅玫瑰色","lightsalmon":"淡橙色","silver":"银白色","dimgrey":"暗灰色","orange":"橙色","white":"白色","navajowhite":"纳瓦白","royalblue":"品蓝","deeppink":"深粉红色","lime":"淡黄绿色","oldlace":"老白色","chartreuse":"黄绿色","darkcyan":"深青绿","yellow":"黄色","linen":"亚麻色","olive":"橄榄绿","gold":"金黄色","lawngreen":"草绿色","lightyellow":"浅黄色","tan":"棕褐色","darkviolet":"深紫色","lightslategrey":"浅青灰","grey":"灰色","darkkhaki":"深卡其色","green":"绿色","deepskyblue":"深天蓝色","aqua":"浅绿色","sienna":"赭色","mintcream":"薄荷色","rosybrown":"褐玫瑰红","mediumslateblue":"间暗蓝色","magenta":"洋红色","lightseagreen":"浅海藻绿","cyan":"青蓝色","olivedrab":"草绿色","darkgoldenrod":"深金黄","slateblue":"石蓝色","mediumaquamarine":"间绿色","lavender":"淡紫色","mediumseagreen":"间海蓝色","maroon":"栗色","darkslategray":"深青灰","mediumturquoise":"间绿宝石色","ghostwhite":"苍白","darkblue":"深蓝","mediumvioletred":"间紫罗兰色","brown":"棕色","lightgray":"浅灰色","sandybrown":"沙褐色","pink":"粉红色","firebrick":"砖红","indigo":"靛青","snow":"雪白色","darkorchid":"深紫色","turquoise":"绿宝石色","chocolate":"巧克力色","springgreen":"春绿色","moccasin":"鹿皮色","navy":"藏青色","lemonchiffon":"柠檬绸色","teal":"水鸭色","floralwhite":"花白色","cornflowerblue":"浅蓝色","paleturquoise":"苍绿色","purple":"紫色","gainsboro":"淡灰色","plum":"杨李色","red":"红色","blue":"蓝色","forestgreen":"森林绿","darkgreen":"深绿色","honeydew":"蜜汁色","darkseagreen":"深海藻绿","lightcoral":"浅珊瑚色","palevioletred":"苍紫罗兰色","mediumpurple":"间紫色","saddlebrown":"重褐色","darkmagenta":"深洋红色","thistle":"蓟色","whitesmoke":"烟白色","wheat":"浅黄色","violet":"紫色","lightskyblue":"浅天蓝色","goldenrod":"金麒麟色","mediumblue":"间蓝色","skyblue":"天蓝色","crimson":"绯红色","darksalmon":"深橙红","darkred":"深红色","darkslategrey":"深青灰","peru":"秘鲁色","lightgrey":"浅灰色","lightgoldenrodyellow":"浅金黄色","blanchedalmond":"白杏色","aliceblue":"爱丽丝蓝","bisque":"桔黄色","slategray":"灰石色","palegoldenrod":"淡金黄色","darkorange":"深橙色","aquamarine":"碧绿色","lightgreen":"浅绿色","burlywood":"实木色","dodgerblue":"闪蓝色","darkgray":"深灰色","lightcyan":"浅青色","powderblue":"铁蓝","blueviolet":"蓝紫色","orchid":"紫色","dimgray":"暗灰色","beige":"米色","fuchsia":"紫红色","lavenderblush":"淡紫红","hotpink":"深粉红","steelblue":"钢蓝色","tomato":"西红柿色","lightpink":"浅粉红色","limegreen":"橙绿色","indianred":"印度红","papayawhip":"木瓜色","lightslategray":"浅青灰","gray":"灰色","mediumorchid":"间紫色","cornsilk":"米绸色","black":"黑色","seagreen":"海绿色","darkslateblue":"深青蓝","khaki":"卡其色","lightblue":"淡蓝色","palegreen":"淡绿色","azure":"天蓝色","peachpuff":"桃色","darkolivegreen":"深橄榄绿","yellowgreen":"黄绿色"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"先前选项","nextMessage":"更多选项"},"dijit/nls/common":{"buttonOk":"确定","buttonCancel":"取消","buttonSave":"保存","itemClose":"关闭"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_zh-cn.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_zh-cn.js.uncompressed.js new file mode 100644 index 00000000..957a54ef --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_zh-cn.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_zh-cn',{ +'dijit/form/nls/validate':{"rangeMessage":"此值超出范围。","invalidMessage":"输入的值无效。","missingMessage":"此值是必需值。"} +, +'dijit/nls/loading':{"loadingState":"正在加载...","errorState":"对不起,发生了错误"} +, +'dojo/nls/colors':{"lightsteelblue":"浅钢蓝色","orangered":"橙红色","midnightblue":"深蓝色","cadetblue":"灰蓝色","seashell":"海贝色","slategrey":"灰石色","coral":"珊瑚色","darkturquoise":"深粉蓝","antiquewhite":"古董白","mediumspringgreen":"间春绿色","transparent":"透明的","salmon":"橙红","darkgrey":"深灰色","ivory":"象牙色","greenyellow":"绿黄色","mistyrose":"浅玫瑰色","lightsalmon":"淡橙色","silver":"银白色","dimgrey":"暗灰色","orange":"橙色","white":"白色","navajowhite":"纳瓦白","royalblue":"品蓝","deeppink":"深粉红色","lime":"淡黄绿色","oldlace":"老白色","chartreuse":"黄绿色","darkcyan":"深青绿","yellow":"黄色","linen":"亚麻色","olive":"橄榄绿","gold":"金黄色","lawngreen":"草绿色","lightyellow":"浅黄色","tan":"棕褐色","darkviolet":"深紫色","lightslategrey":"浅青灰","grey":"灰色","darkkhaki":"深卡其色","green":"绿色","deepskyblue":"深天蓝色","aqua":"浅绿色","sienna":"赭色","mintcream":"薄荷色","rosybrown":"褐玫瑰红","mediumslateblue":"间暗蓝色","magenta":"洋红色","lightseagreen":"浅海藻绿","cyan":"青蓝色","olivedrab":"草绿色","darkgoldenrod":"深金黄","slateblue":"石蓝色","mediumaquamarine":"间绿色","lavender":"淡紫色","mediumseagreen":"间海蓝色","maroon":"栗色","darkslategray":"深青灰","mediumturquoise":"间绿宝石色","ghostwhite":"苍白","darkblue":"深蓝","mediumvioletred":"间紫罗兰色","brown":"棕色","lightgray":"浅灰色","sandybrown":"沙褐色","pink":"粉红色","firebrick":"砖红","indigo":"靛青","snow":"雪白色","darkorchid":"深紫色","turquoise":"绿宝石色","chocolate":"巧克力色","springgreen":"春绿色","moccasin":"鹿皮色","navy":"藏青色","lemonchiffon":"柠檬绸色","teal":"水鸭色","floralwhite":"花白色","cornflowerblue":"浅蓝色","paleturquoise":"苍绿色","purple":"紫色","gainsboro":"淡灰色","plum":"杨李色","red":"红色","blue":"蓝色","forestgreen":"森林绿","darkgreen":"深绿色","honeydew":"蜜汁色","darkseagreen":"深海藻绿","lightcoral":"浅珊瑚色","palevioletred":"苍紫罗兰色","mediumpurple":"间紫色","saddlebrown":"重褐色","darkmagenta":"深洋红色","thistle":"蓟色","whitesmoke":"烟白色","wheat":"浅黄色","violet":"紫色","lightskyblue":"浅天蓝色","goldenrod":"金麒麟色","mediumblue":"间蓝色","skyblue":"天蓝色","crimson":"绯红色","darksalmon":"深橙红","darkred":"深红色","darkslategrey":"深青灰","peru":"秘鲁色","lightgrey":"浅灰色","lightgoldenrodyellow":"浅金黄色","blanchedalmond":"白杏色","aliceblue":"爱丽丝蓝","bisque":"桔黄色","slategray":"灰石色","palegoldenrod":"淡金黄色","darkorange":"深橙色","aquamarine":"碧绿色","lightgreen":"浅绿色","burlywood":"实木色","dodgerblue":"闪蓝色","darkgray":"深灰色","lightcyan":"浅青色","powderblue":"铁蓝","blueviolet":"蓝紫色","orchid":"紫色","dimgray":"暗灰色","beige":"米色","fuchsia":"紫红色","lavenderblush":"淡紫红","hotpink":"深粉红","steelblue":"钢蓝色","tomato":"西红柿色","lightpink":"浅粉红色","limegreen":"橙绿色","indianred":"印度红","papayawhip":"木瓜色","lightslategray":"浅青灰","gray":"灰色","mediumorchid":"间紫色","cornsilk":"米绸色","black":"黑色","seagreen":"海绿色","darkslateblue":"深青蓝","khaki":"卡其色","lightblue":"淡蓝色","palegreen":"淡绿色","azure":"天蓝色","peachpuff":"桃色","darkolivegreen":"深橄榄绿","yellowgreen":"黄绿色"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"先前选项","nextMessage":"更多选项"} +, +'dijit/nls/common':{"buttonOk":"确定","buttonCancel":"取消","buttonSave":"保存","itemClose":"关闭"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_zh-tw.js b/lib/dojo/nls/tt-rss-layer_zh-tw.js index 9ac816dd..99244ded 100644 --- a/lib/dojo/nls/tt-rss-layer_zh-tw.js +++ b/lib/dojo/nls/tt-rss-layer_zh-tw.js @@ -1 +1,8 @@ -dojo.provide("dojo.nls.tt-rss-layer_zh-tw");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.zh_tw");dojo.nls.colors.zh_tw={"lightsteelblue":"淡鐵藍色","orangered":"橙紅色","midnightblue":"午夜藍","cadetblue":"軍服藍","seashell":"海貝色","slategrey":"岩灰色","coral":"珊瑚紅","darkturquoise":"暗松石綠","antiquewhite":"米白色","mediumspringgreen":"中春綠色","salmon":"鮭紅色","darkgrey":"暗灰色","ivory":"象牙色","greenyellow":"綠黃色","mistyrose":"霧玫瑰色","lightsalmon":"淡鮭紅","silver":"銀色","dimgrey":"昏灰色","orange":"橙色","white":"白色","navajowhite":"印地安黃色","royalblue":"品藍色","deeppink":"深粉紅色","lime":"檸檬色","oldlace":"舊蕾絲色","chartreuse":"淡黃綠色","darkcyan":"暗青色","yellow":"黃色","linen":"亞麻色","olive":"橄欖色","gold":"金色","lawngreen":"草綠色","lightyellow":"淡黃色","tan":"皮革色","darkviolet":"暗紫羅蘭色","lightslategrey":"淡岩灰色","grey":"灰色","darkkhaki":"暗卡其色","green":"綠色","deepskyblue":"深天藍色","aqua":"水色","sienna":"黃土赭色","mintcream":"薄荷乳白色","rosybrown":"玫瑰褐","mediumslateblue":"中岩藍色","magenta":"紫紅色","lightseagreen":"淡海綠色","cyan":"青色","olivedrab":"橄欖綠","darkgoldenrod":"暗金菊色","slateblue":"岩藍色","mediumaquamarine":"中碧綠色","lavender":"薰衣草紫","mediumseagreen":"中海綠色","maroon":"栗色","darkslategray":"暗岩灰色","mediumturquoise":"中松石綠","ghostwhite":"幽靈色","darkblue":"暗藍色","mediumvioletred":"中紫羅蘭紅","brown":"褐色","lightgray":"淡灰色","sandybrown":"沙褐色","pink":"粉紅色","firebrick":"紅磚色","indigo":"靛藍色","snow":"雪白色","darkorchid":"暗蘭花色","turquoise":"松石綠","chocolate":"巧克力色","springgreen":"春綠色","moccasin":"鹿皮黃色","navy":"海軍藍","lemonchiffon":"奶油黃","teal":"深藍綠色","floralwhite":"花卉白","cornflowerblue":"矢車菊藍","paleturquoise":"灰松石綠","purple":"紫色","gainsboro":"石板灰","plum":"李紫色","red":"紅色","blue":"藍色","forestgreen":"森綠色","darkgreen":"暗綠色","honeydew":"密瓜色","darkseagreen":"暗海綠色","lightcoral":"淡珊瑚紅","palevioletred":"灰紫羅蘭紅","mediumpurple":"中紫色","saddlebrown":"鞍褐色","darkmagenta":"暗紫紅色","thistle":"薊色","whitesmoke":"白煙色","wheat":"小麥色","violet":"紫羅蘭色","lightskyblue":"淡天藍色","goldenrod":"金菊色","mediumblue":"中藍色","skyblue":"天藍色","crimson":"暗深紅色","darksalmon":"暗鮭紅","darkred":"暗紅色","darkslategrey":"暗岩灰色","peru":"祕魯色","lightgrey":"淡灰色","lightgoldenrodyellow":"淡金菊黃","blanchedalmond":"杏仁白","aliceblue":"愛麗絲藍","bisque":"橘黃色","slategray":"岩灰色","palegoldenrod":"灰金菊色","darkorange":"暗橙色","aquamarine":"碧綠色","lightgreen":"淡綠色","burlywood":"實木色","dodgerblue":"道奇藍","darkgray":"暗灰色","lightcyan":"淡青色","powderblue":"粉藍色","blueviolet":"藍紫色","orchid":"蘭花色","dimgray":"昏灰色","beige":"灰棕色","fuchsia":"海棠紅","lavenderblush":"薰衣草紫紅","hotpink":"暖粉紅色","steelblue":"鐵藍色","tomato":"蕃茄紅","lightpink":"淡粉紅色","limegreen":"檸檬綠","indianred":"印度紅","papayawhip":"番木瓜色","lightslategray":"淡岩灰色","gray":"灰色","mediumorchid":"中蘭紫色","cornsilk":"玉米黃","black":"黑色","seagreen":"海綠色","darkslateblue":"暗岩藍色","khaki":"卡其色","lightblue":"淡藍色","palegreen":"灰綠色","azure":"天藍色","peachpuff":"粉撲桃色","darkolivegreen":"暗橄欖綠","yellowgreen":"黃綠色"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.zh_tw");dijit.nls.loading.zh_tw={"loadingState":"載入中...","errorState":"抱歉,發生錯誤"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.zh_tw");dijit.nls.common.zh_tw={"buttonOk":"確定","buttonCancel":"取消","buttonSave":"儲存","itemClose":"關閉"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.zh_tw");dijit.form.nls.validate.zh_tw={"rangeMessage":"此值超出範圍。","invalidMessage":"輸入的值無效。","missingMessage":"必須提供此值。"};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.zh_tw");dijit.form.nls.ComboBox.zh_tw={"previousMessage":"前一個選擇項","nextMessage":"其他選擇項"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.zh_tw");dojo.cldr.nls.number.zh_tw={"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}; +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/tt-rss-layer_zh-tw",{"dijit/form/nls/validate":{"rangeMessage":"此值超出範圍。","invalidMessage":"輸入的值無效。","missingMessage":"必須提供此值。"},"dijit/nls/loading":{"loadingState":"載入中...","errorState":"抱歉,發生錯誤"},"dojo/nls/colors":{"lightsteelblue":"淡鐵藍色","orangered":"橙紅色","midnightblue":"午夜藍","cadetblue":"軍服藍","seashell":"海貝色","slategrey":"岩灰色","coral":"珊瑚紅","darkturquoise":"暗松石綠","antiquewhite":"米白色","mediumspringgreen":"中春綠色","transparent":"透明","salmon":"鮭紅色","darkgrey":"暗灰色","ivory":"象牙色","greenyellow":"綠黃色","mistyrose":"霧玫瑰色","lightsalmon":"淡鮭紅","silver":"銀色","dimgrey":"昏灰色","orange":"橙色","white":"白色","navajowhite":"印地安黃色","royalblue":"品藍色","deeppink":"深粉紅色","lime":"檸檬色","oldlace":"舊蕾絲色","chartreuse":"淡黃綠色","darkcyan":"暗青色","yellow":"黃色","linen":"亞麻色","olive":"橄欖色","gold":"金色","lawngreen":"草綠色","lightyellow":"淡黃色","tan":"皮革色","darkviolet":"暗紫羅蘭色","lightslategrey":"淡岩灰色","grey":"灰色","darkkhaki":"暗卡其色","green":"綠色","deepskyblue":"深天藍色","aqua":"水色","sienna":"黃土赭色","mintcream":"薄荷乳白色","rosybrown":"玫瑰褐","mediumslateblue":"中岩藍色","magenta":"紫紅色","lightseagreen":"淡海綠色","cyan":"青色","olivedrab":"橄欖綠","darkgoldenrod":"暗金菊色","slateblue":"岩藍色","mediumaquamarine":"中碧綠色","lavender":"薰衣草紫","mediumseagreen":"中海綠色","maroon":"栗色","darkslategray":"暗岩灰色","mediumturquoise":"中松石綠","ghostwhite":"幽靈色","darkblue":"暗藍色","mediumvioletred":"中紫羅蘭紅","brown":"褐色","lightgray":"淡灰色","sandybrown":"沙褐色","pink":"粉紅色","firebrick":"紅磚色","indigo":"靛藍色","snow":"雪白色","darkorchid":"暗蘭花色","turquoise":"松石綠","chocolate":"巧克力色","springgreen":"春綠色","moccasin":"鹿皮黃色","navy":"海軍藍","lemonchiffon":"奶油黃","teal":"深藍綠色","floralwhite":"花卉白","cornflowerblue":"矢車菊藍","paleturquoise":"灰松石綠","purple":"紫色","gainsboro":"石板灰","plum":"李紫色","red":"紅色","blue":"藍色","forestgreen":"森綠色","darkgreen":"暗綠色","honeydew":"密瓜色","darkseagreen":"暗海綠色","lightcoral":"淡珊瑚紅","palevioletred":"灰紫羅蘭紅","mediumpurple":"中紫色","saddlebrown":"鞍褐色","darkmagenta":"暗紫紅色","thistle":"薊色","whitesmoke":"白煙色","wheat":"小麥色","violet":"紫羅蘭色","lightskyblue":"淡天藍色","goldenrod":"金菊色","mediumblue":"中藍色","skyblue":"天藍色","crimson":"暗深紅色","darksalmon":"暗鮭紅","darkred":"暗紅色","darkslategrey":"暗岩灰色","peru":"祕魯色","lightgrey":"淡灰色","lightgoldenrodyellow":"淡金菊黃","blanchedalmond":"杏仁白","aliceblue":"愛麗絲藍","bisque":"橘黃色","slategray":"岩灰色","palegoldenrod":"灰金菊色","darkorange":"暗橙色","aquamarine":"碧綠色","lightgreen":"淡綠色","burlywood":"實木色","dodgerblue":"道奇藍","darkgray":"暗灰色","lightcyan":"淡青色","powderblue":"粉藍色","blueviolet":"藍紫色","orchid":"蘭花色","dimgray":"昏灰色","beige":"灰棕色","fuchsia":"海棠紅","lavenderblush":"薰衣草紫紅","hotpink":"暖粉紅色","steelblue":"鐵藍色","tomato":"蕃茄紅","lightpink":"淡粉紅色","limegreen":"檸檬綠","indianred":"印度紅","papayawhip":"番木瓜色","lightslategray":"淡岩灰色","gray":"灰色","mediumorchid":"中蘭紫色","cornsilk":"玉米黃","black":"黑色","seagreen":"海綠色","darkslateblue":"暗岩藍色","khaki":"卡其色","lightblue":"淡藍色","palegreen":"灰綠色","azure":"天藍色","peachpuff":"粉撲桃色","darkolivegreen":"暗橄欖綠","yellowgreen":"黃綠色"},"dojo/cldr/nls/number":{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"},"dijit/form/nls/ComboBox":{"previousMessage":"前一個選擇項","nextMessage":"其他選擇項"},"dijit/nls/common":{"buttonOk":"確定","buttonCancel":"取消","buttonSave":"儲存","itemClose":"關閉"}}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_zh-tw.js.uncompressed.js b/lib/dojo/nls/tt-rss-layer_zh-tw.js.uncompressed.js new file mode 100644 index 00000000..14378f4e --- /dev/null +++ b/lib/dojo/nls/tt-rss-layer_zh-tw.js.uncompressed.js @@ -0,0 +1,13 @@ +define('dojo/nls/tt-rss-layer_zh-tw',{ +'dijit/form/nls/validate':{"rangeMessage":"此值超出範圍。","invalidMessage":"輸入的值無效。","missingMessage":"必須提供此值。"} +, +'dijit/nls/loading':{"loadingState":"載入中...","errorState":"抱歉,發生錯誤"} +, +'dojo/nls/colors':{"lightsteelblue":"淡鐵藍色","orangered":"橙紅色","midnightblue":"午夜藍","cadetblue":"軍服藍","seashell":"海貝色","slategrey":"岩灰色","coral":"珊瑚紅","darkturquoise":"暗松石綠","antiquewhite":"米白色","mediumspringgreen":"中春綠色","transparent":"透明","salmon":"鮭紅色","darkgrey":"暗灰色","ivory":"象牙色","greenyellow":"綠黃色","mistyrose":"霧玫瑰色","lightsalmon":"淡鮭紅","silver":"銀色","dimgrey":"昏灰色","orange":"橙色","white":"白色","navajowhite":"印地安黃色","royalblue":"品藍色","deeppink":"深粉紅色","lime":"檸檬色","oldlace":"舊蕾絲色","chartreuse":"淡黃綠色","darkcyan":"暗青色","yellow":"黃色","linen":"亞麻色","olive":"橄欖色","gold":"金色","lawngreen":"草綠色","lightyellow":"淡黃色","tan":"皮革色","darkviolet":"暗紫羅蘭色","lightslategrey":"淡岩灰色","grey":"灰色","darkkhaki":"暗卡其色","green":"綠色","deepskyblue":"深天藍色","aqua":"水色","sienna":"黃土赭色","mintcream":"薄荷乳白色","rosybrown":"玫瑰褐","mediumslateblue":"中岩藍色","magenta":"紫紅色","lightseagreen":"淡海綠色","cyan":"青色","olivedrab":"橄欖綠","darkgoldenrod":"暗金菊色","slateblue":"岩藍色","mediumaquamarine":"中碧綠色","lavender":"薰衣草紫","mediumseagreen":"中海綠色","maroon":"栗色","darkslategray":"暗岩灰色","mediumturquoise":"中松石綠","ghostwhite":"幽靈色","darkblue":"暗藍色","mediumvioletred":"中紫羅蘭紅","brown":"褐色","lightgray":"淡灰色","sandybrown":"沙褐色","pink":"粉紅色","firebrick":"紅磚色","indigo":"靛藍色","snow":"雪白色","darkorchid":"暗蘭花色","turquoise":"松石綠","chocolate":"巧克力色","springgreen":"春綠色","moccasin":"鹿皮黃色","navy":"海軍藍","lemonchiffon":"奶油黃","teal":"深藍綠色","floralwhite":"花卉白","cornflowerblue":"矢車菊藍","paleturquoise":"灰松石綠","purple":"紫色","gainsboro":"石板灰","plum":"李紫色","red":"紅色","blue":"藍色","forestgreen":"森綠色","darkgreen":"暗綠色","honeydew":"密瓜色","darkseagreen":"暗海綠色","lightcoral":"淡珊瑚紅","palevioletred":"灰紫羅蘭紅","mediumpurple":"中紫色","saddlebrown":"鞍褐色","darkmagenta":"暗紫紅色","thistle":"薊色","whitesmoke":"白煙色","wheat":"小麥色","violet":"紫羅蘭色","lightskyblue":"淡天藍色","goldenrod":"金菊色","mediumblue":"中藍色","skyblue":"天藍色","crimson":"暗深紅色","darksalmon":"暗鮭紅","darkred":"暗紅色","darkslategrey":"暗岩灰色","peru":"祕魯色","lightgrey":"淡灰色","lightgoldenrodyellow":"淡金菊黃","blanchedalmond":"杏仁白","aliceblue":"愛麗絲藍","bisque":"橘黃色","slategray":"岩灰色","palegoldenrod":"灰金菊色","darkorange":"暗橙色","aquamarine":"碧綠色","lightgreen":"淡綠色","burlywood":"實木色","dodgerblue":"道奇藍","darkgray":"暗灰色","lightcyan":"淡青色","powderblue":"粉藍色","blueviolet":"藍紫色","orchid":"蘭花色","dimgray":"昏灰色","beige":"灰棕色","fuchsia":"海棠紅","lavenderblush":"薰衣草紫紅","hotpink":"暖粉紅色","steelblue":"鐵藍色","tomato":"蕃茄紅","lightpink":"淡粉紅色","limegreen":"檸檬綠","indianred":"印度紅","papayawhip":"番木瓜色","lightslategray":"淡岩灰色","gray":"灰色","mediumorchid":"中蘭紫色","cornsilk":"玉米黃","black":"黑色","seagreen":"海綠色","darkslateblue":"暗岩藍色","khaki":"卡其色","lightblue":"淡藍色","palegreen":"灰綠色","azure":"天藍色","peachpuff":"粉撲桃色","darkolivegreen":"暗橄欖綠","yellowgreen":"黃綠色"} +, +'dojo/cldr/nls/number':{"scientificFormat":"#E0","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencyFormat":"¤#,##0.00","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","group":",","percentFormat":"#,##0%","decimalFormat":"#,##0.###","decimal":".","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"} +, +'dijit/form/nls/ComboBox':{"previousMessage":"前一個選擇項","nextMessage":"其他選擇項"} +, +'dijit/nls/common':{"buttonOk":"確定","buttonCancel":"取消","buttonSave":"儲存","itemClose":"關閉"} +}); \ No newline at end of file diff --git a/lib/dojo/nls/tt-rss-layer_zh.js b/lib/dojo/nls/tt-rss-layer_zh.js deleted file mode 100644 index 0b391dbb..00000000 --- a/lib/dojo/nls/tt-rss-layer_zh.js +++ /dev/null @@ -1 +0,0 @@ -dojo.provide("dojo.nls.tt-rss-layer_zh");dojo.provide("dojo.nls.colors");dojo.nls.colors._built=true;dojo.provide("dojo.nls.colors.zh");dojo.nls.colors.zh={"lightsteelblue":"浅钢蓝色","orangered":"桔红色","midnightblue":"蓝黑色","cadetblue":"军队蓝","seashell":"贝壳白","slategrey":"石板灰","coral":"珊瑚红","darkturquoise":"深青绿色","antiquewhite":"古董白","mediumspringgreen":"淡草绿色","salmon":"橙红色","darkgrey":"深灰色","ivory":"象牙色","greenyellow":"绿黄色","mistyrose":"粉红玫瑰","lightsalmon":"浅橙红色","silver":"银白色","dimgrey":"暗灰色","orange":"橙色","white":"白色","navajowhite":"印地安黄","royalblue":"亮蓝色","deeppink":"深粉色","lime":"酸橙色","oldlace":"旧布黄","chartreuse":"浅黄绿色","darkcyan":"深青色","yellow":"黄色","linen":"亚麻布色","olive":"橄榄色","gold":"金黄色","lawngreen":"草绿色","lightyellow":"浅黄色","tan":"茶色","darkviolet":"深紫罗兰","lightslategrey":"浅石板灰","grey":"灰色","darkkhaki":"深褐色","green":"绿色","deepskyblue":"深天蓝色","aqua":"水绿色","sienna":"赭色","mintcream":"薄荷乳白","rosybrown":"玫瑰褐色","mediumslateblue":"淡灰蓝色","magenta":"洋红色","lightseagreen":"浅海绿色","cyan":"青色","olivedrab":"暗橄榄色","darkgoldenrod":"深金黄色","slateblue":"石板蓝","mediumaquamarine":"淡碧绿色","lavender":"淡紫色","mediumseagreen":"淡海绿色","maroon":"褐紫红色","darkslategray":"深石板灰","mediumturquoise":"淡青绿色","ghostwhite":"苍白","darkblue":"深蓝色","mediumvioletred":"淡紫罗兰","brown":"褐色","lightgray":"浅灰色","sandybrown":"浅褐色","pink":"粉红色","firebrick":"砖红色","indigo":"靛蓝色","snow":"雪白","darkorchid":"暗兰花紫","turquoise":"青绿色","chocolate":"巧克力色","springgreen":"浅草绿色","moccasin":"鹿皮黄","navy":"藏青色","lemonchiffon":"柠檬色","teal":"青色","floralwhite":"花白","cornflowerblue":"藏蓝色","paleturquoise":"淡青绿色","purple":"紫色","gainsboro":"亮灰色","plum":"梅红色","red":"红色","blue":"蓝色","forestgreen":"森林绿","darkgreen":"深绿色","honeydew":"蜜色","darkseagreen":"深海绿色","lightcoral":"浅珊瑚红","palevioletred":"浅紫罗兰","mediumpurple":"淡紫色","saddlebrown":"鞍具褐色","darkmagenta":"深洋红色","thistle":"蓟色","whitesmoke":"烟白色","wheat":"淡黄色","violet":"紫罗兰色","lightskyblue":"浅天蓝色","goldenrod":"鲜黄","mediumblue":"淡蓝色","skyblue":"天蓝色","crimson":"绯红色","darksalmon":"深橙红","darkred":"深红色","darkslategrey":"深石板灰","peru":"秘鲁棕","lightgrey":"浅灰色","lightgoldenrodyellow":"浅金黄色","blanchedalmond":"杏仁白","aliceblue":"艾莉斯蓝","bisque":"乳黄色","slategray":"石板灰","palegoldenrod":"浅金黄色","darkorange":"深橙色","aquamarine":"碧绿色","lightgreen":"浅绿色","burlywood":"原木色","dodgerblue":"宝蓝","darkgray":"深灰色","lightcyan":"浅青色","powderblue":"粉蓝色","blueviolet":"蓝紫色","orchid":"兰花紫","dimgray":"暗灰色","beige":"米色","fuchsia":"紫红色","lavenderblush":"淡紫红色","hotpink":"暗粉","steelblue":"钢蓝色","tomato":"番茄色","lightpink":"浅粉色","limegreen":"暗黄绿色","indianred":"印度红","papayawhip":"粉木瓜橙","lightslategray":"浅石板灰","gray":"灰色","mediumorchid":"淡兰花紫","cornsilk":"玉米黄","black":"黑色","seagreen":"海绿色","darkslateblue":"深石板蓝","khaki":"黄褐色","lightblue":"淡蓝色","palegreen":"淡绿色","azure":"浅天蓝","peachpuff":"粉桃红","darkolivegreen":"深橄榄绿色","yellowgreen":"黄绿色"};dojo.provide("dijit.nls.loading");dijit.nls.loading._built=true;dojo.provide("dijit.nls.loading.zh");dijit.nls.loading.zh={"loadingState":"正在加载...","errorState":"对不起,发生了错误"};dojo.provide("dijit.nls.common");dijit.nls.common._built=true;dojo.provide("dijit.nls.common.zh");dijit.nls.common.zh={"buttonOk":"确定","buttonCancel":"取消","buttonSave":"保存","itemClose":"关闭"};dojo.provide("dijit.form.nls.validate");dijit.form.nls.validate._built=true;dojo.provide("dijit.form.nls.validate.zh");dijit.form.nls.validate.zh={"rangeMessage":"此值超出范围。","invalidMessage":"输入的值无效。","missingMessage":"此值是必需值。"};dojo.provide("dijit.form.nls.ComboBox");dijit.form.nls.ComboBox._built=true;dojo.provide("dijit.form.nls.ComboBox.zh");dijit.form.nls.ComboBox.zh={"previousMessage":"先前选项","nextMessage":"更多选项"};dojo.provide("dojo.cldr.nls.number");dojo.cldr.nls.number._built=true;dojo.provide("dojo.cldr.nls.number.zh");dojo.cldr.nls.number.zh={"decimalFormat":"#,##0.###","group":",","scientificFormat":"#E0","percentFormat":"#,##0%","currencyFormat":"¤#,##0.00","decimal":".","currencySpacing-afterCurrency-currencyMatch":"[:letter:]","infinity":"∞","list":";","percentSign":"%","minusSign":"-","currencySpacing-beforeCurrency-surroundingMatch":"[:digit:]","decimalFormat-short":"000T","currencySpacing-afterCurrency-insertBetween":" ","nan":"NaN","nativeZeroDigit":"0","plusSign":"+","currencySpacing-afterCurrency-surroundingMatch":"[:digit:]","currencySpacing-beforeCurrency-currencyMatch":"[:letter:]","perMille":"‰","patternDigit":"#","currencySpacing-beforeCurrency-insertBetween":" ","exponential":"E"}; diff --git a/lib/dojo/nls/zh-tw/colors.js b/lib/dojo/nls/zh-tw/colors.js index 6ee6c5ec..e3e36634 100644 --- a/lib/dojo/nls/zh-tw/colors.js +++ b/lib/dojo/nls/zh-tw/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"淡鐵藍色","orangered":"橙紅色","midnightblue":"午夜藍","cadetblue":"軍服藍","seashell":"海貝色","slategrey":"岩灰色","coral":"珊瑚紅","darkturquoise":"暗松石綠","antiquewhite":"米白色","mediumspringgreen":"中春綠色","salmon":"鮭紅色","darkgrey":"暗灰色","ivory":"象牙色","greenyellow":"綠黃色","mistyrose":"霧玫瑰色","lightsalmon":"淡鮭紅","silver":"銀色","dimgrey":"昏灰色","orange":"橙色","white":"白色","navajowhite":"印地安黃色","royalblue":"品藍色","deeppink":"深粉紅色","lime":"檸檬色","oldlace":"舊蕾絲色","chartreuse":"淡黃綠色","darkcyan":"暗青色","yellow":"黃色","linen":"亞麻色","olive":"橄欖色","gold":"金色","lawngreen":"草綠色","lightyellow":"淡黃色","tan":"皮革色","darkviolet":"暗紫羅蘭色","lightslategrey":"淡岩灰色","grey":"灰色","darkkhaki":"暗卡其色","green":"綠色","deepskyblue":"深天藍色","aqua":"水色","sienna":"黃土赭色","mintcream":"薄荷乳白色","rosybrown":"玫瑰褐","mediumslateblue":"中岩藍色","magenta":"紫紅色","lightseagreen":"淡海綠色","cyan":"青色","olivedrab":"橄欖綠","darkgoldenrod":"暗金菊色","slateblue":"岩藍色","mediumaquamarine":"中碧綠色","lavender":"薰衣草紫","mediumseagreen":"中海綠色","maroon":"栗色","darkslategray":"暗岩灰色","mediumturquoise":"中松石綠","ghostwhite":"幽靈色","darkblue":"暗藍色","mediumvioletred":"中紫羅蘭紅","brown":"褐色","lightgray":"淡灰色","sandybrown":"沙褐色","pink":"粉紅色","firebrick":"紅磚色","indigo":"靛藍色","snow":"雪白色","darkorchid":"暗蘭花色","turquoise":"松石綠","chocolate":"巧克力色","springgreen":"春綠色","moccasin":"鹿皮黃色","navy":"海軍藍","lemonchiffon":"奶油黃","teal":"深藍綠色","floralwhite":"花卉白","cornflowerblue":"矢車菊藍","paleturquoise":"灰松石綠","purple":"紫色","gainsboro":"石板灰","plum":"李紫色","red":"紅色","blue":"藍色","forestgreen":"森綠色","darkgreen":"暗綠色","honeydew":"密瓜色","darkseagreen":"暗海綠色","lightcoral":"淡珊瑚紅","palevioletred":"灰紫羅蘭紅","mediumpurple":"中紫色","saddlebrown":"鞍褐色","darkmagenta":"暗紫紅色","thistle":"薊色","whitesmoke":"白煙色","wheat":"小麥色","violet":"紫羅蘭色","lightskyblue":"淡天藍色","goldenrod":"金菊色","mediumblue":"中藍色","skyblue":"天藍色","crimson":"暗深紅色","darksalmon":"暗鮭紅","darkred":"暗紅色","darkslategrey":"暗岩灰色","peru":"祕魯色","lightgrey":"淡灰色","lightgoldenrodyellow":"淡金菊黃","blanchedalmond":"杏仁白","aliceblue":"愛麗絲藍","bisque":"橘黃色","slategray":"岩灰色","palegoldenrod":"灰金菊色","darkorange":"暗橙色","aquamarine":"碧綠色","lightgreen":"淡綠色","burlywood":"實木色","dodgerblue":"道奇藍","darkgray":"暗灰色","lightcyan":"淡青色","powderblue":"粉藍色","blueviolet":"藍紫色","orchid":"蘭花色","dimgray":"昏灰色","beige":"灰棕色","fuchsia":"海棠紅","lavenderblush":"薰衣草紫紅","hotpink":"暖粉紅色","steelblue":"鐵藍色","tomato":"蕃茄紅","lightpink":"淡粉紅色","limegreen":"檸檬綠","indianred":"印度紅","papayawhip":"番木瓜色","lightslategray":"淡岩灰色","gray":"灰色","mediumorchid":"中蘭紫色","cornsilk":"玉米黃","black":"黑色","seagreen":"海綠色","darkslateblue":"暗岩藍色","khaki":"卡其色","lightblue":"淡藍色","palegreen":"灰綠色","azure":"天藍色","peachpuff":"粉撲桃色","darkolivegreen":"暗橄欖綠","yellowgreen":"黃綠色"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/zh-tw/colors",({aliceblue:"愛麗絲藍",antiquewhite:"米白色",aqua:"水色",aquamarine:"碧綠色",azure:"天藍色",beige:"灰棕色",bisque:"橘黃色",black:"黑色",blanchedalmond:"杏仁白",blue:"藍色",blueviolet:"藍紫色",brown:"褐色",burlywood:"實木色",cadetblue:"軍服藍",chartreuse:"淡黃綠色",chocolate:"巧克力色",coral:"珊瑚紅",cornflowerblue:"矢車菊藍",cornsilk:"玉米黃",crimson:"暗深紅色",cyan:"青色",darkblue:"暗藍色",darkcyan:"暗青色",darkgoldenrod:"暗金菊色",darkgray:"暗灰色",darkgreen:"暗綠色",darkgrey:"暗灰色",darkkhaki:"暗卡其色",darkmagenta:"暗紫紅色",darkolivegreen:"暗橄欖綠",darkorange:"暗橙色",darkorchid:"暗蘭花色",darkred:"暗紅色",darksalmon:"暗鮭紅",darkseagreen:"暗海綠色",darkslateblue:"暗岩藍色",darkslategray:"暗岩灰色",darkslategrey:"暗岩灰色",darkturquoise:"暗松石綠",darkviolet:"暗紫羅蘭色",deeppink:"深粉紅色",deepskyblue:"深天藍色",dimgray:"昏灰色",dimgrey:"昏灰色",dodgerblue:"道奇藍",firebrick:"紅磚色",floralwhite:"花卉白",forestgreen:"森綠色",fuchsia:"海棠紅",gainsboro:"石板灰",ghostwhite:"幽靈色",gold:"金色",goldenrod:"金菊色",gray:"灰色",green:"綠色",greenyellow:"綠黃色",grey:"灰色",honeydew:"密瓜色",hotpink:"暖粉紅色",indianred:"印度紅",indigo:"靛藍色",ivory:"象牙色",khaki:"卡其色",lavender:"薰衣草紫",lavenderblush:"薰衣草紫紅",lawngreen:"草綠色",lemonchiffon:"奶油黃",lightblue:"淡藍色",lightcoral:"淡珊瑚紅",lightcyan:"淡青色",lightgoldenrodyellow:"淡金菊黃",lightgray:"淡灰色",lightgreen:"淡綠色",lightgrey:"淡灰色",lightpink:"淡粉紅色",lightsalmon:"淡鮭紅",lightseagreen:"淡海綠色",lightskyblue:"淡天藍色",lightslategray:"淡岩灰色",lightslategrey:"淡岩灰色",lightsteelblue:"淡鐵藍色",lightyellow:"淡黃色",lime:"檸檬色",limegreen:"檸檬綠",linen:"亞麻色",magenta:"紫紅色",maroon:"栗色",mediumaquamarine:"中碧綠色",mediumblue:"中藍色",mediumorchid:"中蘭紫色",mediumpurple:"中紫色",mediumseagreen:"中海綠色",mediumslateblue:"中岩藍色",mediumspringgreen:"中春綠色",mediumturquoise:"中松石綠",mediumvioletred:"中紫羅蘭紅",midnightblue:"午夜藍",mintcream:"薄荷乳白色",mistyrose:"霧玫瑰色",moccasin:"鹿皮黃色",navajowhite:"印地安黃色",navy:"海軍藍",oldlace:"舊蕾絲色",olive:"橄欖色",olivedrab:"橄欖綠",orange:"橙色",orangered:"橙紅色",orchid:"蘭花色",palegoldenrod:"灰金菊色",palegreen:"灰綠色",paleturquoise:"灰松石綠",palevioletred:"灰紫羅蘭紅",papayawhip:"番木瓜色",peachpuff:"粉撲桃色",peru:"祕魯色",pink:"粉紅色",plum:"李紫色",powderblue:"粉藍色",purple:"紫色",red:"紅色",rosybrown:"玫瑰褐",royalblue:"品藍色",saddlebrown:"鞍褐色",salmon:"鮭紅色",sandybrown:"沙褐色",seagreen:"海綠色",seashell:"海貝色",sienna:"黃土赭色",silver:"銀色",skyblue:"天藍色",slateblue:"岩藍色",slategray:"岩灰色",slategrey:"岩灰色",snow:"雪白色",springgreen:"春綠色",steelblue:"鐵藍色",tan:"皮革色",teal:"深藍綠色",thistle:"薊色",tomato:"蕃茄紅",transparent:"透明",turquoise:"松石綠",violet:"紫羅蘭色",wheat:"小麥色",white:"白色",whitesmoke:"白煙色",yellow:"黃色",yellowgreen:"黃綠色"})); \ No newline at end of file diff --git a/lib/dojo/nls/zh-tw/colors.js.uncompressed.js b/lib/dojo/nls/zh-tw/colors.js.uncompressed.js new file mode 100644 index 00000000..5d8ce27b --- /dev/null +++ b/lib/dojo/nls/zh-tw/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/zh-tw/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "愛麗絲藍", + antiquewhite: "米白色", + aqua: "水色", + aquamarine: "碧綠色", + azure: "天藍色", + beige: "灰棕色", + bisque: "橘黃色", + black: "黑色", + blanchedalmond: "杏仁白", + blue: "藍色", + blueviolet: "藍紫色", + brown: "褐色", + burlywood: "實木色", + cadetblue: "軍服藍", + chartreuse: "淡黃綠色", + chocolate: "巧克力色", + coral: "珊瑚紅", + cornflowerblue: "矢車菊藍", + cornsilk: "玉米黃", + crimson: "暗深紅色", + cyan: "青色", + darkblue: "暗藍色", + darkcyan: "暗青色", + darkgoldenrod: "暗金菊色", + darkgray: "暗灰色", + darkgreen: "暗綠色", + darkgrey: "暗灰色", // same as darkgray + darkkhaki: "暗卡其色", + darkmagenta: "暗紫紅色", + darkolivegreen: "暗橄欖綠", + darkorange: "暗橙色", + darkorchid: "暗蘭花色", + darkred: "暗紅色", + darksalmon: "暗鮭紅", + darkseagreen: "暗海綠色", + darkslateblue: "暗岩藍色", + darkslategray: "暗岩灰色", + darkslategrey: "暗岩灰色", // same as darkslategray + darkturquoise: "暗松石綠", + darkviolet: "暗紫羅蘭色", + deeppink: "深粉紅色", + deepskyblue: "深天藍色", + dimgray: "昏灰色", + dimgrey: "昏灰色", // same as dimgray + dodgerblue: "道奇藍", + firebrick: "紅磚色", + floralwhite: "花卉白", + forestgreen: "森綠色", + fuchsia: "海棠紅", + gainsboro: "石板灰", + ghostwhite: "幽靈色", + gold: "金色", + goldenrod: "金菊色", + gray: "灰色", + green: "綠色", + greenyellow: "綠黃色", + grey: "灰色", // same as gray + honeydew: "密瓜色", + hotpink: "暖粉紅色", + indianred: "印度紅", + indigo: "靛藍色", + ivory: "象牙色", + khaki: "卡其色", + lavender: "薰衣草紫", + lavenderblush: "薰衣草紫紅", + lawngreen: "草綠色", + lemonchiffon: "奶油黃", + lightblue: "淡藍色", + lightcoral: "淡珊瑚紅", + lightcyan: "淡青色", + lightgoldenrodyellow: "淡金菊黃", + lightgray: "淡灰色", + lightgreen: "淡綠色", + lightgrey: "淡灰色", // same as lightgray + lightpink: "淡粉紅色", + lightsalmon: "淡鮭紅", + lightseagreen: "淡海綠色", + lightskyblue: "淡天藍色", + lightslategray: "淡岩灰色", + lightslategrey: "淡岩灰色", // same as lightslategray + lightsteelblue: "淡鐵藍色", + lightyellow: "淡黃色", + lime: "檸檬色", + limegreen: "檸檬綠", + linen: "亞麻色", + magenta: "紫紅色", + maroon: "栗色", + mediumaquamarine: "中碧綠色", + mediumblue: "中藍色", + mediumorchid: "中蘭紫色", + mediumpurple: "中紫色", + mediumseagreen: "中海綠色", + mediumslateblue: "中岩藍色", + mediumspringgreen: "中春綠色", + mediumturquoise: "中松石綠", + mediumvioletred: "中紫羅蘭紅", + midnightblue: "午夜藍", + mintcream: "薄荷乳白色", + mistyrose: "霧玫瑰色", + moccasin: "鹿皮黃色", + navajowhite: "印地安黃色", + navy: "海軍藍", + oldlace: "舊蕾絲色", + olive: "橄欖色", + olivedrab: "橄欖綠", + orange: "橙色", + orangered: "橙紅色", + orchid: "蘭花色", + palegoldenrod: "灰金菊色", + palegreen: "灰綠色", + paleturquoise: "灰松石綠", + palevioletred: "灰紫羅蘭紅", + papayawhip: "番木瓜色", + peachpuff: "粉撲桃色", + peru: "祕魯色", + pink: "粉紅色", + plum: "李紫色", + powderblue: "粉藍色", + purple: "紫色", + red: "紅色", + rosybrown: "玫瑰褐", + royalblue: "品藍色", + saddlebrown: "鞍褐色", + salmon: "鮭紅色", + sandybrown: "沙褐色", + seagreen: "海綠色", + seashell: "海貝色", + sienna: "黃土赭色", + silver: "銀色", + skyblue: "天藍色", + slateblue: "岩藍色", + slategray: "岩灰色", + slategrey: "岩灰色", // same as slategray + snow: "雪白色", + springgreen: "春綠色", + steelblue: "鐵藍色", + tan: "皮革色", + teal: "深藍綠色", + thistle: "薊色", + tomato: "蕃茄紅", + transparent: "透明", + turquoise: "松石綠", + violet: "紫羅蘭色", + wheat: "小麥色", + white: "白色", + whitesmoke: "白煙色", + yellow: "黃色", + yellowgreen: "黃綠色" +}) +); diff --git a/lib/dojo/nls/zh/colors.js b/lib/dojo/nls/zh/colors.js index 0ffb2d8f..b8596ea2 100644 --- a/lib/dojo/nls/zh/colors.js +++ b/lib/dojo/nls/zh/colors.js @@ -1 +1,8 @@ -({"lightsteelblue":"浅钢蓝色","orangered":"桔红色","midnightblue":"蓝黑色","cadetblue":"军队蓝","seashell":"贝壳白","slategrey":"石板灰","coral":"珊瑚红","darkturquoise":"深青绿色","antiquewhite":"古董白","mediumspringgreen":"淡草绿色","salmon":"橙红色","darkgrey":"深灰色","ivory":"象牙色","greenyellow":"绿黄色","mistyrose":"粉红玫瑰","lightsalmon":"浅橙红色","silver":"银白色","dimgrey":"暗灰色","orange":"橙色","white":"白色","navajowhite":"印地安黄","royalblue":"亮蓝色","deeppink":"深粉色","lime":"酸橙色","oldlace":"旧布黄","chartreuse":"浅黄绿色","darkcyan":"深青色","yellow":"黄色","linen":"亚麻布色","olive":"橄榄色","gold":"金黄色","lawngreen":"草绿色","lightyellow":"浅黄色","tan":"茶色","darkviolet":"深紫罗兰","lightslategrey":"浅石板灰","grey":"灰色","darkkhaki":"深褐色","green":"绿色","deepskyblue":"深天蓝色","aqua":"水绿色","sienna":"赭色","mintcream":"薄荷乳白","rosybrown":"玫瑰褐色","mediumslateblue":"淡灰蓝色","magenta":"洋红色","lightseagreen":"浅海绿色","cyan":"青色","olivedrab":"暗橄榄色","darkgoldenrod":"深金黄色","slateblue":"石板蓝","mediumaquamarine":"淡碧绿色","lavender":"淡紫色","mediumseagreen":"淡海绿色","maroon":"褐紫红色","darkslategray":"深石板灰","mediumturquoise":"淡青绿色","ghostwhite":"苍白","darkblue":"深蓝色","mediumvioletred":"淡紫罗兰","brown":"褐色","lightgray":"浅灰色","sandybrown":"浅褐色","pink":"粉红色","firebrick":"砖红色","indigo":"靛蓝色","snow":"雪白","darkorchid":"暗兰花紫","turquoise":"青绿色","chocolate":"巧克力色","springgreen":"浅草绿色","moccasin":"鹿皮黄","navy":"藏青色","lemonchiffon":"柠檬色","teal":"青色","floralwhite":"花白","cornflowerblue":"藏蓝色","paleturquoise":"淡青绿色","purple":"紫色","gainsboro":"亮灰色","plum":"梅红色","red":"红色","blue":"蓝色","forestgreen":"森林绿","darkgreen":"深绿色","honeydew":"蜜色","darkseagreen":"深海绿色","lightcoral":"浅珊瑚红","palevioletred":"浅紫罗兰","mediumpurple":"淡紫色","saddlebrown":"鞍具褐色","darkmagenta":"深洋红色","thistle":"蓟色","whitesmoke":"烟白色","wheat":"淡黄色","violet":"紫罗兰色","lightskyblue":"浅天蓝色","goldenrod":"鲜黄","mediumblue":"淡蓝色","skyblue":"天蓝色","crimson":"绯红色","darksalmon":"深橙红","darkred":"深红色","darkslategrey":"深石板灰","peru":"秘鲁棕","lightgrey":"浅灰色","lightgoldenrodyellow":"浅金黄色","blanchedalmond":"杏仁白","aliceblue":"艾莉斯蓝","bisque":"乳黄色","slategray":"石板灰","palegoldenrod":"浅金黄色","darkorange":"深橙色","aquamarine":"碧绿色","lightgreen":"浅绿色","burlywood":"原木色","dodgerblue":"宝蓝","darkgray":"深灰色","lightcyan":"浅青色","powderblue":"粉蓝色","blueviolet":"蓝紫色","orchid":"兰花紫","dimgray":"暗灰色","beige":"米色","fuchsia":"紫红色","lavenderblush":"淡紫红色","hotpink":"暗粉","steelblue":"钢蓝色","tomato":"番茄色","lightpink":"浅粉色","limegreen":"暗黄绿色","indianred":"印度红","papayawhip":"粉木瓜橙","lightslategray":"浅石板灰","gray":"灰色","mediumorchid":"淡兰花紫","cornsilk":"玉米黄","black":"黑色","seagreen":"海绿色","darkslateblue":"深石板蓝","khaki":"黄褐色","lightblue":"淡蓝色","palegreen":"淡绿色","azure":"浅天蓝","peachpuff":"粉桃红","darkolivegreen":"深橄榄绿色","yellowgreen":"黄绿色"}) \ No newline at end of file +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/nls/zh/colors",({aliceblue:"爱丽丝蓝",antiquewhite:"古董白",aqua:"浅绿色",aquamarine:"碧绿色",azure:"天蓝色",beige:"米色",bisque:"桔黄色",black:"黑色",blanchedalmond:"白杏色",blue:"蓝色",blueviolet:"蓝紫色",brown:"棕色",burlywood:"实木色",cadetblue:"灰蓝色",chartreuse:"黄绿色",chocolate:"巧克力色",coral:"珊瑚色",cornflowerblue:"浅蓝色",cornsilk:"米绸色",crimson:"绯红色",cyan:"青蓝色",darkblue:"深蓝",darkcyan:"深青绿",darkgoldenrod:"深金黄",darkgray:"深灰色",darkgreen:"深绿色",darkgrey:"深灰色",darkkhaki:"深卡其色",darkmagenta:"深洋红色",darkolivegreen:"深橄榄绿",darkorange:"深橙色",darkorchid:"深紫色",darkred:"深红色",darksalmon:"深橙红",darkseagreen:"深海藻绿",darkslateblue:"深青蓝",darkslategray:"深青灰",darkslategrey:"深青灰",darkturquoise:"深粉蓝",darkviolet:"深紫色",deeppink:"深粉红色",deepskyblue:"深天蓝色",dimgray:"暗灰色",dimgrey:"暗灰色",dodgerblue:"闪蓝色",firebrick:"砖红",floralwhite:"花白色",forestgreen:"森林绿",fuchsia:"紫红色",gainsboro:"淡灰色",ghostwhite:"苍白",gold:"金黄色",goldenrod:"金麒麟色",gray:"灰色",green:"绿色",greenyellow:"绿黄色",grey:"灰色",honeydew:"蜜汁色",hotpink:"深粉红",indianred:"印度红",indigo:"靛青",ivory:"象牙色",khaki:"卡其色",lavender:"淡紫色",lavenderblush:"淡紫红",lawngreen:"草绿色",lemonchiffon:"柠檬绸色",lightblue:"淡蓝色",lightcoral:"浅珊瑚色",lightcyan:"浅青色",lightgoldenrodyellow:"浅金黄色",lightgray:"浅灰色",lightgreen:"浅绿色",lightgrey:"浅灰色",lightpink:"浅粉红色",lightsalmon:"淡橙色",lightseagreen:"浅海藻绿",lightskyblue:"浅天蓝色",lightslategray:"浅青灰",lightslategrey:"浅青灰",lightsteelblue:"浅钢蓝色",lightyellow:"浅黄色",lime:"淡黄绿色",limegreen:"橙绿色",linen:"亚麻色",magenta:"洋红色",maroon:"栗色",mediumaquamarine:"间绿色",mediumblue:"间蓝色",mediumorchid:"间紫色",mediumpurple:"间紫色",mediumseagreen:"间海蓝色",mediumslateblue:"间暗蓝色",mediumspringgreen:"间春绿色",mediumturquoise:"间绿宝石色",mediumvioletred:"间紫罗兰色",midnightblue:"深蓝色",mintcream:"薄荷色",mistyrose:"浅玫瑰色",moccasin:"鹿皮色",navajowhite:"纳瓦白",navy:"藏青色",oldlace:"老白色",olive:"橄榄绿",olivedrab:"草绿色",orange:"橙色",orangered:"橙红色",orchid:"紫色",palegoldenrod:"淡金黄色",palegreen:"淡绿色",paleturquoise:"苍绿色",palevioletred:"苍紫罗兰色",papayawhip:"木瓜色",peachpuff:"桃色",peru:"秘鲁色",pink:"粉红色",plum:"杨李色",powderblue:"铁蓝",purple:"紫色",red:"红色",rosybrown:"褐玫瑰红",royalblue:"品蓝",saddlebrown:"重褐色",salmon:"橙红",sandybrown:"沙褐色",seagreen:"海绿色",seashell:"海贝色",sienna:"赭色",silver:"银白色",skyblue:"天蓝色",slateblue:"石蓝色",slategray:"灰石色",slategrey:"灰石色",snow:"雪白色",springgreen:"春绿色",steelblue:"钢蓝色",tan:"棕褐色",teal:"水鸭色",thistle:"蓟色",tomato:"西红柿色",transparent:"透明的",turquoise:"绿宝石色",violet:"紫色",wheat:"浅黄色",white:"白色",whitesmoke:"烟白色",yellow:"黄色",yellowgreen:"黄绿色"})); \ No newline at end of file diff --git a/lib/dojo/nls/zh/colors.js.uncompressed.js b/lib/dojo/nls/zh/colors.js.uncompressed.js new file mode 100644 index 00000000..4449d413 --- /dev/null +++ b/lib/dojo/nls/zh/colors.js.uncompressed.js @@ -0,0 +1,156 @@ +define( +"dojo/nls/zh/colors", ({ +// local representation of all CSS3 named colors, companion to dojo.colors. To be used where descriptive information +// is required for each color, such as a palette widget, and not for specifying color programatically. + //Note: due to the SVG 1.0 spec additions, some of these are alternate spellings for the same color (e.g. gray / grey). + //TODO: should we be using unique rgb values as keys instead and avoid these duplicates, or rely on the caller to do the reverse mapping? + aliceblue: "爱丽丝蓝", + antiquewhite: "古董白", + aqua: "浅绿色", + aquamarine: "碧绿色", + azure: "天蓝色", + beige: "米色", + bisque: "桔黄色", + black: "黑色", + blanchedalmond: "白杏色", + blue: "蓝色", + blueviolet: "蓝紫色", + brown: "棕色", + burlywood: "实木色", + cadetblue: "灰蓝色", + chartreuse: "黄绿色", + chocolate: "巧克力色", + coral: "珊瑚色", + cornflowerblue: "浅蓝色", + cornsilk: "米绸色", + crimson: "绯红色", + cyan: "青蓝色", + darkblue: "深蓝", + darkcyan: "深青绿", + darkgoldenrod: "深金黄", + darkgray: "深灰色", + darkgreen: "深绿色", + darkgrey: "深灰色", // same as darkgray + darkkhaki: "深卡其色", + darkmagenta: "深洋红色", + darkolivegreen: "深橄榄绿", + darkorange: "深橙色", + darkorchid: "深紫色", + darkred: "深红色", + darksalmon: "深橙红", + darkseagreen: "深海藻绿", + darkslateblue: "深青蓝", + darkslategray: "深青灰", + darkslategrey: "深青灰", // same as darkslategray + darkturquoise: "深粉蓝", + darkviolet: "深紫色", + deeppink: "深粉红色", + deepskyblue: "深天蓝色", + dimgray: "暗灰色", + dimgrey: "暗灰色", // same as dimgray + dodgerblue: "闪蓝色", + firebrick: "砖红", + floralwhite: "花白色", + forestgreen: "森林绿", + fuchsia: "紫红色", + gainsboro: "淡灰色", + ghostwhite: "苍白", + gold: "金黄色", + goldenrod: "金麒麟色", + gray: "灰色", + green: "绿色", + greenyellow: "绿黄色", + grey: "灰色", // same as gray + honeydew: "蜜汁色", + hotpink: "深粉红", + indianred: "印度红", + indigo: "靛青", + ivory: "象牙色", + khaki: "卡其色", + lavender: "淡紫色", + lavenderblush: "淡紫红", + lawngreen: "草绿色", + lemonchiffon: "柠檬绸色", + lightblue: "淡蓝色", + lightcoral: "浅珊瑚色", + lightcyan: "浅青色", + lightgoldenrodyellow: "浅金黄色", + lightgray: "浅灰色", + lightgreen: "浅绿色", + lightgrey: "浅灰色", // same as lightgray + lightpink: "浅粉红色", + lightsalmon: "淡橙色", + lightseagreen: "浅海藻绿", + lightskyblue: "浅天蓝色", + lightslategray: "浅青灰", + lightslategrey: "浅青灰", // same as lightslategray + lightsteelblue: "浅钢蓝色", + lightyellow: "浅黄色", + lime: "淡黄绿色", + limegreen: "橙绿色", + linen: "亚麻色", + magenta: "洋红色", + maroon: "栗色", + mediumaquamarine: "间绿色", + mediumblue: "间蓝色", + mediumorchid: "间紫色", + mediumpurple: "间紫色", + mediumseagreen: "间海蓝色", + mediumslateblue: "间暗蓝色", + mediumspringgreen: "间春绿色", + mediumturquoise: "间绿宝石色", + mediumvioletred: "间紫罗兰色", + midnightblue: "深蓝色", + mintcream: "薄荷色", + mistyrose: "浅玫瑰色", + moccasin: "鹿皮色", + navajowhite: "纳瓦白", + navy: "藏青色", + oldlace: "老白色", + olive: "橄榄绿", + olivedrab: "草绿色", + orange: "橙色", + orangered: "橙红色", + orchid: "紫色", + palegoldenrod: "淡金黄色", + palegreen: "淡绿色", + paleturquoise: "苍绿色", + palevioletred: "苍紫罗兰色", + papayawhip: "木瓜色", + peachpuff: "桃色", + peru: "秘鲁色", + pink: "粉红色", + plum: "杨李色", + powderblue: "铁蓝", + purple: "紫色", + red: "红色", + rosybrown: "褐玫瑰红", + royalblue: "品蓝", + saddlebrown: "重褐色", + salmon: "橙红", + sandybrown: "沙褐色", + seagreen: "海绿色", + seashell: "海贝色", + sienna: "赭色", + silver: "银白色", + skyblue: "天蓝色", + slateblue: "石蓝色", + slategray: "灰石色", + slategrey: "灰石色", // same as slategray + snow: "雪白色", + springgreen: "春绿色", + steelblue: "钢蓝色", + tan: "棕褐色", + teal: "水鸭色", + thistle: "蓟色", + tomato: "西红柿色", + transparent: "透明的", + turquoise: "绿宝石色", + violet: "紫色", + wheat: "浅黄色", + white: "白色", + whitesmoke: "烟白色", + yellow: "黄色", + yellowgreen: "黄绿色" +}) +); diff --git a/lib/dojo/number.js b/lib/dojo/number.js index 30fcb614..3473c11f 100644 --- a/lib/dojo/number.js +++ b/lib/dojo/number.js @@ -4,581 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.number"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.number"] = true; -dojo.provide("dojo.number"); -dojo.require("dojo.i18n"); -dojo.requireLocalization("dojo.cldr", "number", null, "ROOT,ar,ca,cs,da,de,el,en,en-au,en-gb,es,fi,fr,fr-ch,he,hu,it,ja,ko,nb,nl,pl,pt,pt-pt,ro,ru,sk,sl,sv,th,tr,zh,zh-hant,zh-hk"); -dojo.require("dojo.string"); -dojo.require("dojo.regexp"); - -dojo.getObject("number", true, dojo); - -/*===== -dojo.number = { - // summary: localized formatting and parsing routines for Number -} - -dojo.number.__FormatOptions = function(){ - // pattern: String? - // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) - // with this string. Default value is based on locale. Overriding this property will defeat - // localization. Literal characters in patterns are not supported. - // type: String? - // choose a format type based on the locale from the following: - // decimal, scientific (not yet supported), percent, currency. decimal by default. - // places: Number? - // fixed number of decimal places to show. This overrides any - // information in the provided pattern. - // round: Number? - // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1 - // means do not round. - // locale: String? - // override the locale used to determine formatting rules - // fractional: Boolean? - // If false, show no decimal places, overriding places and pattern settings. - this.pattern = pattern; - this.type = type; - this.places = places; - this.round = round; - this.locale = locale; - this.fractional = fractional; -} -=====*/ - -dojo.number.format = function(/*Number*/value, /*dojo.number.__FormatOptions?*/options){ - // summary: - // Format a Number as a String, using locale-specific settings - // description: - // Create a string from a Number using a known localized pattern. - // Formatting patterns appropriate to the locale are chosen from the - // [Common Locale Data Repository](http://unicode.org/cldr) as well as the appropriate symbols and - // delimiters. - // If value is Infinity, -Infinity, or is not a valid JavaScript number, return null. - // value: - // the number to be formatted - - options = dojo.mixin({}, options || {}); - var locale = dojo.i18n.normalizeLocale(options.locale), - bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale); - options.customs = bundle; - var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"]; - if(isNaN(value) || Math.abs(value) == Infinity){ return null; } // null - return dojo.number._applyPattern(value, pattern, options); // String -}; - -//dojo.number._numberPatternRE = /(?:[#0]*,?)*[#0](?:\.0*#*)?/; // not precise, but good enough -dojo.number._numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/; // not precise, but good enough - -dojo.number._applyPattern = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatOptions?*/options){ - // summary: - // Apply pattern to format value as a string using options. Gives no - // consideration to local customs. - // value: - // the number to be formatted. - // pattern: - // a pattern string as described by - // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) - // options: dojo.number.__FormatOptions? - // _applyPattern is usually called via `dojo.number.format()` which - // populates an extra property in the options parameter, "customs". - // The customs object specifies group and decimal parameters if set. - - //TODO: support escapes - options = options || {}; - var group = options.customs.group, - decimal = options.customs.decimal, - patternList = pattern.split(';'), - positivePattern = patternList[0]; - pattern = patternList[(value < 0) ? 1 : 0] || ("-" + positivePattern); - - //TODO: only test against unescaped - if(pattern.indexOf('%') != -1){ - value *= 100; - }else if(pattern.indexOf('\u2030') != -1){ - value *= 1000; // per mille - }else if(pattern.indexOf('\u00a4') != -1){ - group = options.customs.currencyGroup || group;//mixins instead? - decimal = options.customs.currencyDecimal || decimal;// Should these be mixins instead? - pattern = pattern.replace(/\u00a4{1,3}/, function(match){ - var prop = ["symbol", "currency", "displayName"][match.length-1]; - return options[prop] || options.currency || ""; - }); - }else if(pattern.indexOf('E') != -1){ - throw new Error("exponential notation not supported"); - } - - //TODO: support @ sig figs? - var numberPatternRE = dojo.number._numberPatternRE; - var numberPattern = positivePattern.match(numberPatternRE); - if(!numberPattern){ - throw new Error("unable to find a number expression in pattern: "+pattern); - } - if(options.fractional === false){ options.places = 0; } - return pattern.replace(numberPatternRE, - dojo.number._formatAbsolute(value, numberPattern[0], {decimal: decimal, group: group, places: options.places, round: options.round})); -}; - -dojo.number.round = function(/*Number*/value, /*Number?*/places, /*Number?*/increment){ - // summary: - // Rounds to the nearest value with the given number of decimal places, away from zero - // description: - // Rounds to the nearest value with the given number of decimal places, away from zero if equal. - // Similar to Number.toFixed(), but compensates for browser quirks. Rounding can be done by - // fractional increments also, such as the nearest quarter. - // NOTE: Subject to floating point errors. See dojox.math.round for experimental workaround. - // value: - // The number to round - // places: - // The number of decimal places where rounding takes place. Defaults to 0 for whole rounding. - // Must be non-negative. - // increment: - // Rounds next place to nearest value of increment/10. 10 by default. - // example: - // >>> dojo.number.round(-0.5) - // -1 - // >>> dojo.number.round(162.295, 2) - // 162.29 // note floating point error. Should be 162.3 - // >>> dojo.number.round(10.71, 0, 2.5) - // 10.75 - var factor = 10 / (increment || 10); - return (factor * +value).toFixed(places) / factor; // Number -}; - -if((0.9).toFixed() == 0){ - // (isIE) toFixed() bug workaround: Rounding fails on IE when most significant digit - // is just after the rounding place and is >=5 - (function(){ - var round = dojo.number.round; - dojo.number.round = function(v, p, m){ - var d = Math.pow(10, -p || 0), a = Math.abs(v); - if(!v || a >= d || a * Math.pow(10, p + 1) < 5){ - d = 0; - } - return round(v, p, m) + (v > 0 ? d : -d); - }; - })(); -} - -/*===== -dojo.number.__FormatAbsoluteOptions = function(){ - // decimal: String? - // the decimal separator - // group: String? - // the group separator - // places: Number?|String? - // number of decimal places. the range "n,m" will format to m places. - // round: Number? - // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1 - // means don't round. - this.decimal = decimal; - this.group = group; - this.places = places; - this.round = round; -} -=====*/ - -dojo.number._formatAbsolute = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatAbsoluteOptions?*/options){ - // summary: - // Apply numeric pattern to absolute value using options. Gives no - // consideration to local customs. - // value: - // the number to be formatted, ignores sign - // pattern: - // the number portion of a pattern (e.g. `#,##0.00`) - options = options || {}; - if(options.places === true){options.places=0;} - if(options.places === Infinity){options.places=6;} // avoid a loop; pick a limit - - var patternParts = pattern.split("."), - comma = typeof options.places == "string" && options.places.indexOf(","), - maxPlaces = options.places; - if(comma){ - maxPlaces = options.places.substring(comma + 1); - }else if(!(maxPlaces >= 0)){ - maxPlaces = (patternParts[1] || []).length; - } - if(!(options.round < 0)){ - value = dojo.number.round(value, maxPlaces, options.round); - } - - var valueParts = String(Math.abs(value)).split("."), - fractional = valueParts[1] || ""; - if(patternParts[1] || options.places){ - if(comma){ - options.places = options.places.substring(0, comma); - } - // Pad fractional with trailing zeros - var pad = options.places !== undefined ? options.places : (patternParts[1] && patternParts[1].lastIndexOf("0") + 1); - if(pad > fractional.length){ - valueParts[1] = dojo.string.pad(fractional, pad, '0', true); - } - - // Truncate fractional - if(maxPlaces < fractional.length){ - valueParts[1] = fractional.substr(0, maxPlaces); - } - }else{ - if(valueParts[1]){ valueParts.pop(); } - } - - // Pad whole with leading zeros - var patternDigits = patternParts[0].replace(',', ''); - pad = patternDigits.indexOf("0"); - if(pad != -1){ - pad = patternDigits.length - pad; - if(pad > valueParts[0].length){ - valueParts[0] = dojo.string.pad(valueParts[0], pad); - } - - // Truncate whole - if(patternDigits.indexOf("#") == -1){ - valueParts[0] = valueParts[0].substr(valueParts[0].length - pad); - } - } - - // Add group separators - var index = patternParts[0].lastIndexOf(','), - groupSize, groupSize2; - if(index != -1){ - groupSize = patternParts[0].length - index - 1; - var remainder = patternParts[0].substr(0, index); - index = remainder.lastIndexOf(','); - if(index != -1){ - groupSize2 = remainder.length - index - 1; - } - } - var pieces = []; - for(var whole = valueParts[0]; whole;){ - var off = whole.length - groupSize; - pieces.push((off > 0) ? whole.substr(off) : whole); - whole = (off > 0) ? whole.slice(0, off) : ""; - if(groupSize2){ - groupSize = groupSize2; - delete groupSize2; - } - } - valueParts[0] = pieces.reverse().join(options.group || ","); - - return valueParts.join(options.decimal || "."); -}; - -/*===== -dojo.number.__RegexpOptions = function(){ - // pattern: String? - // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) - // with this string. Default value is based on locale. Overriding this property will defeat - // localization. - // type: String? - // choose a format type based on the locale from the following: - // decimal, scientific (not yet supported), percent, currency. decimal by default. - // locale: String? - // override the locale used to determine formatting rules - // strict: Boolean? - // strict parsing, false by default. Strict parsing requires input as produced by the format() method. - // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators - // places: Number|String? - // number of decimal places to accept: Infinity, a positive number, or - // a range "n,m". Defined by pattern or Infinity if pattern not provided. - this.pattern = pattern; - this.type = type; - this.locale = locale; - this.strict = strict; - this.places = places; -} -=====*/ -dojo.number.regexp = function(/*dojo.number.__RegexpOptions?*/options){ - // summary: - // Builds the regular needed to parse a number - // description: - // Returns regular expression with positive and negative match, group - // and decimal separators - return dojo.number._parseInfo(options).regexp; // String -}; - -dojo.number._parseInfo = function(/*Object?*/options){ - options = options || {}; - var locale = dojo.i18n.normalizeLocale(options.locale), - bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale), - pattern = options.pattern || bundle[(options.type || "decimal") + "Format"], -//TODO: memoize? - group = bundle.group, - decimal = bundle.decimal, - factor = 1; - - if(pattern.indexOf('%') != -1){ - factor /= 100; - }else if(pattern.indexOf('\u2030') != -1){ - factor /= 1000; // per mille - }else{ - var isCurrency = pattern.indexOf('\u00a4') != -1; - if(isCurrency){ - group = bundle.currencyGroup || group; - decimal = bundle.currencyDecimal || decimal; - } - } - - //TODO: handle quoted escapes - var patternList = pattern.split(';'); - if(patternList.length == 1){ - patternList.push("-" + patternList[0]); - } - - var re = dojo.regexp.buildGroupRE(patternList, function(pattern){ - pattern = "(?:"+dojo.regexp.escapeString(pattern, '.')+")"; - return pattern.replace(dojo.number._numberPatternRE, function(format){ - var flags = { - signed: false, - separator: options.strict ? group : [group,""], - fractional: options.fractional, - decimal: decimal, - exponent: false - }, - - parts = format.split('.'), - places = options.places; - - // special condition for percent (factor != 1) - // allow decimal places even if not specified in pattern - if(parts.length == 1 && factor != 1){ - parts[1] = "###"; - } - if(parts.length == 1 || places === 0){ - flags.fractional = false; - }else{ - if(places === undefined){ places = options.pattern ? parts[1].lastIndexOf('0') + 1 : Infinity; } - if(places && options.fractional == undefined){flags.fractional = true;} // required fractional, unless otherwise specified - if(!options.places && (places < parts[1].length)){ places += "," + parts[1].length; } - flags.places = places; - } - var groups = parts[0].split(','); - if(groups.length > 1){ - flags.groupSize = groups.pop().length; - if(groups.length > 1){ - flags.groupSize2 = groups.pop().length; - } - } - return "("+dojo.number._realNumberRegexp(flags)+")"; - }); - }, true); - - if(isCurrency){ - // substitute the currency symbol for the placeholder in the pattern - re = re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g, function(match, before, target, after){ - var prop = ["symbol", "currency", "displayName"][target.length-1], - symbol = dojo.regexp.escapeString(options[prop] || options.currency || ""); - before = before ? "[\\s\\xa0]" : ""; - after = after ? "[\\s\\xa0]" : ""; - if(!options.strict){ - if(before){before += "*";} - if(after){after += "*";} - return "(?:"+before+symbol+after+")?"; - } - return before+symbol+after; - }); - } - -//TODO: substitute localized sign/percent/permille/etc.? - - // normalize whitespace and return - return {regexp: re.replace(/[\xa0 ]/g, "[\\s\\xa0]"), group: group, decimal: decimal, factor: factor}; // Object -}; - -/*===== -dojo.number.__ParseOptions = function(){ - // pattern: String? - // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) - // with this string. Default value is based on locale. Overriding this property will defeat - // localization. Literal characters in patterns are not supported. - // type: String? - // choose a format type based on the locale from the following: - // decimal, scientific (not yet supported), percent, currency. decimal by default. - // locale: String? - // override the locale used to determine formatting rules - // strict: Boolean? - // strict parsing, false by default. Strict parsing requires input as produced by the format() method. - // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators - // fractional: Boolean?|Array? - // Whether to include the fractional portion, where the number of decimal places are implied by pattern - // or explicit 'places' parameter. The value [true,false] makes the fractional portion optional. - this.pattern = pattern; - this.type = type; - this.locale = locale; - this.strict = strict; - this.fractional = fractional; -} -=====*/ -dojo.number.parse = function(/*String*/expression, /*dojo.number.__ParseOptions?*/options){ - // summary: - // Convert a properly formatted string to a primitive Number, using - // locale-specific settings. - // description: - // Create a Number from a string using a known localized pattern. - // Formatting patterns are chosen appropriate to the locale - // and follow the syntax described by - // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) - // Note that literal characters in patterns are not supported. - // expression: - // A string representation of a Number - var info = dojo.number._parseInfo(options), - results = (new RegExp("^"+info.regexp+"$")).exec(expression); - if(!results){ - return NaN; //NaN - } - var absoluteMatch = results[1]; // match for the positive expression - if(!results[1]){ - if(!results[2]){ - return NaN; //NaN - } - // matched the negative pattern - absoluteMatch =results[2]; - info.factor *= -1; - } - - // Transform it to something Javascript can parse as a number. Normalize - // decimal point and strip out group separators or alternate forms of whitespace - absoluteMatch = absoluteMatch. - replace(new RegExp("["+info.group + "\\s\\xa0"+"]", "g"), ""). - replace(info.decimal, "."); - // Adjust for negative sign, percent, etc. as necessary - return absoluteMatch * info.factor; //Number -}; - -/*===== -dojo.number.__RealNumberRegexpFlags = function(){ - // places: Number? - // The integer number of decimal places or a range given as "n,m". If - // not given, the decimal part is optional and the number of places is - // unlimited. - // decimal: String? - // A string for the character used as the decimal point. Default - // is ".". - // fractional: Boolean?|Array? - // Whether decimal places are used. Can be true, false, or [true, - // false]. Default is [true, false] which means optional. - // exponent: Boolean?|Array? - // Express in exponential notation. Can be true, false, or [true, - // false]. Default is [true, false], (i.e. will match if the - // exponential part is present are not). - // eSigned: Boolean?|Array? - // The leading plus-or-minus sign on the exponent. Can be true, - // false, or [true, false]. Default is [true, false], (i.e. will - // match if it is signed or unsigned). flags in regexp.integer can be - // applied. - this.places = places; - this.decimal = decimal; - this.fractional = fractional; - this.exponent = exponent; - this.eSigned = eSigned; -} -=====*/ - -dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*/flags){ - // summary: - // Builds a regular expression to match a real number in exponential - // notation - - // assign default values to missing parameters - flags = flags || {}; - //TODO: use mixin instead? - if(!("places" in flags)){ flags.places = Infinity; } - if(typeof flags.decimal != "string"){ flags.decimal = "."; } - if(!("fractional" in flags) || /^0/.test(flags.places)){ flags.fractional = [true, false]; } - if(!("exponent" in flags)){ flags.exponent = [true, false]; } - if(!("eSigned" in flags)){ flags.eSigned = [true, false]; } - - var integerRE = dojo.number._integerRegexp(flags), - decimalRE = dojo.regexp.buildGroupRE(flags.fractional, - function(q){ - var re = ""; - if(q && (flags.places!==0)){ - re = "\\" + flags.decimal; - if(flags.places == Infinity){ - re = "(?:" + re + "\\d+)?"; - }else{ - re += "\\d{" + flags.places + "}"; - } - } - return re; - }, - true - ); - - var exponentRE = dojo.regexp.buildGroupRE(flags.exponent, - function(q){ - if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; } - return ""; - } - ); - - var realRE = integerRE + decimalRE; - // allow for decimals without integers, e.g. .25 - if(decimalRE){realRE = "(?:(?:"+ realRE + ")|(?:" + decimalRE + "))";} - return realRE + exponentRE; // String -}; - -/*===== -dojo.number.__IntegerRegexpFlags = function(){ - // signed: Boolean? - // The leading plus-or-minus sign. Can be true, false, or `[true,false]`. - // Default is `[true, false]`, (i.e. will match if it is signed - // or unsigned). - // separator: String? - // The character used as the thousands separator. Default is no - // separator. For more than one symbol use an array, e.g. `[",", ""]`, - // makes ',' optional. - // groupSize: Number? - // group size between separators - // groupSize2: Number? - // second grouping, where separators 2..n have a different interval than the first separator (for India) - this.signed = signed; - this.separator = separator; - this.groupSize = groupSize; - this.groupSize2 = groupSize2; -} -=====*/ - -dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags){ - // summary: - // Builds a regular expression that matches an integer - - // assign default values to missing parameters - flags = flags || {}; - if(!("signed" in flags)){ flags.signed = [true, false]; } - if(!("separator" in flags)){ - flags.separator = ""; - }else if(!("groupSize" in flags)){ - flags.groupSize = 3; - } - - var signRE = dojo.regexp.buildGroupRE(flags.signed, - function(q){ return q ? "[-+]" : ""; }, - true - ); - - var numberRE = dojo.regexp.buildGroupRE(flags.separator, - function(sep){ - if(!sep){ - return "(?:\\d+)"; - } - - sep = dojo.regexp.escapeString(sep); - if(sep == " "){ sep = "\\s"; } - else if(sep == "\xa0"){ sep = "\\s\\xa0"; } - - var grp = flags.groupSize, grp2 = flags.groupSize2; - //TODO: should we continue to enforce that numbers with separators begin with 1-9? See #6933 - if(grp2){ - var grp2RE = "(?:0|[1-9]\\d{0," + (grp2-1) + "}(?:[" + sep + "]\\d{" + grp2 + "})*[" + sep + "]\\d{" + grp + "})"; - return ((grp-grp2) > 0) ? "(?:" + grp2RE + "|(?:0|[1-9]\\d{0," + (grp-1) + "}))" : grp2RE; - } - return "(?:0|[1-9]\\d{0," + (grp-1) + "}(?:[" + sep + "]\\d{" + grp + "})*)"; - }, - true - ); - - return signRE + numberRE; // String -}; - -} +//>>built +define("dojo/number",["./_base/kernel","./_base/lang","./i18n","./i18n!./cldr/nls/number","./string","./regexp"],function(_1,_2,_3,_4,_5,_6){_2.getObject("number",true,_1);_1.number.format=function(_7,_8){_8=_2.mixin({},_8||{});var _9=_3.normalizeLocale(_8.locale),_a=_3.getLocalization("dojo.cldr","number",_9);_8.customs=_a;var _b=_8.pattern||_a[(_8.type||"decimal")+"Format"];if(isNaN(_7)||Math.abs(_7)==Infinity){return null;}return _1.number._applyPattern(_7,_b,_8);};_1.number._numberPatternRE=/[#0,]*[#0](?:\.0*#*)?/;_1.number._applyPattern=function(_c,_d,_e){_e=_e||{};var _f=_e.customs.group,_10=_e.customs.decimal,_11=_d.split(";"),_12=_11[0];_d=_11[(_c<0)?1:0]||("-"+_12);if(_d.indexOf("%")!=-1){_c*=100;}else{if(_d.indexOf("‰")!=-1){_c*=1000;}else{if(_d.indexOf("¤")!=-1){_f=_e.customs.currencyGroup||_f;_10=_e.customs.currencyDecimal||_10;_d=_d.replace(/\u00a4{1,3}/,function(_13){var _14=["symbol","currency","displayName"][_13.length-1];return _e[_14]||_e.currency||"";});}else{if(_d.indexOf("E")!=-1){throw new Error("exponential notation not supported");}}}}var _15=_1.number._numberPatternRE;var _16=_12.match(_15);if(!_16){throw new Error("unable to find a number expression in pattern: "+_d);}if(_e.fractional===false){_e.places=0;}return _d.replace(_15,_1.number._formatAbsolute(_c,_16[0],{decimal:_10,group:_f,places:_e.places,round:_e.round}));};_1.number.round=function(_17,_18,_19){var _1a=10/(_19||10);return (_1a*+_17).toFixed(_18)/_1a;};if((0.9).toFixed()==0){var _1b=_1.number.round;_1.number.round=function(v,p,m){var d=Math.pow(10,-p||0),a=Math.abs(v);if(!v||a>=d||a*Math.pow(10,p+1)<5){d=0;}return _1b(v,p,m)+(v>0?d:-d);};}_1.number._formatAbsolute=function(_1c,_1d,_1e){_1e=_1e||{};if(_1e.places===true){_1e.places=0;}if(_1e.places===Infinity){_1e.places=6;}var _1f=_1d.split("."),_20=typeof _1e.places=="string"&&_1e.places.indexOf(","),_21=_1e.places;if(_20){_21=_1e.places.substring(_20+1);}else{if(!(_21>=0)){_21=(_1f[1]||[]).length;}}if(!(_1e.round<0)){_1c=_1.number.round(_1c,_21,_1e.round);}var _22=String(Math.abs(_1c)).split("."),_23=_22[1]||"";if(_1f[1]||_1e.places){if(_20){_1e.places=_1e.places.substring(0,_20);}var pad=_1e.places!==undefined?_1e.places:(_1f[1]&&_1f[1].lastIndexOf("0")+1);if(pad>_23.length){_22[1]=_5.pad(_23,pad,"0",true);}if(_21<_23.length){_22[1]=_23.substr(0,_21);}}else{if(_22[1]){_22.pop();}}var _24=_1f[0].replace(",","");pad=_24.indexOf("0");if(pad!=-1){pad=_24.length-pad;if(pad>_22[0].length){_22[0]=_5.pad(_22[0],pad);}if(_24.indexOf("#")==-1){_22[0]=_22[0].substr(_22[0].length-pad);}}var _25=_1f[0].lastIndexOf(","),_26,_27;if(_25!=-1){_26=_1f[0].length-_25-1;var _28=_1f[0].substr(0,_25);_25=_28.lastIndexOf(",");if(_25!=-1){_27=_28.length-_25-1;}}var _29=[];for(var _2a=_22[0];_2a;){var off=_2a.length-_26;_29.push((off>0)?_2a.substr(off):_2a);_2a=(off>0)?_2a.slice(0,off):"";if(_27){_26=_27;delete _27;}}_22[0]=_29.reverse().join(_1e.group||",");return _22.join(_1e.decimal||".");};_1.number.regexp=function(_2b){return _1.number._parseInfo(_2b).regexp;};_1.number._parseInfo=function(_2c){_2c=_2c||{};var _2d=_3.normalizeLocale(_2c.locale),_2e=_3.getLocalization("dojo.cldr","number",_2d),_2f=_2c.pattern||_2e[(_2c.type||"decimal")+"Format"],_30=_2e.group,_31=_2e.decimal,_32=1;if(_2f.indexOf("%")!=-1){_32/=100;}else{if(_2f.indexOf("‰")!=-1){_32/=1000;}else{var _33=_2f.indexOf("¤")!=-1;if(_33){_30=_2e.currencyGroup||_30;_31=_2e.currencyDecimal||_31;}}}var _34=_2f.split(";");if(_34.length==1){_34.push("-"+_34[0]);}var re=_6.buildGroupRE(_34,function(_35){_35="(?:"+_6.escapeString(_35,".")+")";return _35.replace(_1.number._numberPatternRE,function(_36){var _37={signed:false,separator:_2c.strict?_30:[_30,""],fractional:_2c.fractional,decimal:_31,exponent:false},_38=_36.split("."),_39=_2c.places;if(_38.length==1&&_32!=1){_38[1]="###";}if(_38.length==1||_39===0){_37.fractional=false;}else{if(_39===undefined){_39=_2c.pattern?_38[1].lastIndexOf("0")+1:Infinity;}if(_39&&_2c.fractional==undefined){_37.fractional=true;}if(!_2c.places&&(_39<_38[1].length)){_39+=","+_38[1].length;}_37.places=_39;}var _3a=_38[0].split(",");if(_3a.length>1){_37.groupSize=_3a.pop().length;if(_3a.length>1){_37.groupSize2=_3a.pop().length;}}return "("+_1.number._realNumberRegexp(_37)+")";});},true);if(_33){re=re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g,function(_3b,_3c,_3d,_3e){var _3f=["symbol","currency","displayName"][_3d.length-1],_40=_6.escapeString(_2c[_3f]||_2c.currency||"");_3c=_3c?"[\\s\\xa0]":"";_3e=_3e?"[\\s\\xa0]":"";if(!_2c.strict){if(_3c){_3c+="*";}if(_3e){_3e+="*";}return "(?:"+_3c+_40+_3e+")?";}return _3c+_40+_3e;});}return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_30,decimal:_31,factor:_32};};_1.number.parse=function(_41,_42){var _43=_1.number._parseInfo(_42),_44=(new RegExp("^"+_43.regexp+"$")).exec(_41);if(!_44){return NaN;}var _45=_44[1];if(!_44[1]){if(!_44[2]){return NaN;}_45=_44[2];_43.factor*=-1;}_45=_45.replace(new RegExp("["+_43.group+"\\s\\xa0"+"]","g"),"").replace(_43.decimal,".");return _45*_43.factor;};_1.number._realNumberRegexp=function(_46){_46=_46||{};if(!("places" in _46)){_46.places=Infinity;}if(typeof _46.decimal!="string"){_46.decimal=".";}if(!("fractional" in _46)||/^0/.test(_46.places)){_46.fractional=[true,false];}if(!("exponent" in _46)){_46.exponent=[true,false];}if(!("eSigned" in _46)){_46.eSigned=[true,false];}var _47=_1.number._integerRegexp(_46),_48=_6.buildGroupRE(_46.fractional,function(q){var re="";if(q&&(_46.places!==0)){re="\\"+_46.decimal;if(_46.places==Infinity){re="(?:"+re+"\\d+)?";}else{re+="\\d{"+_46.places+"}";}}return re;},true);var _49=_6.buildGroupRE(_46.exponent,function(q){if(q){return "([eE]"+_1.number._integerRegexp({signed:_46.eSigned})+")";}return "";});var _4a=_47+_48;if(_48){_4a="(?:(?:"+_4a+")|(?:"+_48+"))";}return _4a+_49;};_1.number._integerRegexp=function(_4b){_4b=_4b||{};if(!("signed" in _4b)){_4b.signed=[true,false];}if(!("separator" in _4b)){_4b.separator="";}else{if(!("groupSize" in _4b)){_4b.groupSize=3;}}var _4c=_6.buildGroupRE(_4b.signed,function(q){return q?"[-+]":"";},true);var _4d=_6.buildGroupRE(_4b.separator,function(sep){if(!sep){return "(?:\\d+)";}sep=_6.escapeString(sep);if(sep==" "){sep="\\s";}else{if(sep==" "){sep="\\s\\xa0";}}var grp=_4b.groupSize,_4e=_4b.groupSize2;if(_4e){var _4f="(?:0|[1-9]\\d{0,"+(_4e-1)+"}(?:["+sep+"]\\d{"+_4e+"})*["+sep+"]\\d{"+grp+"})";return ((grp-_4e)>0)?"(?:"+_4f+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_4f;}return "(?:0|[1-9]\\d{0,"+(grp-1)+"}(?:["+sep+"]\\d{"+grp+"})*)";},true);return _4c+_4d;};return _1.number;}); \ No newline at end of file diff --git a/lib/dojo/number.js.uncompressed.js b/lib/dojo/number.js.uncompressed.js new file mode 100644 index 00000000..c3635df3 --- /dev/null +++ b/lib/dojo/number.js.uncompressed.js @@ -0,0 +1,576 @@ +define("dojo/number", ["./_base/kernel", "./_base/lang", "./i18n", "./i18n!./cldr/nls/number", "./string", "./regexp"], + function(dojo, lang, i18n, nlsNumber, dstring, dregexp) { + + // module: + // dojo/number + // summary: + // TODOC + +lang.getObject("number", true, dojo); + +/*===== +dojo.number = { + // summary: localized formatting and parsing routines for Number +} + +dojo.number.__FormatOptions = function(){ + // pattern: String? + // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) + // with this string. Default value is based on locale. Overriding this property will defeat + // localization. Literal characters in patterns are not supported. + // type: String? + // choose a format type based on the locale from the following: + // decimal, scientific (not yet supported), percent, currency. decimal by default. + // places: Number? + // fixed number of decimal places to show. This overrides any + // information in the provided pattern. + // round: Number? + // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1 + // means do not round. + // locale: String? + // override the locale used to determine formatting rules + // fractional: Boolean? + // If false, show no decimal places, overriding places and pattern settings. + this.pattern = pattern; + this.type = type; + this.places = places; + this.round = round; + this.locale = locale; + this.fractional = fractional; +} +=====*/ + +dojo.number.format = function(/*Number*/value, /*dojo.number.__FormatOptions?*/options){ + // summary: + // Format a Number as a String, using locale-specific settings + // description: + // Create a string from a Number using a known localized pattern. + // Formatting patterns appropriate to the locale are chosen from the + // [Common Locale Data Repository](http://unicode.org/cldr) as well as the appropriate symbols and + // delimiters. + // If value is Infinity, -Infinity, or is not a valid JavaScript number, return null. + // value: + // the number to be formatted + + options = lang.mixin({}, options || {}); + var locale = i18n.normalizeLocale(options.locale), + bundle = i18n.getLocalization("dojo.cldr", "number", locale); + options.customs = bundle; + var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"]; + if(isNaN(value) || Math.abs(value) == Infinity){ return null; } // null + return dojo.number._applyPattern(value, pattern, options); // String +}; + +//dojo.number._numberPatternRE = /(?:[#0]*,?)*[#0](?:\.0*#*)?/; // not precise, but good enough +dojo.number._numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/; // not precise, but good enough + +dojo.number._applyPattern = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatOptions?*/options){ + // summary: + // Apply pattern to format value as a string using options. Gives no + // consideration to local customs. + // value: + // the number to be formatted. + // pattern: + // a pattern string as described by + // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) + // options: dojo.number.__FormatOptions? + // _applyPattern is usually called via `dojo.number.format()` which + // populates an extra property in the options parameter, "customs". + // The customs object specifies group and decimal parameters if set. + + //TODO: support escapes + options = options || {}; + var group = options.customs.group, + decimal = options.customs.decimal, + patternList = pattern.split(';'), + positivePattern = patternList[0]; + pattern = patternList[(value < 0) ? 1 : 0] || ("-" + positivePattern); + + //TODO: only test against unescaped + if(pattern.indexOf('%') != -1){ + value *= 100; + }else if(pattern.indexOf('\u2030') != -1){ + value *= 1000; // per mille + }else if(pattern.indexOf('\u00a4') != -1){ + group = options.customs.currencyGroup || group;//mixins instead? + decimal = options.customs.currencyDecimal || decimal;// Should these be mixins instead? + pattern = pattern.replace(/\u00a4{1,3}/, function(match){ + var prop = ["symbol", "currency", "displayName"][match.length-1]; + return options[prop] || options.currency || ""; + }); + }else if(pattern.indexOf('E') != -1){ + throw new Error("exponential notation not supported"); + } + + //TODO: support @ sig figs? + var numberPatternRE = dojo.number._numberPatternRE; + var numberPattern = positivePattern.match(numberPatternRE); + if(!numberPattern){ + throw new Error("unable to find a number expression in pattern: "+pattern); + } + if(options.fractional === false){ options.places = 0; } + return pattern.replace(numberPatternRE, + dojo.number._formatAbsolute(value, numberPattern[0], {decimal: decimal, group: group, places: options.places, round: options.round})); +}; + +dojo.number.round = function(/*Number*/value, /*Number?*/places, /*Number?*/increment){ + // summary: + // Rounds to the nearest value with the given number of decimal places, away from zero + // description: + // Rounds to the nearest value with the given number of decimal places, away from zero if equal. + // Similar to Number.toFixed(), but compensates for browser quirks. Rounding can be done by + // fractional increments also, such as the nearest quarter. + // NOTE: Subject to floating point errors. See dojox.math.round for experimental workaround. + // value: + // The number to round + // places: + // The number of decimal places where rounding takes place. Defaults to 0 for whole rounding. + // Must be non-negative. + // increment: + // Rounds next place to nearest value of increment/10. 10 by default. + // example: + // >>> dojo.number.round(-0.5) + // -1 + // >>> dojo.number.round(162.295, 2) + // 162.29 // note floating point error. Should be 162.3 + // >>> dojo.number.round(10.71, 0, 2.5) + // 10.75 + var factor = 10 / (increment || 10); + return (factor * +value).toFixed(places) / factor; // Number +}; + +if((0.9).toFixed() == 0){ + // (isIE) toFixed() bug workaround: Rounding fails on IE when most significant digit + // is just after the rounding place and is >=5 + var round = dojo.number.round; + dojo.number.round = function(v, p, m){ + var d = Math.pow(10, -p || 0), a = Math.abs(v); + if(!v || a >= d || a * Math.pow(10, p + 1) < 5){ + d = 0; + } + return round(v, p, m) + (v > 0 ? d : -d); + }; +} + +/*===== +dojo.number.__FormatAbsoluteOptions = function(){ + // decimal: String? + // the decimal separator + // group: String? + // the group separator + // places: Number?|String? + // number of decimal places. the range "n,m" will format to m places. + // round: Number? + // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1 + // means don't round. + this.decimal = decimal; + this.group = group; + this.places = places; + this.round = round; +} +=====*/ + +dojo.number._formatAbsolute = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatAbsoluteOptions?*/options){ + // summary: + // Apply numeric pattern to absolute value using options. Gives no + // consideration to local customs. + // value: + // the number to be formatted, ignores sign + // pattern: + // the number portion of a pattern (e.g. `#,##0.00`) + options = options || {}; + if(options.places === true){options.places=0;} + if(options.places === Infinity){options.places=6;} // avoid a loop; pick a limit + + var patternParts = pattern.split("."), + comma = typeof options.places == "string" && options.places.indexOf(","), + maxPlaces = options.places; + if(comma){ + maxPlaces = options.places.substring(comma + 1); + }else if(!(maxPlaces >= 0)){ + maxPlaces = (patternParts[1] || []).length; + } + if(!(options.round < 0)){ + value = dojo.number.round(value, maxPlaces, options.round); + } + + var valueParts = String(Math.abs(value)).split("."), + fractional = valueParts[1] || ""; + if(patternParts[1] || options.places){ + if(comma){ + options.places = options.places.substring(0, comma); + } + // Pad fractional with trailing zeros + var pad = options.places !== undefined ? options.places : (patternParts[1] && patternParts[1].lastIndexOf("0") + 1); + if(pad > fractional.length){ + valueParts[1] = dstring.pad(fractional, pad, '0', true); + } + + // Truncate fractional + if(maxPlaces < fractional.length){ + valueParts[1] = fractional.substr(0, maxPlaces); + } + }else{ + if(valueParts[1]){ valueParts.pop(); } + } + + // Pad whole with leading zeros + var patternDigits = patternParts[0].replace(',', ''); + pad = patternDigits.indexOf("0"); + if(pad != -1){ + pad = patternDigits.length - pad; + if(pad > valueParts[0].length){ + valueParts[0] = dstring.pad(valueParts[0], pad); + } + + // Truncate whole + if(patternDigits.indexOf("#") == -1){ + valueParts[0] = valueParts[0].substr(valueParts[0].length - pad); + } + } + + // Add group separators + var index = patternParts[0].lastIndexOf(','), + groupSize, groupSize2; + if(index != -1){ + groupSize = patternParts[0].length - index - 1; + var remainder = patternParts[0].substr(0, index); + index = remainder.lastIndexOf(','); + if(index != -1){ + groupSize2 = remainder.length - index - 1; + } + } + var pieces = []; + for(var whole = valueParts[0]; whole;){ + var off = whole.length - groupSize; + pieces.push((off > 0) ? whole.substr(off) : whole); + whole = (off > 0) ? whole.slice(0, off) : ""; + if(groupSize2){ + groupSize = groupSize2; + delete groupSize2; + } + } + valueParts[0] = pieces.reverse().join(options.group || ","); + + return valueParts.join(options.decimal || "."); +}; + +/*===== +dojo.number.__RegexpOptions = function(){ + // pattern: String? + // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) + // with this string. Default value is based on locale. Overriding this property will defeat + // localization. + // type: String? + // choose a format type based on the locale from the following: + // decimal, scientific (not yet supported), percent, currency. decimal by default. + // locale: String? + // override the locale used to determine formatting rules + // strict: Boolean? + // strict parsing, false by default. Strict parsing requires input as produced by the format() method. + // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators + // places: Number|String? + // number of decimal places to accept: Infinity, a positive number, or + // a range "n,m". Defined by pattern or Infinity if pattern not provided. + this.pattern = pattern; + this.type = type; + this.locale = locale; + this.strict = strict; + this.places = places; +} +=====*/ +dojo.number.regexp = function(/*dojo.number.__RegexpOptions?*/options){ + // summary: + // Builds the regular needed to parse a number + // description: + // Returns regular expression with positive and negative match, group + // and decimal separators + return dojo.number._parseInfo(options).regexp; // String +}; + +dojo.number._parseInfo = function(/*Object?*/options){ + options = options || {}; + var locale = i18n.normalizeLocale(options.locale), + bundle = i18n.getLocalization("dojo.cldr", "number", locale), + pattern = options.pattern || bundle[(options.type || "decimal") + "Format"], +//TODO: memoize? + group = bundle.group, + decimal = bundle.decimal, + factor = 1; + + if(pattern.indexOf('%') != -1){ + factor /= 100; + }else if(pattern.indexOf('\u2030') != -1){ + factor /= 1000; // per mille + }else{ + var isCurrency = pattern.indexOf('\u00a4') != -1; + if(isCurrency){ + group = bundle.currencyGroup || group; + decimal = bundle.currencyDecimal || decimal; + } + } + + //TODO: handle quoted escapes + var patternList = pattern.split(';'); + if(patternList.length == 1){ + patternList.push("-" + patternList[0]); + } + + var re = dregexp.buildGroupRE(patternList, function(pattern){ + pattern = "(?:"+dregexp.escapeString(pattern, '.')+")"; + return pattern.replace(dojo.number._numberPatternRE, function(format){ + var flags = { + signed: false, + separator: options.strict ? group : [group,""], + fractional: options.fractional, + decimal: decimal, + exponent: false + }, + + parts = format.split('.'), + places = options.places; + + // special condition for percent (factor != 1) + // allow decimal places even if not specified in pattern + if(parts.length == 1 && factor != 1){ + parts[1] = "###"; + } + if(parts.length == 1 || places === 0){ + flags.fractional = false; + }else{ + if(places === undefined){ places = options.pattern ? parts[1].lastIndexOf('0') + 1 : Infinity; } + if(places && options.fractional == undefined){flags.fractional = true;} // required fractional, unless otherwise specified + if(!options.places && (places < parts[1].length)){ places += "," + parts[1].length; } + flags.places = places; + } + var groups = parts[0].split(','); + if(groups.length > 1){ + flags.groupSize = groups.pop().length; + if(groups.length > 1){ + flags.groupSize2 = groups.pop().length; + } + } + return "("+dojo.number._realNumberRegexp(flags)+")"; + }); + }, true); + + if(isCurrency){ + // substitute the currency symbol for the placeholder in the pattern + re = re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g, function(match, before, target, after){ + var prop = ["symbol", "currency", "displayName"][target.length-1], + symbol = dregexp.escapeString(options[prop] || options.currency || ""); + before = before ? "[\\s\\xa0]" : ""; + after = after ? "[\\s\\xa0]" : ""; + if(!options.strict){ + if(before){before += "*";} + if(after){after += "*";} + return "(?:"+before+symbol+after+")?"; + } + return before+symbol+after; + }); + } + +//TODO: substitute localized sign/percent/permille/etc.? + + // normalize whitespace and return + return {regexp: re.replace(/[\xa0 ]/g, "[\\s\\xa0]"), group: group, decimal: decimal, factor: factor}; // Object +}; + +/*===== +dojo.number.__ParseOptions = function(){ + // pattern: String? + // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) + // with this string. Default value is based on locale. Overriding this property will defeat + // localization. Literal characters in patterns are not supported. + // type: String? + // choose a format type based on the locale from the following: + // decimal, scientific (not yet supported), percent, currency. decimal by default. + // locale: String? + // override the locale used to determine formatting rules + // strict: Boolean? + // strict parsing, false by default. Strict parsing requires input as produced by the format() method. + // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators + // fractional: Boolean?|Array? + // Whether to include the fractional portion, where the number of decimal places are implied by pattern + // or explicit 'places' parameter. The value [true,false] makes the fractional portion optional. + this.pattern = pattern; + this.type = type; + this.locale = locale; + this.strict = strict; + this.fractional = fractional; +} +=====*/ +dojo.number.parse = function(/*String*/expression, /*dojo.number.__ParseOptions?*/options){ + // summary: + // Convert a properly formatted string to a primitive Number, using + // locale-specific settings. + // description: + // Create a Number from a string using a known localized pattern. + // Formatting patterns are chosen appropriate to the locale + // and follow the syntax described by + // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) + // Note that literal characters in patterns are not supported. + // expression: + // A string representation of a Number + var info = dojo.number._parseInfo(options), + results = (new RegExp("^"+info.regexp+"$")).exec(expression); + if(!results){ + return NaN; //NaN + } + var absoluteMatch = results[1]; // match for the positive expression + if(!results[1]){ + if(!results[2]){ + return NaN; //NaN + } + // matched the negative pattern + absoluteMatch =results[2]; + info.factor *= -1; + } + + // Transform it to something Javascript can parse as a number. Normalize + // decimal point and strip out group separators or alternate forms of whitespace + absoluteMatch = absoluteMatch. + replace(new RegExp("["+info.group + "\\s\\xa0"+"]", "g"), ""). + replace(info.decimal, "."); + // Adjust for negative sign, percent, etc. as necessary + return absoluteMatch * info.factor; //Number +}; + +/*===== +dojo.number.__RealNumberRegexpFlags = function(){ + // places: Number? + // The integer number of decimal places or a range given as "n,m". If + // not given, the decimal part is optional and the number of places is + // unlimited. + // decimal: String? + // A string for the character used as the decimal point. Default + // is ".". + // fractional: Boolean?|Array? + // Whether decimal places are used. Can be true, false, or [true, + // false]. Default is [true, false] which means optional. + // exponent: Boolean?|Array? + // Express in exponential notation. Can be true, false, or [true, + // false]. Default is [true, false], (i.e. will match if the + // exponential part is present are not). + // eSigned: Boolean?|Array? + // The leading plus-or-minus sign on the exponent. Can be true, + // false, or [true, false]. Default is [true, false], (i.e. will + // match if it is signed or unsigned). flags in regexp.integer can be + // applied. + this.places = places; + this.decimal = decimal; + this.fractional = fractional; + this.exponent = exponent; + this.eSigned = eSigned; +} +=====*/ + +dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*/flags){ + // summary: + // Builds a regular expression to match a real number in exponential + // notation + + // assign default values to missing parameters + flags = flags || {}; + //TODO: use mixin instead? + if(!("places" in flags)){ flags.places = Infinity; } + if(typeof flags.decimal != "string"){ flags.decimal = "."; } + if(!("fractional" in flags) || /^0/.test(flags.places)){ flags.fractional = [true, false]; } + if(!("exponent" in flags)){ flags.exponent = [true, false]; } + if(!("eSigned" in flags)){ flags.eSigned = [true, false]; } + + var integerRE = dojo.number._integerRegexp(flags), + decimalRE = dregexp.buildGroupRE(flags.fractional, + function(q){ + var re = ""; + if(q && (flags.places!==0)){ + re = "\\" + flags.decimal; + if(flags.places == Infinity){ + re = "(?:" + re + "\\d+)?"; + }else{ + re += "\\d{" + flags.places + "}"; + } + } + return re; + }, + true + ); + + var exponentRE = dregexp.buildGroupRE(flags.exponent, + function(q){ + if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; } + return ""; + } + ); + + var realRE = integerRE + decimalRE; + // allow for decimals without integers, e.g. .25 + if(decimalRE){realRE = "(?:(?:"+ realRE + ")|(?:" + decimalRE + "))";} + return realRE + exponentRE; // String +}; + +/*===== +dojo.number.__IntegerRegexpFlags = function(){ + // signed: Boolean? + // The leading plus-or-minus sign. Can be true, false, or `[true,false]`. + // Default is `[true, false]`, (i.e. will match if it is signed + // or unsigned). + // separator: String? + // The character used as the thousands separator. Default is no + // separator. For more than one symbol use an array, e.g. `[",", ""]`, + // makes ',' optional. + // groupSize: Number? + // group size between separators + // groupSize2: Number? + // second grouping, where separators 2..n have a different interval than the first separator (for India) + this.signed = signed; + this.separator = separator; + this.groupSize = groupSize; + this.groupSize2 = groupSize2; +} +=====*/ + +dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags){ + // summary: + // Builds a regular expression that matches an integer + + // assign default values to missing parameters + flags = flags || {}; + if(!("signed" in flags)){ flags.signed = [true, false]; } + if(!("separator" in flags)){ + flags.separator = ""; + }else if(!("groupSize" in flags)){ + flags.groupSize = 3; + } + + var signRE = dregexp.buildGroupRE(flags.signed, + function(q){ return q ? "[-+]" : ""; }, + true + ); + + var numberRE = dregexp.buildGroupRE(flags.separator, + function(sep){ + if(!sep){ + return "(?:\\d+)"; + } + + sep = dregexp.escapeString(sep); + if(sep == " "){ sep = "\\s"; } + else if(sep == "\xa0"){ sep = "\\s\\xa0"; } + + var grp = flags.groupSize, grp2 = flags.groupSize2; + //TODO: should we continue to enforce that numbers with separators begin with 1-9? See #6933 + if(grp2){ + var grp2RE = "(?:0|[1-9]\\d{0," + (grp2-1) + "}(?:[" + sep + "]\\d{" + grp2 + "})*[" + sep + "]\\d{" + grp + "})"; + return ((grp-grp2) > 0) ? "(?:" + grp2RE + "|(?:0|[1-9]\\d{0," + (grp-1) + "}))" : grp2RE; + } + return "(?:0|[1-9]\\d{0," + (grp-1) + "}(?:[" + sep + "]\\d{" + grp + "})*)"; + }, + true + ); + + return signRE + numberRE; // String +}; + +return dojo.number; +}); diff --git a/lib/dojo/on.js b/lib/dojo/on.js new file mode 100644 index 00000000..c9b47346 --- /dev/null +++ b/lib/dojo/on.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/on",["./has!dom-addeventlistener?:./aspect","./_base/kernel","./has"],function(_1,_2,_3){"use strict";if(1){var _4=window.ScriptEngineMajorVersion;_3.add("jscript",_4&&(_4()+ScriptEngineMinorVersion()/10));_3.add("event-orientationchange",_3("touch")&&!_3("android"));}var on=function(_5,_6,_7,_8){if(_5.on){return _5.on(_6,_7);}return on.parse(_5,_6,_7,_9,_8,this);};on.pausable=function(_a,_b,_c,_d){var _e;var _f=on(_a,_b,function(){if(!_e){return _c.apply(this,arguments);}},_d);_f.pause=function(){_e=true;};_f.resume=function(){_e=false;};return _f;};on.once=function(_10,_11,_12,_13){var _14=on(_10,_11,function(){_14.remove();return _12.apply(this,arguments);});return _14;};on.parse=function(_15,_16,_17,_18,_19,_1a){if(_16.call){return _16.call(_1a,_15,_17);}if(_16.indexOf(",")>-1){var _1b=_16.split(/\s*,\s*/);var _1c=[];var i=0;var _1d;while(_1d=_1b[i++]){_1c.push(_18(_15,_1d,_17,_19,_1a));}_1c.remove=function(){for(var i=0;i<_1c.length;i++){_1c[i].remove();}};return _1c;}return _18(_15,_16,_17,_19,_1a);};var _1e=/^touch/;function _9(_1f,_20,_21,_22,_23){var _24=_20.match(/(.*):(.*)/);if(_24){_20=_24[2];_24=_24[1];return on.selector(_24,_20).call(_23,_1f,_21);}if(_3("touch")){if(_1e.test(_20)){_21=_25(_21);}if(!_3("event-orientationchange")&&(_20=="orientationchange")){_20="resize";_1f=window;_21=_25(_21);}}if(_1f.addEventListener){var _26=_20 in _27;_1f.addEventListener(_26?_27[_20]:_20,_21,_26);return {remove:function(){_1f.removeEventListener(_20,_21,_26);}};}_20="on"+_20;if(_28&&_1f.attachEvent){return _28(_1f,_20,_21);}throw new Error("Target must be an event emitter");};on.selector=function(_29,_2a,_2b){return function(_2c,_2d){var _2e=this;var _2f=_2a.bubble;if(_2f){_2a=_2f;}else{if(_2b!==false){_2b=true;}}return on(_2c,_2a,function(_30){var _31=_30.target;_2e=_2e&&_2e.matches?_2e:_2.query;while(!_2e.matches(_31,_29,_2c)){if(_31==_2c||!_2b||!(_31=_31.parentNode)){return;}}return _2d.call(_31,_30);});};};function _32(){this.cancelable=false;};function _33(){this.bubbles=false;};var _34=[].slice,_35=on.emit=function(_36,_37,_38){var _39=_34.call(arguments,2);var _3a="on"+_37;if("parentNode" in _36){var _3b=_39[0]={};for(var i in _38){_3b[i]=_38[i];}_3b.preventDefault=_32;_3b.stopPropagation=_33;_3b.target=_36;_3b.type=_37;_38=_3b;}do{_36[_3a]&&_36[_3a].apply(_36,_39);}while(_38&&_38.bubbles&&(_36=_36.parentNode));return _38&&_38.cancelable&&_38;};var _27={};if(_3("dom-addeventlistener")){_27={focusin:"focus",focusout:"blur"};if(_3("opera")){_27.keydown="keypress";}on.emit=function(_3c,_3d,_3e){if(_3c.dispatchEvent&&document.createEvent){var _3f=document.createEvent("HTMLEvents");_3f.initEvent(_3d,!!_3e.bubbles,!!_3e.cancelable);for(var i in _3e){var _40=_3e[i];if(!(i in _3f)){_3f[i]=_3e[i];}}return _3c.dispatchEvent(_3f)&&_3f;}return _35.apply(on,arguments);};}else{on._fixEvent=function(evt,_41){if(!evt){var w=_41&&(_41.ownerDocument||_41.document||_41).parentWindow||window;evt=w.event;}if(!evt){return (evt);}if(!evt.target){evt.target=evt.srcElement;evt.currentTarget=(_41||evt.srcElement);if(evt.type=="mouseover"){evt.relatedTarget=evt.fromElement;}if(evt.type=="mouseout"){evt.relatedTarget=evt.toElement;}if(!evt.stopPropagation){evt.stopPropagation=_42;evt.preventDefault=_43;}switch(evt.type){case "keypress":var c=("charCode" in evt?evt.charCode:evt.keyCode);if(c==10){c=0;evt.keyCode=13;}else{if(c==13||c==27){c=0;}else{if(c==3){c=99;}}}evt.charCode=c;_44(evt);break;}}return evt;};var _45=function(_46){this.handle=_46;};_45.prototype.remove=function(){delete _dojoIEListeners_[this.handle];};var _47=function(_48){return function(evt){evt=on._fixEvent(evt,this);return _48.call(this,evt);};};var _28=function(_49,_4a,_4b){_4b=_47(_4b);if(((_49.ownerDocument?_49.ownerDocument.parentWindow:_49.parentWindow||_49.window||window)!=top||_3("jscript")<5.8)&&!_3("config-_allow_leaks")){if(typeof _dojoIEListeners_=="undefined"){_dojoIEListeners_=[];}var _4c=_49[_4a];if(!_4c||!_4c.listeners){var _4d=_4c;_49[_4a]=_4c=Function("event","var callee = arguments.callee; for(var i = 0; i<callee.listeners.length; i++){var listener = _dojoIEListeners_[callee.listeners[i]]; if(listener){listener.call(this,event);}}");_4c.listeners=[];_4c.global=this;if(_4d){_4c.listeners.push(_dojoIEListeners_.push(_4d)-1);}}var _4e;_4c.listeners.push(_4e=(_4c.global._dojoIEListeners_.push(_4b)-1));return new _45(_4e);}return _1.after(_49,_4a,_4b,true);};var _44=function(evt){evt.keyChar=evt.charCode?String.fromCharCode(evt.charCode):"";evt.charOrCode=evt.keyChar||evt.keyCode;};var _42=function(){this.cancelBubble=true;};var _43=on._preventDefault=function(){this.bubbledKeyCode=this.keyCode;if(this.ctrlKey){try{this.keyCode=0;}catch(e){}}this.returnValue=false;};}if(_3("touch")){var _4f=function(){};var _50=window.orientation;var _25=function(_51){return function(_52){var _53=_52.corrected;if(!_53){var _54=_52.type;try{delete _52.type;}catch(e){}if(_52.type){_4f.prototype=_52;var _53=new _4f;_53.preventDefault=function(){_52.preventDefault();};_53.stopPropagation=function(){_52.stopPropagation();};}else{_53=_52;_53.type=_54;}_52.corrected=_53;if(_54=="resize"){if(_50==window.orientation){return null;}_50=window.orientation;_53.type="orientationchange";return _51.call(this,_53);}if(!("rotation" in _53)){_53.rotation=0;_53.scale=1;}var _55=_53.changedTouches[0];for(var i in _55){delete _53[i];_53[i]=_55[i];}}return _51.call(this,_53);};};}return on;}); \ No newline at end of file diff --git a/lib/dojo/on.js.uncompressed.js b/lib/dojo/on.js.uncompressed.js new file mode 100644 index 00000000..2d4af3ca --- /dev/null +++ b/lib/dojo/on.js.uncompressed.js @@ -0,0 +1,474 @@ +define("dojo/on", ["./has!dom-addeventlistener?:./aspect", "./_base/kernel", "./has"], function(aspect, dojo, has){ + // summary: + // The export of this module is a function that provides core event listening functionality. With this function + // you can provide a target, event type, and listener to be notified of + // future matching events that are fired. + // target: Element|Object + // This is the target object or DOM element that to receive events from + // type: String|Function + // This is the name of the event to listen for or an extension event type. + // listener: Function + // This is the function that should be called when the event fires. + // returns: Object + // An object with a remove() method that can be used to stop listening for this + // event. + // description: + // To listen for "click" events on a button node, we can do: + // | define(["dojo/on"], function(listen){ + // | on(button, "click", clickHandler); + // | ... + // Evented JavaScript objects can also have their own events. + // | var obj = new Evented; + // | on(obj, "foo", fooHandler); + // And then we could publish a "foo" event: + // | on.emit(obj, "foo", {key: "value"}); + // We can use extension events as well. For example, you could listen for a tap gesture: + // | define(["dojo/on", "dojo/gesture/tap", function(listen, tap){ + // | on(button, tap, tapHandler); + // | ... + // which would trigger fooHandler. Note that for a simple object this is equivalent to calling: + // | obj.onfoo({key:"value"}); + // If you use on.emit on a DOM node, it will use native event dispatching when possible. + + "use strict"; + if(1){ // check to make sure we are in a browser, this module should work anywhere + var major = window.ScriptEngineMajorVersion; + has.add("jscript", major && (major() + ScriptEngineMinorVersion() / 10)); + has.add("event-orientationchange", has("touch") && !has("android")); // TODO: how do we detect this? + } + var on = function(target, type, listener, dontFix){ + if(target.on){ + // delegate to the target's on() method, so it can handle it's own listening if it wants + return target.on(type, listener); + } + // delegate to main listener code + return on.parse(target, type, listener, addListener, dontFix, this); + }; + on.pausable = function(target, type, listener, dontFix){ + // summary: + // This function acts the same as on(), but with pausable functionality. The + // returned signal object has pause() and resume() functions. Calling the + // pause() method will cause the listener to not be called for future events. Calling the + // resume() method will cause the listener to again be called for future events. + var paused; + var signal = on(target, type, function(){ + if(!paused){ + return listener.apply(this, arguments); + } + }, dontFix); + signal.pause = function(){ + paused = true; + }; + signal.resume = function(){ + paused = false; + }; + return signal; + }; + on.once = function(target, type, listener, dontFix){ + // summary: + // This function acts the same as on(), but will only call the listener once. The + // listener will be called for the first + // event that takes place and then listener will automatically be removed. + var signal = on(target, type, function(){ + // remove this listener + signal.remove(); + // proceed to call the listener + return listener.apply(this, arguments); + }); + return signal; + }; + on.parse = function(target, type, listener, addListener, dontFix, matchesTarget){ + if(type.call){ + // event handler function + // on(node, dojo.touch.press, touchListener); + return type.call(matchesTarget, target, listener); + } + + if(type.indexOf(",") > -1){ + // we allow comma delimited event names, so you can register for multiple events at once + var events = type.split(/\s*,\s*/); + var handles = []; + var i = 0; + var eventName; + while(eventName = events[i++]){ + handles.push(addListener(target, eventName, listener, dontFix, matchesTarget)); + } + handles.remove = function(){ + for(var i = 0; i < handles.length; i++){ + handles[i].remove(); + } + }; + return handles; + } + return addListener(target, type, listener, dontFix, matchesTarget) + }; + var touchEvents = /^touch/; + function addListener(target, type, listener, dontFix, matchesTarget){ + // event delegation: + var selector = type.match(/(.*):(.*)/); + // if we have a selector:event, the last one is interpreted as an event, and we use event delegation + if(selector){ + type = selector[2]; + selector = selector[1]; + // create the extension event for selectors and directly call it + return on.selector(selector, type).call(matchesTarget, target, listener); + } + // test to see if it a touch event right now, so we don't have to do it every time it fires + if(has("touch")){ + if(touchEvents.test(type)){ + // touch event, fix it + listener = fixTouchListener(listener); + } + if(!has("event-orientationchange") && (type == "orientationchange")){ + //"orientationchange" not supported <= Android 2.1, + //but works through "resize" on window + type = "resize"; + target = window; + listener = fixTouchListener(listener); + } + } + // normal path, the target is |this| + if(target.addEventListener){ + // the target has addEventListener, which should be used if available (might or might not be a node, non-nodes can implement this method as well) + // check for capture conversions + var capture = type in captures; + target.addEventListener(capture ? captures[type] : type, listener, capture); + // create and return the signal + return { + remove: function(){ + target.removeEventListener(type, listener, capture); + } + }; + } + type = "on" + type; + if(fixAttach && target.attachEvent){ + return fixAttach(target, type, listener); + } + throw new Error("Target must be an event emitter"); + } + + on.selector = function(selector, eventType, children){ + // summary: + // Creates a new extension event with event delegation. This is based on + // the provided event type (can be extension event) that + // only calls the listener when the CSS selector matches the target of the event. + // selector: + // The CSS selector to use for filter events and determine the |this| of the event listener. + // eventType: + // The event to listen for + // children: + // Indicates if children elements of the selector should be allowed. This defaults to + // true (except in the case of normally non-bubbling events like mouse.enter, in which case it defaults to false). + // example: + // define(["dojo/on", "dojo/mouse"], function(listen, mouse){ + // on(node, on.selector(".my-class", mouse.enter), handlerForMyHover); + return function(target, listener){ + var matchesTarget = this; + var bubble = eventType.bubble; + if(bubble){ + // the event type doesn't naturally bubble, but has a bubbling form, use that + eventType = bubble; + }else if(children !== false){ + // for normal bubbling events we default to allowing children of the selector + children = true; + } + return on(target, eventType, function(event){ + var eventTarget = event.target; + // see if we have a valid matchesTarget or default to dojo.query + matchesTarget = matchesTarget && matchesTarget.matches ? matchesTarget : dojo.query; + // there is a selector, so make sure it matches + while(!matchesTarget.matches(eventTarget, selector, target)){ + if(eventTarget == target || !children || !(eventTarget = eventTarget.parentNode)){ // intentional assignment + return; + } + } + return listener.call(eventTarget, event); + }); + }; + }; + + function syntheticPreventDefault(){ + this.cancelable = false; + } + function syntheticStopPropagation(){ + this.bubbles = false; + } + var slice = [].slice, + syntheticDispatch = on.emit = function(target, type, event){ + // summary: + // Fires an event on the target object. + // target: + // The target object to fire the event on. This can be a DOM element or a plain + // JS object. If the target is a DOM element, native event emiting mechanisms + // are used when possible. + // type: + // The event type name. You can emulate standard native events like "click" and + // "mouseover" or create custom events like "open" or "finish". + // event: + // An object that provides the properties for the event. See https://developer.mozilla.org/en/DOM/event.initEvent + // for some of the properties. These properties are copied to the event object. + // Of particular importance are the cancelable and bubbles properties. The + // cancelable property indicates whether or not the event has a default action + // that can be cancelled. The event is cancelled by calling preventDefault() on + // the event object. The bubbles property indicates whether or not the + // event will bubble up the DOM tree. If bubbles is true, the event will be called + // on the target and then each parent successively until the top of the tree + // is reached or stopPropagation() is called. Both bubbles and cancelable + // default to false. + // returns: + // If the event is cancelable and the event is not cancelled, + // emit will return true. If the event is cancelable and the event is cancelled, + // emit will return false. + // details: + // Note that this is designed to emit events for listeners registered through + // dojo/on. It should actually work with any event listener except those + // added through IE's attachEvent (IE8 and below's non-W3C event emiting + // doesn't support custom event types). It should work with all events registered + // through dojo/on. Also note that the emit method does do any default + // action, it only returns a value to indicate if the default action should take + // place. For example, emiting a keypress event would not cause a character + // to appear in a textbox. + // example: + // To fire our own click event + // | on.emit(dojo.byId("button"), "click", { + // | cancelable: true, + // | bubbles: true, + // | screenX: 33, + // | screenY: 44 + // | }); + // We can also fire our own custom events: + // | on.emit(dojo.byId("slider"), "slide", { + // | cancelable: true, + // | bubbles: true, + // | direction: "left-to-right" + // | }); + var args = slice.call(arguments, 2); + var method = "on" + type; + if("parentNode" in target){ + // node (or node-like), create event controller methods + var newEvent = args[0] = {}; + for(var i in event){ + newEvent[i] = event[i]; + } + newEvent.preventDefault = syntheticPreventDefault; + newEvent.stopPropagation = syntheticStopPropagation; + newEvent.target = target; + newEvent.type = type; + event = newEvent; + } + do{ + // call any node which has a handler (note that ideally we would try/catch to simulate normal event propagation but that causes too much pain for debugging) + target[method] && target[method].apply(target, args); + // and then continue up the parent node chain if it is still bubbling (if started as bubbles and stopPropagation hasn't been called) + }while(event && event.bubbles && (target = target.parentNode)); + return event && event.cancelable && event; // if it is still true (was cancelable and was cancelled), return the event to indicate default action should happen + }; + var captures = {}; + if(has("dom-addeventlistener")){ + // normalize focusin and focusout + captures = { + focusin: "focus", + focusout: "blur" + }; + if(has("opera")){ + captures.keydown = "keypress"; // this one needs to be transformed because Opera doesn't support repeating keys on keydown (and keypress works because it incorrectly fires on all keydown events) + } + + // emiter that works with native event handling + on.emit = function(target, type, event){ + if(target.dispatchEvent && document.createEvent){ + // use the native event emiting mechanism if it is available on the target object + // create a generic event + // we could create branch into the different types of event constructors, but + // that would be a lot of extra code, with little benefit that I can see, seems + // best to use the generic constructor and copy properties over, making it + // easy to have events look like the ones created with specific initializers + var nativeEvent = document.createEvent("HTMLEvents"); + nativeEvent.initEvent(type, !!event.bubbles, !!event.cancelable); + // and copy all our properties over + for(var i in event){ + var value = event[i]; + if(!(i in nativeEvent)){ + nativeEvent[i] = event[i]; + } + } + return target.dispatchEvent(nativeEvent) && nativeEvent; + } + return syntheticDispatch.apply(on, arguments); // emit for a non-node + }; + }else{ + // no addEventListener, basically old IE event normalization + on._fixEvent = function(evt, sender){ + // summary: + // normalizes properties on the event object including event + // bubbling methods, keystroke normalization, and x/y positions + // evt: + // native event object + // sender: + // node to treat as "currentTarget" + if(!evt){ + var w = sender && (sender.ownerDocument || sender.document || sender).parentWindow || window; + evt = w.event; + } + if(!evt){return(evt);} + if(!evt.target){ // check to see if it has been fixed yet + evt.target = evt.srcElement; + evt.currentTarget = (sender || evt.srcElement); + if(evt.type == "mouseover"){ + evt.relatedTarget = evt.fromElement; + } + if(evt.type == "mouseout"){ + evt.relatedTarget = evt.toElement; + } + if(!evt.stopPropagation){ + evt.stopPropagation = stopPropagation; + evt.preventDefault = preventDefault; + } + switch(evt.type){ + case "keypress": + var c = ("charCode" in evt ? evt.charCode : evt.keyCode); + if (c==10){ + // CTRL-ENTER is CTRL-ASCII(10) on IE, but CTRL-ENTER on Mozilla + c=0; + evt.keyCode = 13; + }else if(c==13||c==27){ + c=0; // Mozilla considers ENTER and ESC non-printable + }else if(c==3){ + c=99; // Mozilla maps CTRL-BREAK to CTRL-c + } + // Mozilla sets keyCode to 0 when there is a charCode + // but that stops the event on IE. + evt.charCode = c; + _setKeyChar(evt); + break; + } + } + return evt; + }; + var IESignal = function(handle){ + this.handle = handle; + }; + IESignal.prototype.remove = function(){ + delete _dojoIEListeners_[this.handle]; + }; + var fixListener = function(listener){ + // this is a minimal function for closing on the previous listener with as few as variables as possible + return function(evt){ + evt = on._fixEvent(evt, this); + return listener.call(this, evt); + } + } + var fixAttach = function(target, type, listener){ + listener = fixListener(listener); + if(((target.ownerDocument ? target.ownerDocument.parentWindow : target.parentWindow || target.window || window) != top || + has("jscript") < 5.8) && + !has("config-_allow_leaks")){ + // IE will leak memory on certain handlers in frames (IE8 and earlier) and in unattached DOM nodes for JScript 5.7 and below. + // Here we use global redirection to solve the memory leaks + if(typeof _dojoIEListeners_ == "undefined"){ + _dojoIEListeners_ = []; + } + var emiter = target[type]; + if(!emiter || !emiter.listeners){ + var oldListener = emiter; + target[type] = emiter = Function('event', 'var callee = arguments.callee; for(var i = 0; i<callee.listeners.length; i++){var listener = _dojoIEListeners_[callee.listeners[i]]; if(listener){listener.call(this,event);}}'); + emiter.listeners = []; + emiter.global = this; + if(oldListener){ + emiter.listeners.push(_dojoIEListeners_.push(oldListener) - 1); + } + } + var handle; + emiter.listeners.push(handle = (emiter.global._dojoIEListeners_.push(listener) - 1)); + return new IESignal(handle); + } + return aspect.after(target, type, listener, true); + }; + + var _setKeyChar = function(evt){ + evt.keyChar = evt.charCode ? String.fromCharCode(evt.charCode) : ''; + evt.charOrCode = evt.keyChar || evt.keyCode; + }; + // Called in Event scope + var stopPropagation = function(){ + this.cancelBubble = true; + }; + var preventDefault = on._preventDefault = function(){ + // Setting keyCode to 0 is the only way to prevent certain keypresses (namely + // ctrl-combinations that correspond to menu accelerator keys). + // Otoh, it prevents upstream listeners from getting this information + // Try to split the difference here by clobbering keyCode only for ctrl + // combinations. If you still need to access the key upstream, bubbledKeyCode is + // provided as a workaround. + this.bubbledKeyCode = this.keyCode; + if(this.ctrlKey){ + try{ + // squelch errors when keyCode is read-only + // (e.g. if keyCode is ctrl or shift) + this.keyCode = 0; + }catch(e){ + } + } + this.returnValue = false; + }; + } + if(has("touch")){ + var Event = function (){}; + var windowOrientation = window.orientation; + var fixTouchListener = function(listener){ + return function(originalEvent){ + //Event normalization(for ontouchxxx and resize): + //1.incorrect e.pageX|pageY in iOS + //2.there are no "e.rotation", "e.scale" and "onorientationchange" in Andriod + //3.More TBD e.g. force | screenX | screenX | clientX | clientY | radiusX | radiusY + + // see if it has already been corrected + var event = originalEvent.corrected; + if(!event){ + var type = originalEvent.type; + try{ + delete originalEvent.type; // on some JS engines (android), deleting properties make them mutable + }catch(e){} + if(originalEvent.type){ + // deleting properties doesn't work (older iOS), have to use delegation + Event.prototype = originalEvent; + var event = new Event; + // have to delegate methods to make them work + event.preventDefault = function(){ + originalEvent.preventDefault(); + }; + event.stopPropagation = function(){ + originalEvent.stopPropagation(); + }; + }else{ + // deletion worked, use property as is + event = originalEvent; + event.type = type; + } + originalEvent.corrected = event; + if(type == 'resize'){ + if(windowOrientation == window.orientation){ + return null;//double tap causes an unexpected 'resize' in Andriod + } + windowOrientation = window.orientation; + event.type = "orientationchange"; + return listener.call(this, event); + } + // We use the original event and augment, rather than doing an expensive mixin operation + if(!("rotation" in event)){ // test to see if it has rotation + event.rotation = 0; + event.scale = 1; + } + //use event.changedTouches[0].pageX|pageY|screenX|screenY|clientX|clientY|target + var firstChangeTouch = event.changedTouches[0]; + for(var i in firstChangeTouch){ // use for-in, we don't need to have dependency on dojo/_base/lang here + delete event[i]; // delete it first to make it mutable + event[i] = firstChangeTouch[i]; + } + } + return listener.call(this, event); + }; + }; + } + return on; +}); diff --git a/lib/dojo/package.json b/lib/dojo/package.json index 5855be51..88c2a655 100644 --- a/lib/dojo/package.json +++ b/lib/dojo/package.json @@ -1,21 +1,23 @@ { - "name": "dojo", - "directories": { - "lib": "." - }, - "main":"./lib/main-browser", - "description": "Dojo core is a powerful, lightweight library that makes common tasks quicker and easier. Animate elements, manipulate the DOM, and query with easy CSS syntax, all without sacrificing performance.", - "licenses": [ - { - "type": "AFLv2.1", - "url": "http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE#L43" - }, - { - "type": "BSD", - "url": "http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE#L13" - } - ], - "bugs": "http://bugs.dojotoolkit.org/", - "keywords": ["JavaScript", "Dojo", "Toolkit"], - "homepage": "http://dojotoolkit.org/" -} \ No newline at end of file + "name": "dojo", + "version":"1.7.3", + "directories": { + "lib": "." + }, + "main": "main", + "description": "Dojo core is a powerful, lightweight library that makes common tasks quicker and easier. Animate elements, manipulate the DOM, and query with easy CSS syntax, all without sacrificing performance.", + "licenses": [ + { + "type": "AFLv2.1", + "url": "http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE#L43" + }, + { + "type": "BSD", + "url": "http://trac.dojotoolkit.org/browser/dojo/trunk/LICENSE#L13" + } + ], + "bugs": "http://bugs.dojotoolkit.org/", + "keywords": ["JavaScript", "Dojo", "Toolkit"], + "homepage": "http://dojotoolkit.org/", + "dojoBuild": "dojo.profile.js" +} diff --git a/lib/dojo/parser.js b/lib/dojo/parser.js index bd52030e..a8c5428b 100644 --- a/lib/dojo/parser.js +++ b/lib/dojo/parser.js @@ -4,559 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.parser"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.parser"] = true; -dojo.provide("dojo.parser"); -dojo.require("dojo.date.stamp"); - - -new Date("X"); // workaround for #11279, new Date("") == NaN - -dojo.parser = new function(){ - // summary: - // The Dom/Widget parsing package - - var d = dojo; - - function val2type(/*Object*/ value){ - // summary: - // Returns name of type of given value. - - if(d.isString(value)){ return "string"; } - if(typeof value == "number"){ return "number"; } - if(typeof value == "boolean"){ return "boolean"; } - if(d.isFunction(value)){ return "function"; } - if(d.isArray(value)){ return "array"; } // typeof [] == "object" - if(value instanceof Date) { return "date"; } // assume timestamp - if(value instanceof d._Url){ return "url"; } - return "object"; - } - - function str2obj(/*String*/ value, /*String*/ type){ - // summary: - // Convert given string value to given type - switch(type){ - case "string": - return value; - case "number": - return value.length ? Number(value) : NaN; - case "boolean": - // for checked/disabled value might be "" or "checked". interpret as true. - return typeof value == "boolean" ? value : !(value.toLowerCase()=="false"); - case "function": - if(d.isFunction(value)){ - // IE gives us a function, even when we say something like onClick="foo" - // (in which case it gives us an invalid function "function(){ foo }"). - // Therefore, convert to string - value=value.toString(); - value=d.trim(value.substring(value.indexOf('{')+1, value.length-1)); - } - try{ - if(value === "" || value.search(/[^\w\.]+/i) != -1){ - // The user has specified some text for a function like "return x+5" - return new Function(value); - }else{ - // The user has specified the name of a function like "myOnClick" - // or a single word function "return" - return d.getObject(value, false) || new Function(value); - } - }catch(e){ return new Function(); } - case "array": - return value ? value.split(/\s*,\s*/) : []; - case "date": - switch(value){ - case "": return new Date(""); // the NaN of dates - case "now": return new Date(); // current date - default: return d.date.stamp.fromISOString(value); - } - case "url": - return d.baseUrl + value; - default: - return d.fromJson(value); - } - } - - var dummyClass = {}, instanceClasses = { - // map from fully qualified name (like "dijit.Button") to structure like - // { cls: dijit.Button, params: {label: "string", disabled: "boolean"} } - }; - - // Widgets like BorderContainer add properties to _Widget via dojo.extend(). - // If BorderContainer is loaded after _Widget's parameter list has been cached, - // we need to refresh that parameter list (for _Widget and all widgets that extend _Widget). - // TODO: remove this in 2.0, when we stop caching parameters. - d.connect(d, "extend", function(){ - instanceClasses = {}; - }); - - function getProtoInfo(cls, params){ - // cls: A prototype - // The prototype of the class to check props on - // params: Object - // The parameters object to mix found parameters onto. - for(var name in cls){ - if(name.charAt(0)=="_"){ continue; } // skip internal properties - if(name in dummyClass){ continue; } // skip "constructor" and "toString" - params[name] = val2type(cls[name]); - } - return params; - } - - function getClassInfo(/*String*/ className, /*Boolean*/ skipParamsLookup){ - // summary: - // Maps a widget name string like "dijit.form.Button" to the widget constructor itself, - // and a list of that widget's parameters and their types - // className: - // fully qualified name (like "dijit.form.Button") - // returns: - // structure like - // { - // cls: dijit.Button, - // params: { label: "string", disabled: "boolean"} - // } - - var c = instanceClasses[className]; - if(!c){ - // get pointer to widget class - var cls = d.getObject(className), params = null; - if(!cls){ return null; } // class not defined [yet] - if(!skipParamsLookup){ // from fastpath, we don't need to lookup the attrs on the proto because they are explicit - params = getProtoInfo(cls.prototype, {}) - } - c = { cls: cls, params: params }; - - }else if(!skipParamsLookup && !c.params){ - // if we're calling getClassInfo and have a cls proto, but no params info, scan that cls for params now - // and update the pointer in instanceClasses[className]. This happens when a widget appears in another - // widget's template which still uses dojoType, but an instance of the widget appears prior with a data-dojo-type, - // skipping this lookup the first time. - c.params = getProtoInfo(c.cls.prototype, {}); - } - - return c; - } - - this._functionFromScript = function(script, attrData){ - // summary: - // Convert a <script type="dojo/method" args="a, b, c"> ... </script> - // into a function - // script: DOMNode - // The <script> DOMNode - // attrData: String - // For HTML5 compliance, searches for attrData + "args" (typically - // "data-dojo-args") instead of "args" - var preamble = ""; - var suffix = ""; - var argsStr = (script.getAttribute(attrData + "args") || script.getAttribute("args")); - if(argsStr){ - d.forEach(argsStr.split(/\s*,\s*/), function(part, idx){ - preamble += "var "+part+" = arguments["+idx+"]; "; - }); - } - var withStr = script.getAttribute("with"); - if(withStr && withStr.length){ - d.forEach(withStr.split(/\s*,\s*/), function(part){ - preamble += "with("+part+"){"; - suffix += "}"; - }); - } - return new Function(preamble+script.innerHTML+suffix); - }; - - this.instantiate = function(/* Array */nodes, /* Object? */mixin, /* Object? */args){ - // summary: - // Takes array of nodes, and turns them into class instances and - // potentially calls a startup method to allow them to connect with - // any children. - // nodes: Array - // Array of nodes or objects like - // | { - // | type: "dijit.form.Button", - // | node: DOMNode, - // | scripts: [ ... ], // array of <script type="dojo/..."> children of node - // | inherited: { ... } // settings inherited from ancestors like dir, theme, etc. - // | } - // mixin: Object? - // An object that will be mixed in with each node in the array. - // Values in the mixin will override values in the node, if they - // exist. - // args: Object? - // An object used to hold kwArgs for instantiation. - // See parse.args argument for details. - - var thelist = [], - mixin = mixin||{}; - args = args||{}; - - // TODO: for 2.0 default to data-dojo- regardless of scopeName (or maybe scopeName won't exist in 2.0) - var attrName = (args.scope || d._scopeName) + "Type", // typically "dojoType" - attrData = "data-" + (args.scope || d._scopeName) + "-"; // typically "data-dojo-" - - d.forEach(nodes, function(obj){ - if(!obj){ return; } - - // Get pointers to DOMNode, dojoType string, and clsInfo (metadata about the dojoType), etc. - var node, type, clsInfo, clazz, scripts, fastpath; - if(obj.node){ - // new format of nodes[] array, object w/lots of properties pre-computed for me - node = obj.node; - type = obj.type; - fastpath = obj.fastpath; - clsInfo = obj.clsInfo || (type && getClassInfo(type, fastpath)); - clazz = clsInfo && clsInfo.cls; - scripts = obj.scripts; - }else{ - // old (backwards compatible) format of nodes[] array, simple array of DOMNodes. no fastpath/data-dojo-type support here. - node = obj; - type = attrName in mixin ? mixin[attrName] : node.getAttribute(attrName); - clsInfo = type && getClassInfo(type); - clazz = clsInfo && clsInfo.cls; - scripts = (clazz && (clazz._noScript || clazz.prototype._noScript) ? [] : - d.query("> script[type^='dojo/']", node)); - } - if(!clsInfo){ - throw new Error("Could not load class '" + type); - } - - // Setup hash to hold parameter settings for this widget. Start with the parameter - // settings inherited from ancestors ("dir" and "lang"). - // Inherited setting may later be overridden by explicit settings on node itself. - var params = {}; - - if(args.defaults){ - // settings for the document itself (or whatever subtree is being parsed) - d._mixin(params, args.defaults); - } - if(obj.inherited){ - // settings from dir=rtl or lang=... on a node above this node - d._mixin(params, obj.inherited); - } - - // mix things found in data-dojo-props into the params - if(fastpath){ - var extra = node.getAttribute(attrData + "props"); - if(extra && extra.length){ - try{ - extra = d.fromJson.call(args.propsThis, "{" + extra + "}"); - d._mixin(params, extra); - }catch(e){ - // give the user a pointer to their invalid parameters. FIXME: can we kill this in production? - throw new Error(e.toString() + " in data-dojo-props='" + extra + "'"); - } - } - - // For the benefit of _Templated, check if node has data-dojo-attach-point/data-dojo-attach-event - // and mix those in as though they were parameters - var attachPoint = node.getAttribute(attrData + "attach-point"); - if(attachPoint){ - params.dojoAttachPoint = attachPoint; - } - var attachEvent = node.getAttribute(attrData + "attach-event"); - if(attachEvent){ - params.dojoAttachEvent = attachEvent; - } - dojo.mixin(params, mixin); - }else{ - // FIXME: we need something like "deprecateOnce()" to throw dojo.deprecation for something. - // remove this logic in 2.0 - // read parameters (ie, attributes) specified on DOMNode - - var attributes = node.attributes; - - // clsInfo.params lists expected params like {"checked": "boolean", "n": "number"} - for(var name in clsInfo.params){ - var item = name in mixin ? { value:mixin[name], specified:true } : attributes.getNamedItem(name); - if(!item || (!item.specified && (!dojo.isIE || name.toLowerCase()!="value"))){ continue; } - var value = item.value; - // Deal with IE quirks for 'class' and 'style' - switch(name){ - case "class": - value = "className" in mixin ? mixin.className : node.className; - break; - case "style": - value = "style" in mixin ? mixin.style : (node.style && node.style.cssText); // FIXME: Opera? - } - var _type = clsInfo.params[name]; - if(typeof value == "string"){ - params[name] = str2obj(value, _type); - }else{ - params[name] = value; - } - } - } - - // Process <script type="dojo/*"> script tags - // <script type="dojo/method" event="foo"> tags are added to params, and passed to - // the widget on instantiation. - // <script type="dojo/method"> tags (with no event) are executed after instantiation - // <script type="dojo/connect" event="foo"> tags are dojo.connected after instantiation - // note: dojo/* script tags cannot exist in self closing widgets, like <input /> - var connects = [], // functions to connect after instantiation - calls = []; // functions to call after instantiation - - d.forEach(scripts, function(script){ - node.removeChild(script); - // FIXME: drop event="" support in 2.0. use data-dojo-event="" instead - var event = (script.getAttribute(attrData + "event") || script.getAttribute("event")), - type = script.getAttribute("type"), - nf = d.parser._functionFromScript(script, attrData); - if(event){ - if(type == "dojo/connect"){ - connects.push({event: event, func: nf}); - }else{ - params[event] = nf; - } - }else{ - calls.push(nf); - } - }); - - var markupFactory = clazz.markupFactory || clazz.prototype && clazz.prototype.markupFactory; - // create the instance - var instance = markupFactory ? markupFactory(params, node, clazz) : new clazz(params, node); - thelist.push(instance); - - // map it to the JS namespace if that makes sense - // FIXME: in 2.0, drop jsId support. use data-dojo-id instead - var jsname = (node.getAttribute(attrData + "id") || node.getAttribute("jsId")); - if(jsname){ - d.setObject(jsname, instance); - } - - // process connections and startup functions - d.forEach(connects, function(connect){ - d.connect(instance, connect.event, null, connect.func); - }); - d.forEach(calls, function(func){ - func.call(instance); - }); - }); - - // Call startup on each top level instance if it makes sense (as for - // widgets). Parent widgets will recursively call startup on their - // (non-top level) children - if(!mixin._started){ - // TODO: for 2.0, when old instantiate() API is desupported, store parent-child - // relationships in the nodes[] array so that no getParent() call is needed. - // Note that will require a parse() call from ContentPane setting a param that the - // ContentPane is the parent widget (so that the parse doesn't call startup() on the - // ContentPane's children) - d.forEach(thelist, function(instance){ - if( !args.noStart && instance && - dojo.isFunction(instance.startup) && - !instance._started && - (!instance.getParent || !instance.getParent()) - ){ - instance.startup(); - } - }); - } - return thelist; - }; - - this.parse = function(rootNode, args){ - // summary: - // Scan the DOM for class instances, and instantiate them. - // - // description: - // Search specified node (or root node) recursively for class instances, - // and instantiate them. Searches for either data-dojo-type="Class" or - // dojoType="Class" where "Class" is a a fully qualified class name, - // like `dijit.form.Button` - // - // Using `data-dojo-type`: - // Attributes using can be mixed into the parameters used to instantitate the - // Class by using a `data-dojo-props` attribute on the node being converted. - // `data-dojo-props` should be a string attribute to be converted from JSON. - // - // Using `dojoType`: - // Attributes are read from the original domNode and converted to appropriate - // types by looking up the Class prototype values. This is the default behavior - // from Dojo 1.0 to Dojo 1.5. `dojoType` support is deprecated, and will - // go away in Dojo 2.0. - // - // rootNode: DomNode? - // A default starting root node from which to start the parsing. Can be - // omitted, defaulting to the entire document. If omitted, the `args` - // object can be passed in this place. If the `args` object has a - // `rootNode` member, that is used. - // - // args: Object - // a kwArgs object passed along to instantiate() - // - // * noStart: Boolean? - // when set will prevent the parser from calling .startup() - // when locating the nodes. - // * rootNode: DomNode? - // identical to the function's `rootNode` argument, though - // allowed to be passed in via this `args object. - // * template: Boolean - // If true, ignores ContentPane's stopParser flag and parses contents inside of - // a ContentPane inside of a template. This allows dojoAttachPoint on widgets/nodes - // nested inside the ContentPane to work. - // * inherited: Object - // Hash possibly containing dir and lang settings to be applied to - // parsed widgets, unless there's another setting on a sub-node that overrides - // * scope: String - // 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.) - // * propsThis: Object - // If specified, "this" referenced from data-dojo-props will refer to propsThis. - // Intended for use from the widgets-in-template feature of `dijit._Templated` - // - // example: - // Parse all widgets on a page: - // | dojo.parser.parse(); - // - // example: - // Parse all classes within the node with id="foo" - // | dojo.parser.parse(dojo.byId('foo')); - // - // example: - // Parse all classes in a page, but do not call .startup() on any - // child - // | dojo.parser.parse({ noStart: true }) - // - // example: - // Parse all classes in a node, but do not call .startup() - // | dojo.parser.parse(someNode, { noStart:true }); - // | // or - // | dojo.parser.parse({ noStart:true, rootNode: someNode }); - - // determine the root node based on the passed arguments. - var root; - if(!args && rootNode && rootNode.rootNode){ - args = rootNode; - root = args.rootNode; - }else{ - root = rootNode; - } - root = root ? dojo.byId(root) : dojo.body(); - args = args || {}; - - var attrName = (args.scope || d._scopeName) + "Type", // typically "dojoType" - attrData = "data-" + (args.scope || d._scopeName) + "-"; // typically "data-dojo-" - - function scan(parent, list){ - // summary: - // Parent is an Object representing a DOMNode, with or without a dojoType specified. - // Scan parent's children looking for nodes with dojoType specified, storing in list[]. - // If parent has a dojoType, also collects <script type=dojo/*> children and stores in parent.scripts[]. - // parent: Object - // Object representing the parent node, like - // | { - // | node: DomNode, // scan children of this node - // | inherited: {dir: "rtl"}, // dir/lang setting inherited from above node - // | - // | // attributes only set if node has dojoType specified - // | scripts: [], // empty array, put <script type=dojo/*> in here - // | clsInfo: { cls: dijit.form.Button, ...} - // | } - // list: DomNode[] - // Output array of objects (same format as parent) representing nodes to be turned into widgets - - // Effective dir and lang settings on parent node, either set directly or inherited from grandparent - var inherited = dojo.clone(parent.inherited); - dojo.forEach(["dir", "lang"], function(name){ - // TODO: what if this is a widget and dir/lang are declared in data-dojo-props? - var val = parent.node.getAttribute(name); - if(val){ - inherited[name] = val; - } - }); - - // if parent is a widget, then search for <script type=dojo/*> tags and put them in scripts[]. - var scripts = parent.clsInfo && !parent.clsInfo.cls.prototype._noScript ? parent.scripts : null; - - // unless parent is a widget with the stopParser flag set, continue search for dojoType, recursively - var recurse = (!parent.clsInfo || !parent.clsInfo.cls.prototype.stopParser) || (args && args.template); - - // scan parent's children looking for dojoType and <script type=dojo/*> - for(var child = parent.node.firstChild; child; child = child.nextSibling){ - if(child.nodeType == 1){ - // FIXME: desupport dojoType in 2.0. use data-dojo-type instead - var type, html5 = recurse && child.getAttribute(attrData + "type"); - if(html5){ - type = html5; - }else{ - // fallback to backward compatible mode, using dojoType. remove in 2.0 - type = recurse && child.getAttribute(attrName); - } - - var fastpath = html5 == type; - - if(type){ - // if dojoType/data-dojo-type specified, add to output array of nodes to instantiate - var params = { - "type": type, - fastpath: fastpath, - clsInfo: getClassInfo(type, fastpath), // note: won't find classes declared via dojo.Declaration - node: child, - scripts: [], // <script> nodes that are parent's children - inherited: inherited // dir & lang attributes inherited from parent - }; - list.push(params); - - // Recurse, collecting <script type="dojo/..."> children, and also looking for - // descendant nodes with dojoType specified (unless the widget has the stopParser flag), - scan(params, list); - }else if(scripts && child.nodeName.toLowerCase() == "script"){ - // if <script type="dojo/...">, save in scripts[] - type = child.getAttribute("type"); - if (type && /^dojo\/\w/i.test(type)) { - scripts.push(child); - } - }else if(recurse){ - // Recurse, looking for grandchild nodes with dojoType specified - scan({ - node: child, - inherited: inherited - }, list); - } - } - } - } - - // Ignore bogus entries in inherited hash like {dir: ""} - var inherited = {}; - if(args && args.inherited){ - for(var key in args.inherited){ - if(args.inherited[key]){ inherited[key] = args.inherited[key]; } - } - } - - // Make list of all nodes on page w/dojoType specified - var list = []; - scan({ - node: root, - inherited: inherited - }, list); - - // go build the object instances - var mixin = args && args.template ? {template: true} : null; - return this.instantiate(list, mixin, args); // Array - }; -}(); - -//Register the parser callback. It should be the first callback -//after the a11y test. - -(function(){ - var parseRunner = function(){ - if(dojo.config.parseOnLoad){ - dojo.parser.parse(); - } - }; - - // FIXME: need to clobber cross-dependency!! - if(dojo.getObject("dijit.wai.onload") === dojo._loaders[0]){ - dojo._loaders.splice(1, 0, parseRunner); - }else{ - dojo._loaders.unshift(parseRunner); - } -})(); - -} +//>>built +define("dojo/parser",["./_base/kernel","./_base/lang","./_base/array","./_base/html","./_base/window","./_base/url","./_base/json","./aspect","./date/stamp","./query","./on","./ready"],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b){new Date("X");var _c={"dom-attributes-explicit":document.createElement("div").attributes.length<40};function _d(_e){return _c[_e];};_1.parser=new function(){var _f={};function _10(_11){var map={};for(var _12 in _11){if(_12.charAt(0)=="_"){continue;}map[_12.toLowerCase()]=_12;}return map;};_8.after(_2,"extend",function(){_f={};},true);var _13={};this._functionFromScript=function(_14,_15){var _16="";var _17="";var _18=(_14.getAttribute(_15+"args")||_14.getAttribute("args"));if(_18){_3.forEach(_18.split(/\s*,\s*/),function(_19,idx){_16+="var "+_19+" = arguments["+idx+"]; ";});}var _1a=_14.getAttribute("with");if(_1a&&_1a.length){_3.forEach(_1a.split(/\s*,\s*/),function(_1b){_16+="with("+_1b+"){";_17+="}";});}return new Function(_16+_14.innerHTML+_17);};this.instantiate=function(_1c,_1d,_1e){var _1f=[],_1d=_1d||{};_1e=_1e||{};var _20=(_1e.scope||_1._scopeName)+"Type",_21="data-"+(_1e.scope||_1._scopeName)+"-",_22=_21+"type",_23=_21+"props",_24=_21+"attach-point",_25=_21+"attach-event",_26=_21+"id";var _27={};_3.forEach([_23,_22,_20,_26,"jsId",_24,_25,"dojoAttachPoint","dojoAttachEvent","class","style"],function(_28){_27[_28.toLowerCase()]=_28.replace(_1e.scope,"dojo");});_3.forEach(_1c,function(obj){if(!obj){return;}var _29=obj.node||obj,_2a=_20 in _1d?_1d[_20]:obj.node?obj.type:(_29.getAttribute(_22)||_29.getAttribute(_20)),_2b=_13[_2a]||(_13[_2a]=_2.getObject(_2a)),_2c=_2b&&_2b.prototype;if(!_2b){throw new Error("Could not load class '"+_2a);}var _2d={};if(_1e.defaults){_2.mixin(_2d,_1e.defaults);}if(obj.inherited){_2.mixin(_2d,obj.inherited);}var _2e;if(_d("dom-attributes-explicit")){_2e=_29.attributes;}else{var _2f=/^input$|^img$/i.test(_29.nodeName)?_29:_29.cloneNode(false),_30=_2f.outerHTML.replace(/=[^\s"']+|="[^"]*"|='[^']*'/g,"").replace(/^\s*<[a-zA-Z0-9]*/,"").replace(/>.*$/,"");_2e=_3.map(_30.split(/\s+/),function(_31){var _32=_31.toLowerCase();return {name:_31,value:(_29.nodeName=="LI"&&_31=="value")||_32=="enctype"?_29.getAttribute(_32):_29.getAttributeNode(_32).value,specified:true};});}var i=0,_33;while(_33=_2e[i++]){if(!_33||!_33.specified){continue;}var _34=_33.name,_35=_34.toLowerCase(),_36=_33.value;if(_35 in _27){switch(_27[_35]){case "data-dojo-props":var _37=_36;break;case "data-dojo-id":case "jsId":var _38=_36;break;case "data-dojo-attach-point":case "dojoAttachPoint":_2d.dojoAttachPoint=_36;break;case "data-dojo-attach-event":case "dojoAttachEvent":_2d.dojoAttachEvent=_36;break;case "class":_2d["class"]=_29.className;break;case "style":_2d["style"]=_29.style&&_29.style.cssText;break;}}else{if(!(_34 in _2c)){var map=(_f[_2a]||(_f[_2a]=_10(_2c)));_34=map[_35]||_34;}if(_34 in _2c){switch(typeof _2c[_34]){case "string":_2d[_34]=_36;break;case "number":_2d[_34]=_36.length?Number(_36):NaN;break;case "boolean":_2d[_34]=_36.toLowerCase()!="false";break;case "function":if(_36===""||_36.search(/[^\w\.]+/i)!=-1){_2d[_34]=new Function(_36);}else{_2d[_34]=_2.getObject(_36,false)||new Function(_36);}break;default:var _39=_2c[_34];_2d[_34]=(_39&&"length" in _39)?(_36?_36.split(/\s*,\s*/):[]):(_39 instanceof Date)?(_36==""?new Date(""):_36=="now"?new Date():_9.fromISOString(_36)):(_39 instanceof _1._Url)?(_1.baseUrl+_36):_7.fromJson(_36);}}else{_2d[_34]=_36;}}}if(_37){try{_37=_7.fromJson.call(_1e.propsThis,"{"+_37+"}");_2.mixin(_2d,_37);}catch(e){throw new Error(e.toString()+" in data-dojo-props='"+_37+"'");}}_2.mixin(_2d,_1d);var _3a=obj.node?obj.scripts:(_2b&&(_2b._noScript||_2c._noScript)?[]:_a("> script[type^='dojo/']",_29));var _3b=[],_3c=[],_3d=[],on=[];if(_3a){for(i=0;i<_3a.length;i++){var _3e=_3a[i];_29.removeChild(_3e);var _3f=(_3e.getAttribute(_21+"event")||_3e.getAttribute("event")),_40=_3e.getAttribute(_21+"prop"),_2a=_3e.getAttribute("type"),nf=this._functionFromScript(_3e,_21);if(_3f){if(_2a=="dojo/connect"){_3b.push({event:_3f,func:nf});}else{if(_2a=="dojo/on"){on.push({event:_3f,func:nf});}else{_2d[_3f]=nf;}}}else{if(_2a=="dojo/watch"){_3d.push({prop:_40,func:nf});}else{_3c.push(nf);}}}}var _41=_2b.markupFactory||_2c.markupFactory;var _42=_41?_41(_2d,_29,_2b):new _2b(_2d,_29);_1f.push(_42);if(_38){_2.setObject(_38,_42);}for(i=0;i<_3b.length;i++){_8.after(_42,_3b[i].event,_1.hitch(_42,_3b[i].func),true);}for(i=0;i<_3c.length;i++){_3c[i].call(_42);}for(i=0;i<_3d.length;i++){_42.watch(_3d[i].prop,_3d[i].func);}for(i=0;i<on.length;i++){_b(_42,on[i].event,on[i].func);}},this);if(!_1d._started){_3.forEach(_1f,function(_43){if(!_1e.noStart&&_43&&_2.isFunction(_43.startup)&&!_43._started){_43.startup();}});}return _1f;};this.parse=function(_44,_45){var _46;if(!_45&&_44&&_44.rootNode){_45=_44;_46=_45.rootNode;}else{_46=_44;}_46=_46?_4.byId(_46):_5.body();_45=_45||{};var _47=(_45.scope||_1._scopeName)+"Type",_48="data-"+(_45.scope||_1._scopeName)+"-",_49=_48+"type",_4a=_48+"textdir";var _4b=[];var _4c=_46.firstChild;var _4d=_45&&_45.inherited;if(!_4d){function _4e(_4f,_50){return (_4f.getAttribute&&_4f.getAttribute(_50))||(_4f!==_5.doc&&_4f!==_5.doc.documentElement&&_4f.parentNode?_4e(_4f.parentNode,_50):null);};_4d={dir:_4e(_46,"dir"),lang:_4e(_46,"lang"),textDir:_4e(_46,_4a)};for(var key in _4d){if(!_4d[key]){delete _4d[key];}}}var _51={inherited:_4d};var _52;var _53;function _54(_55){if(!_55.inherited){_55.inherited={};var _56=_55.node,_57=_54(_55.parent);var _58={dir:_56.getAttribute("dir")||_57.dir,lang:_56.getAttribute("lang")||_57.lang,textDir:_56.getAttribute(_4a)||_57.textDir};for(var key in _58){if(_58[key]){_55.inherited[key]=_58[key];}}}return _55.inherited;};while(true){if(!_4c){if(!_51||!_51.node){break;}_4c=_51.node.nextSibling;_52=_51.scripts;_53=false;_51=_51.parent;continue;}if(_4c.nodeType!=1){_4c=_4c.nextSibling;continue;}if(_52&&_4c.nodeName.toLowerCase()=="script"){_59=_4c.getAttribute("type");if(_59&&/^dojo\/\w/i.test(_59)){_52.push(_4c);}_4c=_4c.nextSibling;continue;}if(_53){_4c=_4c.nextSibling;continue;}var _59=_4c.getAttribute(_49)||_4c.getAttribute(_47);var _5a=_4c.firstChild;if(!_59&&(!_5a||(_5a.nodeType==3&&!_5a.nextSibling))){_4c=_4c.nextSibling;continue;}var _5b={node:_4c,scripts:_52,parent:_51};var _5c=_59&&(_13[_59]||(_13[_59]=_2.getObject(_59))),_5d=_5c&&!_5c.prototype._noScript?[]:null;if(_59){_4b.push({"type":_59,node:_4c,scripts:_5d,inherited:_54(_5b)});}_4c=_5a;_52=_5d;_53=_5c&&_5c.prototype.stopParser&&!(_45&&_45.template);_51=_5b;}var _5e=_45&&_45.template?{template:true}:null;return this.instantiate(_4b,_5e,_45);};}();if(_1.config.parseOnLoad){_1.ready(100,_1.parser,"parse");}return _1.parser;}); \ No newline at end of file diff --git a/lib/dojo/parser.js.uncompressed.js b/lib/dojo/parser.js.uncompressed.js new file mode 100644 index 00000000..6d340fc2 --- /dev/null +++ b/lib/dojo/parser.js.uncompressed.js @@ -0,0 +1,594 @@ +define( + "dojo/parser", ["./_base/kernel", "./_base/lang", "./_base/array", "./_base/html", "./_base/window", "./_base/url", + "./_base/json", "./aspect", "./date/stamp", "./query", "./on", "./ready"], + function(dojo, dlang, darray, dhtml, dwindow, _Url, djson, aspect, dates, query, don){ + +// module: +// dojo/parser +// summary: +// The Dom/Widget parsing package + +new Date("X"); // workaround for #11279, new Date("") == NaN + +var features = { + // Feature detection for when node.attributes only lists the attributes specified in the markup + // rather than old IE/quirks behavior where it lists every default value too + "dom-attributes-explicit": document.createElement("div").attributes.length < 40 +}; +function has(feature){ + return features[feature]; +} + + +dojo.parser = new function(){ + // summary: + // The Dom/Widget parsing package + + var _nameMap = { + // Map from widget name (ex: "dijit.form.Button") to structure mapping + // lowercase version of attribute names to the version in the widget ex: + // { + // label: "label", + // onclick: "onClick" + // } + }; + function getNameMap(proto){ + // summary: + // Returns map from lowercase name to attribute name in class, ex: {onclick: "onClick"} + var map = {}; + for(var name in proto){ + if(name.charAt(0)=="_"){ continue; } // skip internal properties + map[name.toLowerCase()] = name; + } + return map; + } + // Widgets like BorderContainer add properties to _Widget via dojo.extend(). + // If BorderContainer is loaded after _Widget's parameter list has been cached, + // we need to refresh that parameter list (for _Widget and all widgets that extend _Widget). + aspect.after(dlang, "extend", function(){ + _nameMap = {}; + }, true); + + // Map from widget name (ex: "dijit.form.Button") to constructor + var _ctorMap = {}; + + this._functionFromScript = function(script, attrData){ + // summary: + // Convert a <script type="dojo/method" args="a, b, c"> ... </script> + // into a function + // script: DOMNode + // The <script> DOMNode + // attrData: String + // For HTML5 compliance, searches for attrData + "args" (typically + // "data-dojo-args") instead of "args" + var preamble = ""; + var suffix = ""; + var argsStr = (script.getAttribute(attrData + "args") || script.getAttribute("args")); + if(argsStr){ + darray.forEach(argsStr.split(/\s*,\s*/), function(part, idx){ + preamble += "var "+part+" = arguments["+idx+"]; "; + }); + } + var withStr = script.getAttribute("with"); + if(withStr && withStr.length){ + darray.forEach(withStr.split(/\s*,\s*/), function(part){ + preamble += "with("+part+"){"; + suffix += "}"; + }); + } + return new Function(preamble+script.innerHTML+suffix); + }; + + this.instantiate = /*====== dojo.parser.instantiate= ======*/function(nodes, mixin, args){ + // summary: + // Takes array of nodes, and turns them into class instances and + // potentially calls a startup method to allow them to connect with + // any children. + // nodes: Array + // Array of nodes or objects like + // | { + // | type: "dijit.form.Button", + // | node: DOMNode, + // | scripts: [ ... ], // array of <script type="dojo/..."> children of node + // | inherited: { ... } // settings inherited from ancestors like dir, theme, etc. + // | } + // mixin: Object? + // An object that will be mixed in with each node in the array. + // Values in the mixin will override values in the node, if they + // exist. + // args: Object? + // An object used to hold kwArgs for instantiation. + // See parse.args argument for details. + + var thelist = [], + mixin = mixin||{}; + args = args||{}; + + // Precompute names of special attributes we are looking for + // TODO: for 2.0 default to data-dojo- regardless of scopeName (or maybe scopeName won't exist in 2.0) + var dojoType = (args.scope || dojo._scopeName) + "Type", // typically "dojoType" + attrData = "data-" + (args.scope || dojo._scopeName) + "-",// typically "data-dojo-" + dataDojoType = attrData + "type", // typically "data-dojo-type" + dataDojoProps = attrData + "props", // typically "data-dojo-props" + dataDojoAttachPoint = attrData + "attach-point", + dataDojoAttachEvent = attrData + "attach-event", + dataDojoId = attrData + "id"; + + // And make hash to quickly check if a given attribute is special, and to map the name to something friendly + var specialAttrs = {}; + darray.forEach([dataDojoProps, dataDojoType, dojoType, dataDojoId, "jsId", dataDojoAttachPoint, + dataDojoAttachEvent, "dojoAttachPoint", "dojoAttachEvent", "class", "style"], function(name){ + specialAttrs[name.toLowerCase()] = name.replace(args.scope, "dojo"); + }); + + darray.forEach(nodes, function(obj){ + if(!obj){ return; } + + var node = obj.node || obj, + type = dojoType in mixin ? mixin[dojoType] : obj.node ? obj.type : (node.getAttribute(dataDojoType) || node.getAttribute(dojoType)), + ctor = _ctorMap[type] || (_ctorMap[type] = dlang.getObject(type)), + proto = ctor && ctor.prototype; + if(!ctor){ + throw new Error("Could not load class '" + type); + } + + // Setup hash to hold parameter settings for this widget. Start with the parameter + // settings inherited from ancestors ("dir" and "lang"). + // Inherited setting may later be overridden by explicit settings on node itself. + var params = {}; + + if(args.defaults){ + // settings for the document itself (or whatever subtree is being parsed) + dlang.mixin(params, args.defaults); + } + if(obj.inherited){ + // settings from dir=rtl or lang=... on a node above this node + dlang.mixin(params, obj.inherited); + } + + // Get list of attributes explicitly listed in the markup + var attributes; + if(has("dom-attributes-explicit")){ + // Standard path to get list of user specified attributes + attributes = node.attributes; + }else{ + // Special path for IE, avoid (sometimes >100) bogus entries in node.attributes + var clone = /^input$|^img$/i.test(node.nodeName) ? node : node.cloneNode(false), + attrs = clone.outerHTML.replace(/=[^\s"']+|="[^"]*"|='[^']*'/g, "").replace(/^\s*<[a-zA-Z0-9]*/, "").replace(/>.*$/, ""); + + attributes = darray.map(attrs.split(/\s+/), function(name){ + var lcName = name.toLowerCase(); + return { + name: name, + // getAttribute() doesn't work for button.value, returns innerHTML of button. + // but getAttributeNode().value doesn't work for the form.encType or li.value + value: (node.nodeName == "LI" && name == "value") || lcName == "enctype" ? + node.getAttribute(lcName) : node.getAttributeNode(lcName).value, + specified: true + }; + }); + } + + // Read in attributes and process them, including data-dojo-props, data-dojo-type, + // dojoAttachPoint, etc., as well as normal foo=bar attributes. + var i=0, item; + while(item = attributes[i++]){ + if(!item || !item.specified){ + continue; + } + + var name = item.name, + lcName = name.toLowerCase(), + value = item.value; + + if(lcName in specialAttrs){ + switch(specialAttrs[lcName]){ + + // Data-dojo-props. Save for later to make sure it overrides direct foo=bar settings + case "data-dojo-props": + var extra = value; + break; + + // data-dojo-id or jsId. TODO: drop jsId in 2.0 + case "data-dojo-id": + case "jsId": + var jsname = value; + break; + + // For the benefit of _Templated + case "data-dojo-attach-point": + case "dojoAttachPoint": + params.dojoAttachPoint = value; + break; + case "data-dojo-attach-event": + case "dojoAttachEvent": + params.dojoAttachEvent = value; + break; + + // Special parameter handling needed for IE + case "class": + params["class"] = node.className; + break; + case "style": + params["style"] = node.style && node.style.cssText; + break; + } + }else{ + // Normal attribute, ex: value="123" + + // Find attribute in widget corresponding to specified name. + // May involve case conversion, ex: onclick --> onClick + if(!(name in proto)){ + var map = (_nameMap[type] || (_nameMap[type] = getNameMap(proto))); + name = map[lcName] || name; + } + + // Set params[name] to value, doing type conversion + if(name in proto){ + switch(typeof proto[name]){ + case "string": + params[name] = value; + break; + case "number": + params[name] = value.length ? Number(value) : NaN; + break; + case "boolean": + // for checked/disabled value might be "" or "checked". interpret as true. + params[name] = value.toLowerCase() != "false"; + break; + case "function": + if(value === "" || value.search(/[^\w\.]+/i) != -1){ + // The user has specified some text for a function like "return x+5" + params[name] = new Function(value); + }else{ + // The user has specified the name of a function like "myOnClick" + // or a single word function "return" + params[name] = dlang.getObject(value, false) || new Function(value); + } + break; + default: + var pVal = proto[name]; + params[name] = + (pVal && "length" in pVal) ? (value ? value.split(/\s*,\s*/) : []) : // array + (pVal instanceof Date) ? + (value == "" ? new Date("") : // the NaN of dates + value == "now" ? new Date() : // current date + dates.fromISOString(value)) : + (pVal instanceof dojo._Url) ? (dojo.baseUrl + value) : + djson.fromJson(value); + } + }else{ + params[name] = value; + } + } + } + + // Mix things found in data-dojo-props into the params, overriding any direct settings + if(extra){ + try{ + extra = djson.fromJson.call(args.propsThis, "{" + extra + "}"); + dlang.mixin(params, extra); + }catch(e){ + // give the user a pointer to their invalid parameters. FIXME: can we kill this in production? + throw new Error(e.toString() + " in data-dojo-props='" + extra + "'"); + } + } + + // Any parameters specified in "mixin" override everything else. + dlang.mixin(params, mixin); + + var scripts = obj.node ? obj.scripts : (ctor && (ctor._noScript || proto._noScript) ? [] : + query("> script[type^='dojo/']", node)); + + // Process <script type="dojo/*"> script tags + // <script type="dojo/method" event="foo"> tags are added to params, and passed to + // the widget on instantiation. + // <script type="dojo/method"> tags (with no event) are executed after instantiation + // <script type="dojo/connect" data-dojo-event="foo"> tags are dojo.connected after instantiation + // <script type="dojo/watch" data-dojo-prop="foo"> tags are dojo.watch after instantiation + // <script type="dojo/on" data-dojo-event="foo"> tags are dojo.on after instantiation + // note: dojo/* script tags cannot exist in self closing widgets, like <input /> + var connects = [], // functions to connect after instantiation + calls = [], // functions to call after instantiation + watch = [], //functions to watch after instantiation + on = []; //functions to on after instantiation + + if(scripts){ + for(i=0; i<scripts.length; i++){ + var script = scripts[i]; + node.removeChild(script); + // FIXME: drop event="" support in 2.0. use data-dojo-event="" instead + var event = (script.getAttribute(attrData + "event") || script.getAttribute("event")), + prop = script.getAttribute(attrData + "prop"), + type = script.getAttribute("type"), + nf = this._functionFromScript(script, attrData); + if(event){ + if(type == "dojo/connect"){ + connects.push({event: event, func: nf}); + }else if(type == "dojo/on"){ + on.push({event: event, func: nf}); + }else{ + params[event] = nf; + } + }else if(type == "dojo/watch"){ + watch.push({prop: prop, func: nf}); + }else{ + calls.push(nf); + } + } + } + + // create the instance + var markupFactory = ctor.markupFactory || proto.markupFactory; + var instance = markupFactory ? markupFactory(params, node, ctor) : new ctor(params, node); + thelist.push(instance); + + // map it to the JS namespace if that makes sense + if(jsname){ + dlang.setObject(jsname, instance); + } + + // process connections and startup functions + for(i=0; i<connects.length; i++){ + aspect.after(instance, connects[i].event, dojo.hitch(instance, connects[i].func), true); + } + for(i=0; i<calls.length; i++){ + calls[i].call(instance); + } + for(i=0; i<watch.length; i++){ + instance.watch(watch[i].prop, watch[i].func); + } + for(i=0; i<on.length; i++){ + don(instance, on[i].event, on[i].func); + } + }, this); + + // Call startup on each top level instance if it makes sense (as for + // widgets). Parent widgets will recursively call startup on their + // (non-top level) children + if(!mixin._started){ + darray.forEach(thelist, function(instance){ + if( !args.noStart && instance && + dlang.isFunction(instance.startup) && + !instance._started + ){ + instance.startup(); + } + }); + } + return thelist; + }; + + this.parse = /*====== dojo.parser.parse= ======*/ function(rootNode, args){ + // summary: + // Scan the DOM for class instances, and instantiate them. + // + // description: + // Search specified node (or root node) recursively for class instances, + // and instantiate them. Searches for either data-dojo-type="Class" or + // dojoType="Class" where "Class" is a a fully qualified class name, + // like `dijit.form.Button` + // + // Using `data-dojo-type`: + // Attributes using can be mixed into the parameters used to instantiate the + // Class by using a `data-dojo-props` attribute on the node being converted. + // `data-dojo-props` should be a string attribute to be converted from JSON. + // + // Using `dojoType`: + // Attributes are read from the original domNode and converted to appropriate + // types by looking up the Class prototype values. This is the default behavior + // from Dojo 1.0 to Dojo 1.5. `dojoType` support is deprecated, and will + // go away in Dojo 2.0. + // + // rootNode: DomNode? + // A default starting root node from which to start the parsing. Can be + // omitted, defaulting to the entire document. If omitted, the `args` + // object can be passed in this place. If the `args` object has a + // `rootNode` member, that is used. + // + // args: Object + // a kwArgs object passed along to instantiate() + // + // * noStart: Boolean? + // when set will prevent the parser from calling .startup() + // when locating the nodes. + // * rootNode: DomNode? + // identical to the function's `rootNode` argument, though + // allowed to be passed in via this `args object. + // * template: Boolean + // If true, ignores ContentPane's stopParser flag and parses contents inside of + // a ContentPane inside of a template. This allows dojoAttachPoint on widgets/nodes + // nested inside the ContentPane to work. + // * inherited: Object + // Hash possibly containing dir and lang settings to be applied to + // parsed widgets, unless there's another setting on a sub-node that overrides + // * scope: String + // 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.) + // * propsThis: Object + // If specified, "this" referenced from data-dojo-props will refer to propsThis. + // Intended for use from the widgets-in-template feature of `dijit._WidgetsInTemplateMixin` + // + // example: + // Parse all widgets on a page: + // | dojo.parser.parse(); + // + // example: + // Parse all classes within the node with id="foo" + // | dojo.parser.parse(dojo.byId('foo')); + // + // example: + // Parse all classes in a page, but do not call .startup() on any + // child + // | dojo.parser.parse({ noStart: true }) + // + // example: + // Parse all classes in a node, but do not call .startup() + // | dojo.parser.parse(someNode, { noStart:true }); + // | // or + // | dojo.parser.parse({ noStart:true, rootNode: someNode }); + + // determine the root node based on the passed arguments. + var root; + if(!args && rootNode && rootNode.rootNode){ + args = rootNode; + root = args.rootNode; + }else{ + root = rootNode; + } + root = root ? dhtml.byId(root) : dwindow.body(); + args = args || {}; + + var dojoType = (args.scope || dojo._scopeName) + "Type", // typically "dojoType" + attrData = "data-" + (args.scope || dojo._scopeName) + "-", // typically "data-dojo-" + dataDojoType = attrData + "type", // typically "data-dojo-type" + dataDojoTextDir = attrData + "textdir"; // typically "data-dojo-textdir" + + // List of all nodes on page w/dojoType specified + var list = []; + + // Info on DOMNode currently being processed + var node = root.firstChild; + + // Info on parent of DOMNode currently being processed + // - inherited: dir, lang, and textDir setting of parent, or inherited by parent + // - parent: pointer to identical structure for my parent (or null if no parent) + // - scripts: if specified, collects <script type="dojo/..."> type nodes from children + var inherited = args && args.inherited; + if(!inherited){ + function findAncestorAttr(node, attr){ + return (node.getAttribute && node.getAttribute(attr)) || + (node !== dwindow.doc && node !== dwindow.doc.documentElement && node.parentNode ? findAncestorAttr(node.parentNode, attr) : null); + } + inherited = { + dir: findAncestorAttr(root, "dir"), + lang: findAncestorAttr(root, "lang"), + textDir: findAncestorAttr(root, dataDojoTextDir) + }; + for(var key in inherited){ + if(!inherited[key]){ delete inherited[key]; } + } + } + var parent = { + inherited: inherited + }; + + // For collecting <script type="dojo/..."> type nodes (when null, we don't need to collect) + var scripts; + + // when true, only look for <script type="dojo/..."> tags, and don't recurse to children + var scriptsOnly; + + function getEffective(parent){ + // summary: + // Get effective dir, lang, textDir settings for specified obj + // (matching "parent" object structure above), and do caching. + // Take care not to return null entries. + if(!parent.inherited){ + parent.inherited = {}; + var node = parent.node, + grandparent = getEffective(parent.parent); + var inherited = { + dir: node.getAttribute("dir") || grandparent.dir, + lang: node.getAttribute("lang") || grandparent.lang, + textDir: node.getAttribute(dataDojoTextDir) || grandparent.textDir + }; + for(var key in inherited){ + if(inherited[key]){ + parent.inherited[key] = inherited[key]; + } + } + } + return parent.inherited; + } + + // DFS on DOM tree, collecting nodes with data-dojo-type specified. + while(true){ + if(!node){ + // Finished this level, continue to parent's next sibling + if(!parent || !parent.node){ + break; + } + node = parent.node.nextSibling; + scripts = parent.scripts; + scriptsOnly = false; + parent = parent.parent; + continue; + } + + if(node.nodeType != 1){ + // Text or comment node, skip to next sibling + node = node.nextSibling; + continue; + } + + if(scripts && node.nodeName.toLowerCase() == "script"){ + // Save <script type="dojo/..."> for parent, then continue to next sibling + type = node.getAttribute("type"); + if(type && /^dojo\/\w/i.test(type)){ + scripts.push(node); + } + node = node.nextSibling; + continue; + } + if(scriptsOnly){ + node = node.nextSibling; + continue; + } + + // Check for data-dojo-type attribute, fallback to backward compatible dojoType + var type = node.getAttribute(dataDojoType) || node.getAttribute(dojoType); + + // Short circuit for leaf nodes containing nothing [but text] + var firstChild = node.firstChild; + if(!type && (!firstChild || (firstChild.nodeType == 3 && !firstChild.nextSibling))){ + node = node.nextSibling; + continue; + } + + // Setup data structure to save info on current node for when we return from processing descendant nodes + var current = { + node: node, + scripts: scripts, + parent: parent + }; + + // If dojoType/data-dojo-type specified, add to output array of nodes to instantiate + var ctor = type && (_ctorMap[type] || (_ctorMap[type] = dlang.getObject(type))), // note: won't find classes declared via dojo.Declaration + childScripts = ctor && !ctor.prototype._noScript ? [] : null; // <script> nodes that are parent's children + if(type){ + list.push({ + "type": type, + node: node, + scripts: childScripts, + inherited: getEffective(current) // dir & lang settings for current node, explicit or inherited + }); + } + + // Recurse, collecting <script type="dojo/..."> children, and also looking for + // descendant nodes with dojoType specified (unless the widget has the stopParser flag). + // When finished with children, go to my next sibling. + node = firstChild; + scripts = childScripts; + scriptsOnly = ctor && ctor.prototype.stopParser && !(args && args.template); + parent = current; + + } + + // go build the object instances + var mixin = args && args.template ? {template: true} : null; + return this.instantiate(list, mixin, args); // Array + }; +}(); + + +//Register the parser callback. It should be the first callback +//after the a11y test. +if(dojo.config.parseOnLoad){ + dojo.ready(100, dojo.parser, "parse"); +} + +return dojo.parser; +}); diff --git a/lib/dojo/query.js b/lib/dojo/query.js new file mode 100644 index 00000000..33245dba --- /dev/null +++ b/lib/dojo/query.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/query",["./_base/kernel","./has","./dom","./on","./_base/array","./_base/lang","./selector/_loader","./selector/_loader!default"],function(_1,_2,_3,on,_4,_5,_6,_7){"use strict";_2.add("array-extensible",function(){return _5.delegate([],{length:1}).length==1&&!_2("bug-for-in-skips-shadowed");});var ap=Array.prototype,_8=ap.slice,_9=ap.concat,_a=_4.forEach;var _b=function(a,_c,_d){var _e=new (_d||this._NodeListCtor||nl)(a);return _c?_e._stash(_c):_e;};var _f=function(f,a,o){a=[0].concat(_8.call(a,0));o=o||_1.global;return function(_10){a[0]=_10;return f.apply(o,a);};};var _11=function(f,o){return function(){this.forEach(_f(f,arguments,o));return this;};};var _12=function(f,o){return function(){return this.map(_f(f,arguments,o));};};var _13=function(f,o){return function(){return this.filter(_f(f,arguments,o));};};var _14=function(f,g,o){return function(){var a=arguments,_15=_f(f,a,o);if(g.call(o||_1.global,a)){return this.map(_15);}this.forEach(_15);return this;};};var _16=function(_17){var _18=this instanceof nl&&_2("array-extensible");if(typeof _17=="number"){_17=Array(_17);}var _19=(_17&&"length" in _17)?_17:arguments;if(_18||!_19.sort){var _1a=_18?this:[],l=_1a.length=_19.length;for(var i=0;i<l;i++){_1a[i]=_19[i];}if(_18){return _1a;}_19=_1a;}_5._mixin(_19,nlp);_19._NodeListCtor=function(_1b){return nl(_1b);};return _19;};var nl=_16,nlp=nl.prototype=_2("array-extensible")?[]:{};nl._wrap=nlp._wrap=_b;nl._adaptAsMap=_12;nl._adaptAsForEach=_11;nl._adaptAsFilter=_13;nl._adaptWithCondition=_14;_a(["slice","splice"],function(_1c){var f=ap[_1c];nlp[_1c]=function(){return this._wrap(f.apply(this,arguments),_1c=="slice"?this:null);};});_a(["indexOf","lastIndexOf","every","some"],function(_1d){var f=_4[_1d];nlp[_1d]=function(){return f.apply(_1,[this].concat(_8.call(arguments,0)));};});_5.extend(_16,{constructor:nl,_NodeListCtor:nl,toString:function(){return this.join(",");},_stash:function(_1e){this._parent=_1e;return this;},on:function(_1f,_20){var _21=this.map(function(_22){return on(_22,_1f,_20);});_21.remove=function(){for(var i=0;i<_21.length;i++){_21[i].remove();}};return _21;},end:function(){if(this._parent){return this._parent;}else{return new this._NodeListCtor(0);}},concat:function(_23){var t=_5.isArray(this)?this:_8.call(this,0),m=_4.map(arguments,function(a){return a&&!_5.isArray(a)&&(typeof _16!="undefined"&&a.constructor===_16||a.constructor===this._NodeListCtor)?_8.call(a,0):a;});return this._wrap(_9.apply(t,m),this);},map:function(_24,obj){return this._wrap(_4.map(this,_24,obj),this);},forEach:function(_25,_26){_a(this,_25,_26);return this;},filter:function(_27){var a=arguments,_28=this,_29=0;if(typeof _27=="string"){_28=_2a._filterResult(this,a[0]);if(a.length==1){return _28._stash(this);}_29=1;}return this._wrap(_4.filter(_28,a[_29],a[_29+1]),this);},instantiate:function(_2b,_2c){var c=_5.isFunction(_2b)?_2b:_5.getObject(_2b);_2c=_2c||{};return this.forEach(function(_2d){new c(_2c,_2d);});},at:function(){var t=new this._NodeListCtor(0);_a(arguments,function(i){if(i<0){i=this.length+i;}if(this[i]){t.push(this[i]);}},this);return t._stash(this);}});function _2e(_2f,_30){var _31=function(_32,_33){if(typeof _33=="string"){_33=_3.byId(_33);if(!_33){return new _30([]);}}var _34=typeof _32=="string"?_2f(_32,_33):_32.orphan?_32:[_32];if(_34.orphan){return _34;}return new _30(_34);};_31.matches=_2f.match||function(_35,_36,_37){return _31.filter([_35],_36,_37).length>0;};_31.filter=_2f.filter||function(_38,_39,_3a){return _31(_39,_3a).filter(function(_3b){return _4.indexOf(_38,_3b)>-1;});};if(typeof _2f!="function"){var _3c=_2f.search;_2f=function(_3d,_3e){return _3c(_3e||document,_3d);};}return _31;};var _2a=_2e(_7,_16);_1.query=_2e(_7,function(_3f){return _16(_3f);});_2a.load=function(id,_40,_41,_42){_6.load(id,_40,function(_43){_41(_2e(_43,_16));});};_1._filterQueryResult=_2a._filterResult=function(_44,_45,_46){return new _16(_2a.filter(_44,_45,_46));};_1.NodeList=_2a.NodeList=_16;return _2a;}); \ No newline at end of file diff --git a/lib/dojo/query.js.uncompressed.js b/lib/dojo/query.js.uncompressed.js new file mode 100644 index 00000000..3fc66151 --- /dev/null +++ b/lib/dojo/query.js.uncompressed.js @@ -0,0 +1,713 @@ +define("dojo/query", ["./_base/kernel", "./has", "./dom", "./on", "./_base/array", "./_base/lang", "./selector/_loader", "./selector/_loader!default"], + function(dojo, has, dom, on, array, lang, loader, defaultEngine){ +"use strict"; + + has.add("array-extensible", function(){ + // test to see if we can extend an array (not supported in old IE) + return lang.delegate([], {length: 1}).length == 1 && !has("bug-for-in-skips-shadowed"); + }); + + var ap = Array.prototype, aps = ap.slice, apc = ap.concat, forEach = array.forEach; + + var tnl = function(/*Array*/ a, /*dojo.NodeList?*/ parent, /*Function?*/ NodeListCtor){ + // summary: + // decorate an array to make it look like a `dojo.NodeList`. + // a: + // Array of nodes to decorate. + // parent: + // An optional parent NodeList that generated the current + // list of nodes. Used to call _stash() so the parent NodeList + // can be accessed via end() later. + // NodeListCtor: + // An optional constructor function to use for any + // new NodeList calls. This allows a certain chain of + // NodeList calls to use a different object than dojo.NodeList. + var nodeList = new (NodeListCtor || this._NodeListCtor || nl)(a); + return parent ? nodeList._stash(parent) : nodeList; + }; + + var loopBody = function(f, a, o){ + a = [0].concat(aps.call(a, 0)); + o = o || dojo.global; + return function(node){ + a[0] = node; + return f.apply(o, a); + }; + }; + + // adapters + + var adaptAsForEach = function(f, o){ + // summary: + // adapts a single node function to be used in the forEach-type + // actions. The initial object is returned from the specialized + // function. + // f: Function + // a function to adapt + // o: Object? + // an optional context for f + return function(){ + this.forEach(loopBody(f, arguments, o)); + return this; // Object + }; + }; + + var adaptAsMap = function(f, o){ + // summary: + // adapts a single node function to be used in the map-type + // actions. The return is a new array of values, as via `dojo.map` + // f: Function + // a function to adapt + // o: Object? + // an optional context for f + return function(){ + return this.map(loopBody(f, arguments, o)); + }; + }; + + var adaptAsFilter = function(f, o){ + // summary: + // adapts a single node function to be used in the filter-type actions + // f: Function + // a function to adapt + // o: Object? + // an optional context for f + return function(){ + return this.filter(loopBody(f, arguments, o)); + }; + }; + + var adaptWithCondition = function(f, g, o){ + // summary: + // adapts a single node function to be used in the map-type + // actions, behaves like forEach() or map() depending on arguments + // f: Function + // a function to adapt + // g: Function + // a condition function, if true runs as map(), otherwise runs as forEach() + // o: Object? + // an optional context for f and g + return function(){ + var a = arguments, body = loopBody(f, a, o); + if(g.call(o || dojo.global, a)){ + return this.map(body); // self + } + this.forEach(body); + return this; // self + }; + }; + + var NodeList = function(array){ + // summary: + // dojo.NodeList is an of Array-like object which adds syntactic + // sugar for chaining, common iteration operations, animation, and + // node manipulation. NodeLists are most often returned as the + // result of dojo.query() calls. + // description: + // dojo.NodeList instances provide many utilities that reflect + // core Dojo APIs for Array iteration and manipulation, DOM + // manipulation, and event handling. Instead of needing to dig up + // functions in the dojo.* namespace, NodeLists generally make the + // full power of Dojo available for DOM manipulation tasks in a + // simple, chainable way. + // example: + // create a node list from a node + // | new dojo.NodeList(dojo.byId("foo")); + // example: + // get a NodeList from a CSS query and iterate on it + // | var l = dojo.query(".thinger"); + // | l.forEach(function(node, index, nodeList){ + // | console.log(index, node.innerHTML); + // | }); + // example: + // use native and Dojo-provided array methods to manipulate a + // NodeList without needing to use dojo.* functions explicitly: + // | var l = dojo.query(".thinger"); + // | // since NodeLists are real arrays, they have a length + // | // property that is both readable and writable and + // | // push/pop/shift/unshift methods + // | console.log(l.length); + // | l.push(dojo.create("span")); + // | + // | // dojo's normalized array methods work too: + // | console.log( l.indexOf(dojo.byId("foo")) ); + // | // ...including the special "function as string" shorthand + // | console.log( l.every("item.nodeType == 1") ); + // | + // | // NodeLists can be [..] indexed, or you can use the at() + // | // function to get specific items wrapped in a new NodeList: + // | var node = l[3]; // the 4th element + // | var newList = l.at(1, 3); // the 2nd and 4th elements + // example: + // the style functions you expect are all there too: + // | // style() as a getter... + // | var borders = dojo.query(".thinger").style("border"); + // | // ...and as a setter: + // | dojo.query(".thinger").style("border", "1px solid black"); + // | // class manipulation + // | dojo.query("li:nth-child(even)").addClass("even"); + // | // even getting the coordinates of all the items + // | var coords = dojo.query(".thinger").coords(); + // example: + // DOM manipulation functions from the dojo.* namespace area also + // available: + // | // remove all of the elements in the list from their + // | // parents (akin to "deleting" them from the document) + // | dojo.query(".thinger").orphan(); + // | // place all elements in the list at the front of #foo + // | dojo.query(".thinger").place("foo", "first"); + // example: + // Event handling couldn't be easier. `dojo.connect` is mapped in, + // and shortcut handlers are provided for most DOM events: + // | // like dojo.connect(), but with implicit scope + // | dojo.query("li").connect("onclick", console, "log"); + // | + // | // many common event handlers are already available directly: + // | dojo.query("li").onclick(console, "log"); + // | var toggleHovered = dojo.hitch(dojo, "toggleClass", "hovered"); + // | dojo.query("p") + // | .onmouseenter(toggleHovered) + // | .onmouseleave(toggleHovered); + // example: + // chainability is a key advantage of NodeLists: + // | dojo.query(".thinger") + // | .onclick(function(e){ /* ... */ }) + // | .at(1, 3, 8) // get a subset + // | .style("padding", "5px") + // | .forEach(console.log); + var isNew = this instanceof nl && has("array-extensible"); + if(typeof array == "number"){ + array = Array(array); + } + var nodeArray = (array && "length" in array) ? array : arguments; + if(isNew || !nodeArray.sort){ + // make sure it's a real array before we pass it on to be wrapped + var target = isNew ? this : [], + l = target.length = nodeArray.length; + for(var i = 0; i < l; i++){ + target[i] = nodeArray[i]; + } + if(isNew){ + // called with new operator, this means we are going to use this instance and push + // the nodes on to it. This is usually much faster since the NodeList properties + // don't need to be copied (unless the list of nodes is extremely large). + return target; + } + nodeArray = target; + } + // called without new operator, use a real array and copy prototype properties, + // this is slower and exists for back-compat. Should be removed in 2.0. + lang._mixin(nodeArray, nlp); + nodeArray._NodeListCtor = function(array){ + // call without new operator to preserve back-compat behavior + return nl(array); + }; + return nodeArray; + }; + + var nl = NodeList, nlp = nl.prototype = + has("array-extensible") ? [] : {};// extend an array if it is extensible + + // expose adapters and the wrapper as private functions + + nl._wrap = nlp._wrap = tnl; + nl._adaptAsMap = adaptAsMap; + nl._adaptAsForEach = adaptAsForEach; + nl._adaptAsFilter = adaptAsFilter; + nl._adaptWithCondition = adaptWithCondition; + + // mass assignment + + // add array redirectors + forEach(["slice", "splice"], function(name){ + var f = ap[name]; + //Use a copy of the this array via this.slice() to allow .end() to work right in the splice case. + // CANNOT apply ._stash()/end() to splice since it currently modifies + // the existing this array -- it would break backward compatibility if we copy the array before + // the splice so that we can use .end(). So only doing the stash option to this._wrap for slice. + nlp[name] = function(){ return this._wrap(f.apply(this, arguments), name == "slice" ? this : null); }; + }); + // concat should be here but some browsers with native NodeList have problems with it + + // add array.js redirectors + forEach(["indexOf", "lastIndexOf", "every", "some"], function(name){ + var f = array[name]; + nlp[name] = function(){ return f.apply(dojo, [this].concat(aps.call(arguments, 0))); }; + }); + + /*===== var NodeList = dojo.NodeList; =====*/ + lang.extend(NodeList, { + // copy the constructors + constructor: nl, + _NodeListCtor: nl, + toString: function(){ + // Array.prototype.toString can't be applied to objects, so we use join + return this.join(","); + }, + _stash: function(parent){ + // summary: + // private function to hold to a parent NodeList. end() to return the parent NodeList. + // + // example: + // How to make a `dojo.NodeList` method that only returns the third node in + // the dojo.NodeList but allows access to the original NodeList by using this._stash: + // | dojo.extend(dojo.NodeList, { + // | third: function(){ + // | var newNodeList = dojo.NodeList(this[2]); + // | return newNodeList._stash(this); + // | } + // | }); + // | // then see how _stash applies a sub-list, to be .end()'ed out of + // | dojo.query(".foo") + // | .third() + // | .addClass("thirdFoo") + // | .end() + // | // access to the orig .foo list + // | .removeClass("foo") + // | + // + this._parent = parent; + return this; //dojo.NodeList + }, + + on: function(eventName, listener){ + // summary: + // Listen for events on the nodes in the NodeList. Basic usage is: + // | query(".my-class").on("click", listener); + // This supports event delegation by using selectors as the first argument with the event names as + // pseudo selectors. For example: + // | dojo.query("#my-list").on("li:click", listener); + // This will listen for click events within <li> elements that are inside the #my-list element. + // Because on supports CSS selector syntax, we can use comma-delimited events as well: + // | dojo.query("#my-list").on("li button:mouseover, li:click", listener); + var handles = this.map(function(node){ + return on(node, eventName, listener); // TODO: apply to the NodeList so the same selector engine is used for matches + }); + handles.remove = function(){ + for(var i = 0; i < handles.length; i++){ + handles[i].remove(); + } + }; + return handles; + }, + + end: function(){ + // summary: + // Ends use of the current `dojo.NodeList` by returning the previous dojo.NodeList + // that generated the current dojo.NodeList. + // description: + // Returns the `dojo.NodeList` that generated the current `dojo.NodeList`. If there + // is no parent dojo.NodeList, an empty dojo.NodeList is returned. + // example: + // | dojo.query("a") + // | .filter(".disabled") + // | // operate on the anchors that only have a disabled class + // | .style("color", "grey") + // | .end() + // | // jump back to the list of anchors + // | .style(...) + // + if(this._parent){ + return this._parent; + }else{ + //Just return empty list. + return new this._NodeListCtor(0); + } + }, + + // http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array#Methods + + // FIXME: handle return values for #3244 + // http://trac.dojotoolkit.org/ticket/3244 + + // FIXME: + // need to wrap or implement: + // join (perhaps w/ innerHTML/outerHTML overload for toString() of items?) + // reduce + // reduceRight + + /*===== + slice: function(begin, end){ + // summary: + // Returns a new NodeList, maintaining this one in place + // description: + // This method behaves exactly like the Array.slice method + // with the caveat that it returns a dojo.NodeList and not a + // raw Array. For more details, see Mozilla's (slice + // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:slice] + // begin: Integer + // Can be a positive or negative integer, with positive + // integers noting the offset to begin at, and negative + // integers denoting an offset from the end (i.e., to the left + // of the end) + // end: Integer? + // Optional parameter to describe what position relative to + // the NodeList's zero index to end the slice at. Like begin, + // can be positive or negative. + return this._wrap(a.slice.apply(this, arguments)); + }, + + splice: function(index, howmany, item){ + // summary: + // Returns a new NodeList, manipulating this NodeList based on + // the arguments passed, potentially splicing in new elements + // at an offset, optionally deleting elements + // description: + // This method behaves exactly like the Array.splice method + // with the caveat that it returns a dojo.NodeList and not a + // raw Array. For more details, see Mozilla's (splice + // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:splice] + // For backwards compatibility, calling .end() on the spliced NodeList + // does not return the original NodeList -- splice alters the NodeList in place. + // index: Integer + // begin can be a positive or negative integer, with positive + // integers noting the offset to begin at, and negative + // integers denoting an offset from the end (i.e., to the left + // of the end) + // howmany: Integer? + // Optional parameter to describe what position relative to + // the NodeList's zero index to end the slice at. Like begin, + // can be positive or negative. + // item: Object...? + // Any number of optional parameters may be passed in to be + // spliced into the NodeList + // returns: + // dojo.NodeList + return this._wrap(a.splice.apply(this, arguments)); + }, + + indexOf: function(value, fromIndex){ + // summary: + // see dojo.indexOf(). The primary difference is that the acted-on + // array is implicitly this NodeList + // value: Object: + // The value to search for. + // fromIndex: Integer?: + // The location to start searching from. Optional. Defaults to 0. + // description: + // For more details on the behavior of indexOf, see Mozilla's + // (indexOf + // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:indexOf] + // returns: + // Positive Integer or 0 for a match, -1 of not found. + return d.indexOf(this, value, fromIndex); // Integer + }, + + lastIndexOf: function(value, fromIndex){ + // summary: + // see dojo.lastIndexOf(). The primary difference is that the + // acted-on array is implicitly this NodeList + // description: + // For more details on the behavior of lastIndexOf, see + // Mozilla's (lastIndexOf + // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:lastIndexOf] + // value: Object + // The value to search for. + // fromIndex: Integer? + // The location to start searching from. Optional. Defaults to 0. + // returns: + // Positive Integer or 0 for a match, -1 of not found. + return d.lastIndexOf(this, value, fromIndex); // Integer + }, + + every: function(callback, thisObject){ + // summary: + // see `dojo.every()` and the (Array.every + // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:every]. + // Takes the same structure of arguments and returns as + // dojo.every() with the caveat that the passed array is + // implicitly this NodeList + // callback: Function: the callback + // thisObject: Object?: the context + return d.every(this, callback, thisObject); // Boolean + }, + + some: function(callback, thisObject){ + // summary: + // Takes the same structure of arguments and returns as + // `dojo.some()` with the caveat that the passed array is + // implicitly this NodeList. See `dojo.some()` and Mozilla's + // (Array.some + // documentation)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:some]. + // callback: Function: the callback + // thisObject: Object?: the context + return d.some(this, callback, thisObject); // Boolean + }, + =====*/ + + concat: function(item){ + // summary: + // Returns a new NodeList comprised of items in this NodeList + // as well as items passed in as parameters + // description: + // This method behaves exactly like the Array.concat method + // with the caveat that it returns a `dojo.NodeList` and not a + // raw Array. For more details, see the (Array.concat + // docs)[http://developer.mozilla.org/en/docs/Core_JavaScript_1.5_Reference:Global_Objects:Array:concat] + // item: Object? + // Any number of optional parameters may be passed in to be + // spliced into the NodeList + // returns: + // dojo.NodeList + + //return this._wrap(apc.apply(this, arguments)); + // the line above won't work for the native NodeList :-( + + // implementation notes: + // 1) Native NodeList is not an array, and cannot be used directly + // in concat() --- the latter doesn't recognize it as an array, and + // does not inline it, but append as a single entity. + // 2) On some browsers (e.g., Safari) the "constructor" property is + // read-only and cannot be changed. So we have to test for both + // native NodeList and dojo.NodeList in this property to recognize + // the node list. + + var t = lang.isArray(this) ? this : aps.call(this, 0), + m = array.map(arguments, function(a){ + return a && !lang.isArray(a) && + (typeof NodeList != "undefined" && a.constructor === NodeList || a.constructor === this._NodeListCtor) ? + aps.call(a, 0) : a; + }); + return this._wrap(apc.apply(t, m), this); // dojo.NodeList + }, + + map: function(/*Function*/ func, /*Function?*/ obj){ + // summary: + // see dojo.map(). The primary difference is that the acted-on + // array is implicitly this NodeList and the return is a + // dojo.NodeList (a subclass of Array) + ///return d.map(this, func, obj, d.NodeList); // dojo.NodeList + return this._wrap(array.map(this, func, obj), this); // dojo.NodeList + }, + + forEach: function(callback, thisObj){ + // summary: + // see `dojo.forEach()`. The primary difference is that the acted-on + // array is implicitly this NodeList. If you want the option to break out + // of the forEach loop, use every() or some() instead. + forEach(this, callback, thisObj); + // non-standard return to allow easier chaining + return this; // dojo.NodeList + }, + filter: function(/*String|Function*/ filter){ + // summary: + // "masks" the built-in javascript filter() method (supported + // in Dojo via `dojo.filter`) to support passing a simple + // string filter in addition to supporting filtering function + // objects. + // filter: + // If a string, a CSS rule like ".thinger" or "div > span". + // example: + // "regular" JS filter syntax as exposed in dojo.filter: + // | dojo.query("*").filter(function(item){ + // | // highlight every paragraph + // | return (item.nodeName == "p"); + // | }).style("backgroundColor", "yellow"); + // example: + // the same filtering using a CSS selector + // | dojo.query("*").filter("p").styles("backgroundColor", "yellow"); + + var a = arguments, items = this, start = 0; + if(typeof filter == "string"){ // inline'd type check + items = query._filterResult(this, a[0]); + if(a.length == 1){ + // if we only got a string query, pass back the filtered results + return items._stash(this); // dojo.NodeList + } + // if we got a callback, run it over the filtered items + start = 1; + } + return this._wrap(array.filter(items, a[start], a[start + 1]), this); // dojo.NodeList + }, + instantiate: function(/*String|Object*/ declaredClass, /*Object?*/ properties){ + // summary: + // Create a new instance of a specified class, using the + // specified properties and each node in the nodeList as a + // srcNodeRef. + // example: + // Grabs all buttons in the page and converts them to diji.form.Buttons. + // | var buttons = dojo.query("button").instantiate("dijit.form.Button", {showLabel: true}); + var c = lang.isFunction(declaredClass) ? declaredClass : lang.getObject(declaredClass); + properties = properties || {}; + return this.forEach(function(node){ + new c(properties, node); + }); // dojo.NodeList + }, + at: function(/*===== index =====*/){ + // summary: + // Returns a new NodeList comprised of items in this NodeList + // at the given index or indices. + // + // index: Integer... + // One or more 0-based indices of items in the current + // NodeList. A negative index will start at the end of the + // list and go backwards. + // + // example: + // Shorten the list to the first, second, and third elements + // | dojo.query("a").at(0, 1, 2).forEach(fn); + // + // example: + // Retrieve the first and last elements of a unordered list: + // | dojo.query("ul > li").at(0, -1).forEach(cb); + // + // example: + // Do something for the first element only, but end() out back to + // the original list and continue chaining: + // | dojo.query("a").at(0).onclick(fn).end().forEach(function(n){ + // | console.log(n); // all anchors on the page. + // | }) + // + // returns: + // dojo.NodeList + var t = new this._NodeListCtor(0); + forEach(arguments, function(i){ + if(i < 0){ i = this.length + i; } + if(this[i]){ t.push(this[i]); } + }, this); + return t._stash(this); // dojo.NodeList + } + }); + + +/*===== +dojo.query = function(selector, context){ + // summary: + // This modules provides DOM querying functionality. The module export is a function + // that can be used to query for DOM nodes by CSS selector and returns a dojo.NodeList + // representing the matching nodes. + // + // selector: String + // A CSS selector to search for. + // context: String|DomNode? + // An optional context to limit the searching scope. Only nodes under `context` will be + // scanned. + // + // example: + // add an onclick handler to every submit button in the document + // which causes the form to be sent via Ajax instead: + // | define(["dojo/query"], function(query){ + // | query("input[type='submit']").on("click", function(e){ + // | dojo.stopEvent(e); // prevent sending the form + // | var btn = e.target; + // | dojo.xhrPost({ + // | form: btn.form, + // | load: function(data){ + // | // replace the form with the response + // | var div = dojo.doc.createElement("div"); + // | dojo.place(div, btn.form, "after"); + // | div.innerHTML = data; + // | dojo.style(btn.form, "display", "none"); + // | } + // | }); + // | }); + // + // description: + // dojo/query is responsible for loading the appropriate query engine and wrapping + // its results with a `dojo.NodeList`. You can use dojo/query with a specific selector engine + // by using it as a plugin. For example, if you installed the sizzle package, you could + // use it as the selector engine with: + // | define("dojo/query!sizzle", function(query){ + // | query("div")... + // + // The id after the ! can be a module id of the selector engine or one of the following values: + // | + acme: This is the default engine used by Dojo base, and will ensure that the full + // | Acme engine is always loaded. + // | + // | + css2: If the browser has a native selector engine, this will be used, otherwise a + // | very minimal lightweight selector engine will be loaded that can do simple CSS2 selectors + // | (by #id, .class, tag, and [name=value] attributes, with standard child or descendant (>) + // | operators) and nothing more. + // | + // | + css2.1: If the browser has a native selector engine, this will be used, otherwise the + // | full Acme engine will be loaded. + // | + // | + css3: If the browser has a native selector engine with support for CSS3 pseudo + // | selectors (most modern browsers except IE8), this will be used, otherwise the + // | full Acme engine will be loaded. + // | + // | + Or the module id of a selector engine can be used to explicitly choose the selector engine + // + // For example, if you are using CSS3 pseudo selectors in module, you can specify that + // you will need support them with: + // | define("dojo/query!css3", function(query){ + // | query('#t > h3:nth-child(odd)')... + // + // You can also choose the selector engine/load configuration by setting the <FIXME:what is the configuration setting?>. + // For example: + // | <script data-dojo-config="query-selector:'css3'" src="dojo.js"></script> + // + return new dojo.NodeList(); // dojo.NodeList +}; +=====*/ + +function queryForEngine(engine, NodeList){ + var query = function(/*String*/ query, /*String|DOMNode?*/ root){ + // summary: + // Returns nodes which match the given CSS selector, searching the + // entire document by default but optionally taking a node to scope + // the search by. Returns an instance of dojo.NodeList. + if(typeof root == "string"){ + root = dom.byId(root); + if(!root){ + return new NodeList([]); + } + } + var results = typeof query == "string" ? engine(query, root) : query.orphan ? query : [query]; + if(results.orphan){ + // already wrapped + return results; + } + return new NodeList(results); + }; + query.matches = engine.match || function(node, selector, root){ + // summary: + // Test to see if a node matches a selector + return query.filter([node], selector, root).length > 0; + }; + // the engine provides a filtering function, use it to for matching + query.filter = engine.filter || function(nodes, selector, root){ + // summary: + // Filters an array of nodes. Note that this does not guarantee to return a dojo.NodeList, just an array. + return query(selector, root).filter(function(node){ + return array.indexOf(nodes, node) > -1; + }); + }; + if(typeof engine != "function"){ + var search = engine.search; + engine = function(selector, root){ + // Slick does it backwards (or everyone else does it backwards, probably the latter) + return search(root || document, selector); + }; + } + return query; +} +var query = queryForEngine(defaultEngine, NodeList); +// the query that is returned from this module is slightly different than dojo.query, +// because dojo.query has to maintain backwards compatibility with returning a +// true array which has performance problems. The query returned from the module +// does not use true arrays, but rather inherits from Array, making it much faster to +// instantiate. +dojo.query = queryForEngine(defaultEngine, function(array){ + // call it without the new operator to invoke the back-compat behavior that returns a true array + return NodeList(array); +}); + +query.load = /*===== dojo.query.load= ======*/ function(id, parentRequire, loaded, config){ + // summary: can be used as AMD plugin to conditionally load new query engine + // example: + // | define(["dojo/query!custom"], function(qsa){ + // | // loaded selector/custom.js as engine + // | qsa("#foobar").forEach(...); + // | }); + loader.load(id, parentRequire, function(engine){ + loaded(queryForEngine(engine, NodeList)); + }); +}; + +dojo._filterQueryResult = query._filterResult = function(nodes, selector, root){ + return new NodeList(query.filter(nodes, selector, root)); +}; +dojo.NodeList = query.NodeList = NodeList; +return query; +}); diff --git a/lib/dojo/ready.js b/lib/dojo/ready.js new file mode 100644 index 00000000..cb2e38ac --- /dev/null +++ b/lib/dojo/ready.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/ready",["./_base/kernel","./has","require","./domReady","./_base/lang"],function(_1,_2,_3,_4,_5){var _6=0,_7,_8=[],_9=0,_a=function(){_6=1;_1._postLoad=_1.config.afterOnLoad=true;if(_8.length){_7(_b);}},_b=function(){if(_6&&!_9&&_8.length){_9=1;var f=_8.shift();try{f();}finally{_9=0;}_9=0;if(_8.length){_7(_b);}}};if(1){_3.on("idle",_b);_7=function(){if(_3.idle()){_b();}};}else{_7=function(){_3.ready(_b);};}var _c=_1.ready=_1.addOnLoad=function(_d,_e,_f){var _10=_5._toArray(arguments);if(typeof _d!="number"){_f=_e;_e=_d;_d=1000;}else{_10.shift();}_f=_f?_5.hitch.apply(_1,_10):function(){_e();};_f.priority=_d;for(var i=0;i<_8.length&&_d>=_8[i].priority;i++){}_8.splice(i,0,_f);_7();};true||_2.add("dojo-config-addOnLoad",1);if(1){var dca=_1.config.addOnLoad;if(dca){_c[(_5.isArray(dca)?"apply":"call")](_1,dca);}}if(1&&_1.config.parseOnLoad&&!_1.isAsync){_c(99,function(){if(!_1.parser){_1.deprecated("Add explicit require(['dojo/parser']);","","2.0");_3(["dojo/parser"]);}});}if(1){_4(_a);}else{_a();}return _c;}); \ No newline at end of file diff --git a/lib/dojo/ready.js.uncompressed.js b/lib/dojo/ready.js.uncompressed.js new file mode 100644 index 00000000..65e3d3df --- /dev/null +++ b/lib/dojo/ready.js.uncompressed.js @@ -0,0 +1,138 @@ +define("dojo/ready", ["./_base/kernel", "./has", "require", "./domReady", "./_base/lang"], function(dojo, has, require, domReady, lang) { + // module: + // dojo/ready + // summary: + // This module defines the dojo.ready API. + // + // note: + // This module should be unnecessary in dojo 2.0 + var + // truthy if DOMContentLoaded or better (e.g., window.onload fired) has been achieved + isDomReady = 0, + + // a function to call to cause onLoad to be called when all requested modules have been loaded + requestCompleteSignal, + + // The queue of functions waiting to execute as soon as dojo.ready conditions satisfied + loadQ = [], + + // prevent recursion in onLoad + onLoadRecursiveGuard = 0, + + handleDomReady = function(){ + isDomReady = 1; + dojo._postLoad = dojo.config.afterOnLoad = true; + if(loadQ.length){ + requestCompleteSignal(onLoad); + } + }, + + // run the next function queued with dojo.ready + onLoad = function(){ + if(isDomReady && !onLoadRecursiveGuard && loadQ.length){ + //guard against recursions into this function + onLoadRecursiveGuard = 1; + var f = loadQ.shift(); + try{ + f(); + } + // FIXME: signal the error via require.on + finally{ + onLoadRecursiveGuard = 0; + } + onLoadRecursiveGuard = 0; + if(loadQ.length){ + requestCompleteSignal(onLoad); + } + } + }; + + // define requireCompleteSignal; impl depends on loader + if(1){ + require.on("idle", onLoad); + requestCompleteSignal = function(){ + if(require.idle()){ + onLoad(); + } // else do nothing, onLoad will be called with the next idle signal + }; + }else{ + // RequireJS or similar + requestCompleteSignal = function(){ + // the next function call will fail if you don't have a loader with require.ready + // in that case, either fix your loader, use dojo's loader, or don't call dojo.ready; + require.ready(onLoad); + }; + } + + var ready = dojo.ready = dojo.addOnLoad = function(priority, context, callback){ + // summary: Add a function to execute on DOM content loaded and all requested modules have arrived and been evaluated. + // priority: Integer? + // The order in which to exec this callback relative to other callbacks, defaults to 1000 + // context: Object?|Function + // The context in which to run execute callback, or a callback if not using context + // callback: Function? + // The function to execute. + // + // example: + // Simple DOM and Modules ready syntax + // | dojo.ready(function(){ alert("Dom ready!"); }); + // + // example: + // Using a priority + // | dojo.ready(2, function(){ alert("low priority ready!"); }) + // + // example: + // Using context + // | dojo.ready(foo, function(){ + // | // in here, this == foo + // | }) + // + // example: + // Using dojo.hitch style args: + // | var foo = { dojoReady: function(){ console.warn(this, "dojo dom and modules ready."); } }; + // | dojo.ready(foo, "dojoReady"); + + var hitchArgs = lang._toArray(arguments); + if(typeof priority != "number"){ + callback = context; + context = priority; + priority = 1000; + }else{ + hitchArgs.shift(); + } + callback = callback ? + lang.hitch.apply(dojo, hitchArgs) : + function(){ + context(); + }; + callback.priority = priority; + for(var i = 0; i < loadQ.length && priority >= loadQ[i].priority; i++){} + loadQ.splice(i, 0, callback); + requestCompleteSignal(); + }; + + true || has.add("dojo-config-addOnLoad", 1); + if(1){ + var dca = dojo.config.addOnLoad; + if(dca){ + ready[(lang.isArray(dca) ? "apply" : "call")](dojo, dca); + } + } + + if(1 && dojo.config.parseOnLoad && !dojo.isAsync){ + ready(99, function(){ + if(!dojo.parser){ + dojo.deprecated("Add explicit require(['dojo/parser']);", "", "2.0"); + require(["dojo/parser"]); + } + }); + } + + if(1){ + domReady(handleDomReady); + }else{ + handleDomReady(); + } + + return ready; +}); diff --git a/lib/dojo/regexp.js b/lib/dojo/regexp.js index 947ecf1d..65b7c3a0 100644 --- a/lib/dojo/regexp.js +++ b/lib/dojo/regexp.js @@ -4,74 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.regexp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.regexp"] = true; -dojo.provide("dojo.regexp"); - -dojo.getObject("regexp", true, dojo); - -/*===== -dojo.regexp = { - // summary: Regular expressions and Builder resources -}; -=====*/ - -dojo.regexp.escapeString = function(/*String*/str, /*String?*/except){ - // summary: - // Adds escape sequences for special characters in regular expressions - // except: - // a String with special characters to be left unescaped - - return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, function(ch){ - if(except && except.indexOf(ch) != -1){ - return ch; - } - return "\\" + ch; - }); // String -}; - -dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boolean?*/nonCapture){ - // summary: - // Builds a regular expression that groups subexpressions - // description: - // A utility function used by some of the RE generators. The - // subexpressions are constructed by the function, re, in the second - // parameter. re builds one subexpression for each elem in the array - // a, in the first parameter. Returns a string for a regular - // expression that groups all the subexpressions. - // arr: - // A single value or an array of values. - // re: - // A function. Takes one parameter and converts it to a regular - // expression. - // nonCapture: - // If true, uses non-capturing match, otherwise matches are retained - // by regular expression. Defaults to false - - // case 1: a is a single value. - if(!(arr instanceof Array)){ - return re(arr); // String - } - - // case 2: a is an array - var b = []; - for(var i = 0; i < arr.length; i++){ - // convert each elem to a RE - b.push(re(arr[i])); - } - - // join the REs as alternatives in a RE group. - return dojo.regexp.group(b.join("|"), nonCapture); // String -}; - -dojo.regexp.group = function(/*String*/expression, /*Boolean?*/nonCapture){ - // summary: - // adds group match to expression - // nonCapture: - // If true, uses non-capturing match, otherwise matches are retained - // by regular expression. - return "(" + (nonCapture ? "?:":"") + expression + ")"; // String -}; - -} +//>>built +define("dojo/regexp",["./_base/kernel","./_base/lang"],function(_1,_2){_2.getObject("regexp",true,_1);_1.regexp.escapeString=function(_3,_4){return _3.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(ch){if(_4&&_4.indexOf(ch)!=-1){return ch;}return "\\"+ch;});};_1.regexp.buildGroupRE=function(_5,re,_6){if(!(_5 instanceof Array)){return re(_5);}var b=[];for(var i=0;i<_5.length;i++){b.push(re(_5[i]));}return _1.regexp.group(b.join("|"),_6);};_1.regexp.group=function(_7,_8){return "("+(_8?"?:":"")+_7+")";};return _1.regexp;}); \ No newline at end of file diff --git a/lib/dojo/regexp.js.uncompressed.js b/lib/dojo/regexp.js.uncompressed.js new file mode 100644 index 00000000..4817a779 --- /dev/null +++ b/lib/dojo/regexp.js.uncompressed.js @@ -0,0 +1,73 @@ +define("dojo/regexp", ["./_base/kernel", "./_base/lang"], function(dojo, lang) { + // module: + // dojo/regexp + // summary: + // TODOC + +lang.getObject("regexp", true, dojo); + +/*===== +dojo.regexp = { + // summary: Regular expressions and Builder resources +}; +=====*/ + +dojo.regexp.escapeString = function(/*String*/str, /*String?*/except){ + // summary: + // Adds escape sequences for special characters in regular expressions + // except: + // a String with special characters to be left unescaped + + return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, function(ch){ + if(except && except.indexOf(ch) != -1){ + return ch; + } + return "\\" + ch; + }); // String +}; + +dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boolean?*/nonCapture){ + // summary: + // Builds a regular expression that groups subexpressions + // description: + // A utility function used by some of the RE generators. The + // subexpressions are constructed by the function, re, in the second + // parameter. re builds one subexpression for each elem in the array + // a, in the first parameter. Returns a string for a regular + // expression that groups all the subexpressions. + // arr: + // A single value or an array of values. + // re: + // A function. Takes one parameter and converts it to a regular + // expression. + // nonCapture: + // If true, uses non-capturing match, otherwise matches are retained + // by regular expression. Defaults to false + + // case 1: a is a single value. + if(!(arr instanceof Array)){ + return re(arr); // String + } + + // case 2: a is an array + var b = []; + for(var i = 0; i < arr.length; i++){ + // convert each elem to a RE + b.push(re(arr[i])); + } + + // join the REs as alternatives in a RE group. + return dojo.regexp.group(b.join("|"), nonCapture); // String +}; + +dojo.regexp.group = function(/*String*/expression, /*Boolean?*/nonCapture){ + // summary: + // adds group match to expression + // nonCapture: + // If true, uses non-capturing match, otherwise matches are retained + // by regular expression. + return "(" + (nonCapture ? "?:":"") + expression + ")"; // String +}; + +return dojo.regexp; +}); diff --git a/lib/dojo/require.js b/lib/dojo/require.js new file mode 100644 index 00000000..40160e17 --- /dev/null +++ b/lib/dojo/require.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/require",["./_base/loader"],function(_1){return {dynamic:0,normalize:function(id){return id;},load:_1.require};}); \ No newline at end of file diff --git a/lib/dojo/require.js.uncompressed.js b/lib/dojo/require.js.uncompressed.js new file mode 100644 index 00000000..e3d12dde --- /dev/null +++ b/lib/dojo/require.js.uncompressed.js @@ -0,0 +1,7 @@ +define("dojo/require", ["./_base/loader"], function(loader){ + return { + dynamic:0, + normalize:function(id){return id;}, + load:loader.require + }; +}); diff --git a/lib/dojo/resources/_modules.js b/lib/dojo/resources/_modules.js index 2afef9a6..e093a58f 100644 --- a/lib/dojo/resources/_modules.js +++ b/lib/dojo/resources/_modules.js @@ -1,10 +1,3 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - /*===== // Supplemental summaries for those hard-to-doc places your conventional doc parser can't reach. // Where possible, these summaries should appear inline in the code. diff --git a/lib/dojo/resources/dnd.css b/lib/dojo/resources/dnd.css index b7f1651f..fb061185 100644 --- a/lib/dojo/resources/dnd.css +++ b/lib/dojo/resources/dnd.css @@ -1,6 +1,6 @@ /* DnD avatar-specific settings */ .dojoDndAvatar {font-size: 75%; color: black;} -.dojoDndAvatarHeader td {padding-left: 20px; padding-right: 4px;} +.dojoDndAvatarHeader td {padding-left: 20px; padding-right: 4px; height: 16px;} .dojoDndAvatarHeader {background: #ccc;} .dojoDndAvatarItem {background: #eee;} .dojoDndMove .dojoDndAvatarHeader {background-image: url(images/dndNoMove.png); background-repeat: no-repeat;} diff --git a/lib/dojo/robot.js b/lib/dojo/robot.js deleted file mode 100644 index 40bc746e..00000000 --- a/lib/dojo/robot.js +++ /dev/null @@ -1,187 +0,0 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dojo.robot"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.robot"] = true; -dojo.provide("dojo.robot"); -dojo.require("doh.robot"); -dojo.require("dojo.window"); - - -dojo.experimental("dojo.robot"); - -(function(){ -// users who use doh+dojo get the added convenience of dojo.mouseMoveAt, -// instead of computing the absolute coordinates of their elements themselves -dojo.mixin(doh.robot,{ - - _resolveNode: function(/*String||DOMNode||Function*/ n){ - if(typeof n == "function"){ - // if the user passed a function returning a node, evaluate it - n = n(); - } - return n? dojo.byId(n) : null; - }, - - _scrollIntoView: function(/*Node*/ n){ - // scrolls the passed node into view, scrolling all ancester frames/windows as well. - // Assumes parent iframes can be made fully visible given the current browser window size - var d = dojo, - dr = doh.robot, - p = null; - d.forEach(dr._getWindowChain(n), function(w){ - d.withGlobal(w, function(){ - // get the position of the node wrt its parent window - // if it is a parent frame, its padding and border extents will get added in - var p2 = d.position(n, false), - b = d._getPadBorderExtents(n), - oldp = null; - // if p2 is the position of the original passed node, store the position away as p - // otherwise, node is actually an iframe. in this case, add the iframe's position wrt its parent window and also the iframe's padding and border extents - if(!p){ - p = p2; - }else{ - oldp = p; - p = {x: p.x+p2.x+b.l, - y: p.y+p2.y+b.t, - w: p.w, - h: p.h}; - - } - // scroll the parent window so that the node translated into the parent window's coordinate space is in view - dojo.window.scrollIntoView(n,p); - // adjust position for the new scroll offsets - p2 = d.position(n, false); - if(!oldp){ - p = p2; - }else{ - p = {x: oldp.x+p2.x+b.l, - y: oldp.y+p2.y+b.t, - w: p.w, - h: p.h}; - } - // get the parent iframe so it can be scrolled too - n = w.frameElement; - }); - }); - }, - - _position: function(/*Node*/ n){ - // Returns the dojo.position of the passed node wrt the passed window's viewport, - // following any parent iframes containing the node and clipping the node to each iframe. - // precondition: _scrollIntoView already called - var d = dojo, p = null, M = Math.max, m = Math.min; - // p: the returned position of the node - d.forEach(doh.robot._getWindowChain(n), function(w){ - d.withGlobal(w, function(){ - // get the position of the node wrt its parent window - // if it is a parent frame, its padding and border extents will get added in - var p2 = d.position(n, false), b = d._getPadBorderExtents(n); - // if p2 is the position of the original passed node, store the position away as p - // otherwise, node is actually an iframe. in this case, add the iframe's position wrt its parent window and also the iframe's padding and border extents - if(!p){ - p = p2; - }else{ - var view; - d.withGlobal(n.contentWindow,function(){ - view=dojo.window.getBox(); - }); - p2.r = p2.x+view.w; - p2.b = p2.y+view.h; - p = {x: M(p.x+p2.x,p2.x)+b.l, // clip left edge of node wrt the iframe - y: M(p.y+p2.y,p2.y)+b.t, // top edge - r: m(p.x+p2.x+p.w,p2.r)+b.l, // right edge (to compute width) - b: m(p.y+p2.y+p.h,p2.b)+b.t}; // bottom edge (to compute height) - // save a few bytes by computing width and height from r and b - p.w = p.r-p.x; - p.h = p.b-p.y; - } - // the new node is now the old node's parent iframe - n=w.frameElement; - }); - }); - return p; - }, - - _getWindowChain : function(/*Node*/ n){ - // Returns an array of windows starting from the passed node's parent window and ending at dojo's window - var cW = dojo.window.get(n.ownerDocument); - var arr=[cW]; - var f = cW.frameElement; - return (cW == dojo.global || f == null)? arr : arr.concat(doh.robot._getWindowChain(f)); - }, - - scrollIntoView : function(/*String||DOMNode||Function*/ node, /*Number, optional*/ delay){ - // summary: - // Scroll the passed node into view, if it is not. - // - // node: - // The id of the node, or the node itself, to move the mouse to. - // If you pass an id or a function that returns a node, the node will not be evaluated until the movement executes. - // This is useful if you need to move the mouse to an node that is not yet present. - // - // delay: - // Delay, in milliseconds, to wait before firing. - // The delay is a delta with respect to the previous automation call. - // - doh.robot.sequence(function(){ - doh.robot._scrollIntoView(doh.robot._resolveNode(node)); - }, delay); - }, - - mouseMoveAt : function(/*String||DOMNode||Function*/ node, /*Integer, optional*/ delay, /*Integer, optional*/ duration, /*Number, optional*/ offsetX, /*Number, optional*/ offsetY){ - // summary: - // Moves the mouse over the specified node at the specified relative x,y offset. - // - // description: - // Moves the mouse over the specified node at the specified relative x,y offset. - // If you do not specify an offset, mouseMove will default to move to the middle of the node. - // Example: to move the mouse over a ComboBox's down arrow node, call doh.mouseMoveAt(dijit.byId('setvaluetest').downArrowNode); - // - // node: - // The id of the node, or the node itself, to move the mouse to. - // If you pass an id or a function that returns a node, the node will not be evaluated until the movement executes. - // This is useful if you need to move the mouse to an node that is not yet present. - // - // delay: - // Delay, in milliseconds, to wait before firing. - // The delay is a delta with respect to the previous automation call. - // For example, the following code ends after 600ms: - // doh.robot.mouseClick({left:true}, 100) // first call; wait 100ms - // doh.robot.typeKeys("dij", 500) // 500ms AFTER previous call; 600ms in all - // - // duration: - // Approximate time Robot will spend moving the mouse - // The default is 100ms. - // - // offsetX: - // x offset relative to the node, in pixels, to move the mouse. The default is half the node's width. - // - // offsetY: - // y offset relative to the node, in pixels, to move the mouse. The default is half the node's height. - // - - doh.robot._assertRobot(); - duration = duration||100; - this.sequence(function(){ - node=doh.robot._resolveNode(node); - doh.robot._scrollIntoView(node); - var pos = doh.robot._position(node); - if(offsetY === undefined){ - offsetX=pos.w/2; - offsetY=pos.h/2; - } - var x = pos.x+offsetX; - var y = pos.y+offsetY; - doh.robot._mouseMove(x, y, false, duration); - }, delay, duration); - } -}); - -})(); - -} diff --git a/lib/dojo/robotx.js b/lib/dojo/robotx.js deleted file mode 100644 index 3a07c690..00000000 --- a/lib/dojo/robotx.js +++ /dev/null @@ -1,173 +0,0 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ - - -if(!dojo._hasResource["dojo.robotx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.robotx"] = true; -dojo.provide("dojo.robotx"); -dojo.require("dojo.robot"); - - -dojo.experimental("dojo.robotx"); - -// loads an external app into an iframe and points dojo.doc to the iframe document, allowing the robot to control it -// to use: set robotURL in djConfig to the URL you want to load -// dojo.require this file - -(function(){ - -var iframe = null; - -var groupStarted=dojo.connect(doh, '_groupStarted', function(){ - dojo.disconnect(groupStarted); - iframe.style.visibility="visible"; -}); - -var attachIframe = function(){ - dojo.addOnLoad(function(){ - var emptyStyle = { - overflow: dojo.isWebKit? 'hidden' : 'visible', - margin: '0px', - borderWidth: '0px', - height: '100%', - width: '100%' - }; - dojo.style(document.documentElement, emptyStyle); - dojo.style(document.body, emptyStyle); - document.body.appendChild(iframe); - var base=document.createElement('base'); - base.href=iframe.src; - document.getElementsByTagName("head")[0].appendChild(base); - }); -}; - -// Prevent race conditions between iframe loading and robot init. -// If iframe is allowed to load while the robot is typing, sync XHRs can prevent the robot from completing its initialization. -var robotReady=false; -var robotFrame=null; -var _run=doh.robot._run; -doh.robot._run=function(frame){ - // Called from robot when the robot completed its initialization. - robotReady = true; - robotFrame = frame; - doh.robot._run=_run; - // If initRobot was already called, then attach the iframe. - if(iframe.src){ attachIframe(); } -} - -var onIframeLoad=function(){ - // initial load handler: update the document and start the tests - doh.robot._updateDocument(); - onIframeLoad = null; - var scrollRoot = (document.compatMode == 'BackCompat')? document.body : document.documentElement; - var consoleHeight = document.getElementById('robotconsole').offsetHeight; - if(consoleHeight){ - iframe.style.height = (scrollRoot.clientHeight - consoleHeight)+"px"; - } - // If dojo is present in the test case, then at least make a best effort to wait for it to load. - // The test must handle other race conditions like initial data queries by itself. - if(iframe.contentWindow.dojo){ - iframe.contentWindow.dojo.addOnLoad(function(){ - doh.robot._run(robotFrame); - }); - }else{ - doh.robot._run(robotFrame); - } -}; - -var iframeLoad=function(){ - if(onIframeLoad){ - onIframeLoad(); - } - var unloadConnect = dojo.connect(dojo.body(), 'onunload', function(){ - dojo.global = window; - dojo.doc = document; - dojo.disconnect(unloadConnect); - }); -}; - -// write the firebug console to a place it will fit -dojo.config.debugContainerId = "robotconsole"; -dojo.config.debugHeight = dojo.config.debugHeight || 200; -document.write('<div id="robotconsole" style="position:absolute;left:0px;bottom:0px;width:100%;"></div>'); - -// write the iframe -//document.writeln('<iframe id="robotapplication" style="visibility:hidden; border:0px none; padding:0px; margin:0px; position:absolute; left:0px; top:0px; width:100%; height:100%; z-index: 1;" src="'+dojo.config.robotURL+'" onload="iframeLoad();" ></iframe>'); -iframe = document.createElement('iframe'); -iframe.setAttribute("ALLOWTRANSPARENCY","true"); -iframe.scrolling = dojo.isIE? "yes" : "auto"; -dojo.style(iframe,{visibility:'hidden', border:'0px none', padding:'0px', margin:'0px', position:'absolute', left:'0px', top:'0px', width:'100%', height:'100%'}); -if(iframe['attachEvent'] !== undefined){ - iframe.attachEvent('onload', iframeLoad); -}else{ - dojo.connect(iframe, 'onload', iframeLoad); -} - - - - -dojo.mixin(doh.robot,{ - _updateDocument: function(){ - dojo.setContext(iframe.contentWindow, iframe.contentWindow.document); - var win = dojo.global; - if(win["dojo"]){ - // allow the tests to subscribe to topics published by the iframe - dojo._topics = win.dojo._topics; - } - - }, - - initRobot: function(/*String*/ url){ - // summary: - // Opens the application at the specified URL for testing, redirecting dojo to point to the application environment instead of the test environment. - // - // url: - // URL to open. Any of the test's dojo.doc calls (e.g. dojo.byId()), and any dijit.registry calls (e.g. dijit.byId()) will point to elements and widgets inside this application. - // - - iframe.src=url; - // see above note about race conditions - if(robotReady){ - attachIframe(); - - } - }, - - waitForPageToLoad: function(/*Function*/ submitActions){ - // summary: - // Notifies DOH that the doh.robot is about to make a page change in the application it is driving, - // returning a doh.Deferred object the user should return in their runTest function as part of a DOH test. - // - // description: - // Notifies DOH that the doh.robot is about to make a page change in the application it is driving, - // returning a doh.Deferred object the user should return in their runTest function as part of a DOH test. - // Example: - // runTest:function(){ - // return waitForPageLoad(function(){ doh.robot.keyPress(dojo.keys.ENTER, 500); }); - // } - // - // submitActions: - // The doh.robot will execute the actions the test passes into the submitActions argument (like clicking the submit button), - // expecting these actions to create a page change (like a form submit). - // After these actions execute and the resulting page loads, the next test will start. - // - - var d = new doh.Deferred(); - // create iframe event handler to track submit progress - onIframeLoad = function(){ - onIframeLoad = null; - // set dojo.doc on every page change to point to the iframe doc so the robot works - doh.robot._updateDocument(); - d.callback(true); - }; - submitActions(); - return d; - } - -}); -})(); - -} diff --git a/lib/dojo/rpc/JsonService.js b/lib/dojo/rpc/JsonService.js index 064fd0fe..5a755252 100644 --- a/lib/dojo/rpc/JsonService.js +++ b/lib/dojo/rpc/JsonService.js @@ -4,88 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.rpc.JsonService"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.rpc.JsonService"] = true; -dojo.provide("dojo.rpc.JsonService"); -dojo.require("dojo.rpc.RpcService"); - - -dojo.declare("dojo.rpc.JsonService", dojo.rpc.RpcService, { - bustCache: false, - contentType: "application/json-rpc", - lastSubmissionId: 0, - - callRemote: function(method, params){ - // summary: - // call an arbitrary remote method without requiring it to be - // predefined with SMD - // method: string - // the name of the remote method you want to call. - // params: array - // array of parameters to pass to method - - var deferred = new dojo.Deferred(); - this.bind(method, params, deferred); - return deferred; - }, - - bind: function(method, parameters, deferredRequestHandler, url){ - //summary: - // JSON-RPC bind method. Takes remote method, parameters, - // deferred, and a url, calls createRequest to make a JSON-RPC - // envelope and passes that off with bind. - // method: string - // The name of the method we are calling - // parameters: array - // The parameters we are passing off to the method - // deferredRequestHandler: deferred - // The Deferred object for this particular request - - var def = dojo.rawXhrPost({ - url: url||this.serviceUrl, - postData: this.createRequest(method, parameters), - contentType: this.contentType, - timeout: this.timeout, - handleAs: "json-comment-optional" - }); - def.addCallbacks(this.resultCallback(deferredRequestHandler), this.errorCallback(deferredRequestHandler)); - }, - - createRequest: function(method, params){ - // summary: - // create a JSON-RPC envelope for the request - // method: string - // The name of the method we are creating the requst for - // params: array - // The array of parameters for this request; - - var req = { "params": params, "method": method, "id": ++this.lastSubmissionId }; - var data = dojo.toJson(req); - return data; - }, - - parseResults: function(/*anything*/obj){ - //summary: - // parse the result envelope and pass the results back to - // the callback function - // obj: Object - // Object containing envelope of data we recieve from the server - - if(dojo.isObject(obj)){ - if("result" in obj){ - return obj.result; - } - if("Result" in obj){ - return obj.Result; - } - if("ResultSet" in obj){ - return obj.ResultSet; - } - } - return obj; - } - } -); - -} +//>>built +define("dojo/rpc/JsonService",["../main","./RpcService"],function(_1){_1.declare("dojo.rpc.JsonService",_1.rpc.RpcService,{bustCache:false,contentType:"application/json-rpc",lastSubmissionId:0,callRemote:function(_2,_3){var _4=new _1.Deferred();this.bind(_2,_3,_4);return _4;},bind:function(_5,_6,_7,_8){var _9=_1.rawXhrPost({url:_8||this.serviceUrl,postData:this.createRequest(_5,_6),contentType:this.contentType,timeout:this.timeout,handleAs:"json-comment-optional"});_9.addCallbacks(this.resultCallback(_7),this.errorCallback(_7));},createRequest:function(_a,_b){var _c={"params":_b,"method":_a,"id":++this.lastSubmissionId};return _1.toJson(_c);},parseResults:function(_d){if(_1.isObject(_d)){if("result" in _d){return _d.result;}if("Result" in _d){return _d.Result;}if("ResultSet" in _d){return _d.ResultSet;}}return _d;}});return _1.rpc.JsonService;}); \ No newline at end of file diff --git a/lib/dojo/rpc/JsonService.js.uncompressed.js b/lib/dojo/rpc/JsonService.js.uncompressed.js new file mode 100644 index 00000000..ae7703d9 --- /dev/null +++ b/lib/dojo/rpc/JsonService.js.uncompressed.js @@ -0,0 +1,85 @@ +define("dojo/rpc/JsonService", ["../main", "./RpcService"], function(dojo) { + // module: + // dojo/rpc/JsonService + // summary: + // TODOC + + +dojo.declare("dojo.rpc.JsonService", dojo.rpc.RpcService, { + bustCache: false, + contentType: "application/json-rpc", + lastSubmissionId: 0, + + callRemote: function(method, params){ + // summary: + // call an arbitrary remote method without requiring it to be + // predefined with SMD + // method: string + // the name of the remote method you want to call. + // params: array + // array of parameters to pass to method + + var deferred = new dojo.Deferred(); + this.bind(method, params, deferred); + return deferred; + }, + + bind: function(method, parameters, deferredRequestHandler, url){ + //summary: + // JSON-RPC bind method. Takes remote method, parameters, + // deferred, and a url, calls createRequest to make a JSON-RPC + // envelope and passes that off with bind. + // method: string + // The name of the method we are calling + // parameters: array + // The parameters we are passing off to the method + // deferredRequestHandler: deferred + // The Deferred object for this particular request + + var def = dojo.rawXhrPost({ + url: url||this.serviceUrl, + postData: this.createRequest(method, parameters), + contentType: this.contentType, + timeout: this.timeout, + handleAs: "json-comment-optional" + }); + def.addCallbacks(this.resultCallback(deferredRequestHandler), this.errorCallback(deferredRequestHandler)); + }, + + createRequest: function(method, params){ + // summary: + // create a JSON-RPC envelope for the request + // method: string + // The name of the method we are creating the requst for + // params: array + // The array of parameters for this request; + + var req = { "params": params, "method": method, "id": ++this.lastSubmissionId }; + return dojo.toJson(req); + }, + + parseResults: function(/*anything*/obj){ + //summary: + // parse the result envelope and pass the results back to + // the callback function + // obj: Object + // Object containing envelope of data we recieve from the server + + if(dojo.isObject(obj)){ + if("result" in obj){ + return obj.result; + } + if("Result" in obj){ + return obj.Result; + } + if("ResultSet" in obj){ + return obj.ResultSet; + } + } + return obj; + } + } +); + +return dojo.rpc.JsonService; +}); diff --git a/lib/dojo/rpc/JsonpService.js b/lib/dojo/rpc/JsonpService.js index ecdadc7f..7bb74e07 100644 --- a/lib/dojo/rpc/JsonpService.js +++ b/lib/dojo/rpc/JsonpService.js @@ -4,70 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.rpc.JsonpService"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.rpc.JsonpService"] = true; -dojo.provide("dojo.rpc.JsonpService"); -dojo.require("dojo.rpc.RpcService"); -dojo.require("dojo.io.script"); - - -dojo.declare("dojo.rpc.JsonpService", dojo.rpc.RpcService, { - // summary: - // Generic JSONP service. Minimally extends RpcService to allow - // easy definition of nearly any JSONP style service. Example - // SMD files exist in dojox.data - - constructor: function(args, requiredArgs){ - if(this.required) { - if(requiredArgs){ - dojo.mixin(this.required, requiredArgs); - } - - dojo.forEach(this.required, function(req){ - if(req=="" || req==undefined){ - throw new Error("Required Service Argument not found: "+req); - } - }); - } - }, - - strictArgChecks: false, - - bind: function(method, parameters, deferredRequestHandler, url){ - //summary: - // JSONP bind method. Takes remote method, parameters, - // deferred, and a url, calls createRequest to make a JSON-RPC - // envelope and passes that off with bind. - // method: string - // The name of the method we are calling - // parameters: array - // The parameters we are passing off to the method - // deferredRequestHandler: deferred - // The Deferred object for this particular request - - var def = dojo.io.script.get({ - url: url||this.serviceUrl, - callbackParamName: this.callbackParamName||"callback", - content: this.createRequest(parameters), - timeout: this.timeout, - handleAs: "json", - preventCache: true - }); - def.addCallbacks(this.resultCallback(deferredRequestHandler), this.errorCallback(deferredRequestHandler)); - }, - - createRequest: function(parameters){ - // summary: - // create a JSONP req - // params: array - // The array of parameters for this request; - - var params = (dojo.isArrayLike(parameters) && parameters.length==1) ? - parameters[0] : {}; - dojo.mixin(params,this.required); - return params; - } -}); - -} +//>>built +define("dojo/rpc/JsonpService",["../main","./RpcService","../io/script"],function(_1){_1.declare("dojo.rpc.JsonpService",_1.rpc.RpcService,{constructor:function(_2,_3){if(this.required){if(_3){_1.mixin(this.required,_3);}_1.forEach(this.required,function(_4){if(_4==""||_4==undefined){throw new Error("Required Service Argument not found: "+_4);}});}},strictArgChecks:false,bind:function(_5,_6,_7,_8){var _9=_1.io.script.get({url:_8||this.serviceUrl,callbackParamName:this.callbackParamName||"callback",content:this.createRequest(_6),timeout:this.timeout,handleAs:"json",preventCache:true});_9.addCallbacks(this.resultCallback(_7),this.errorCallback(_7));},createRequest:function(_a){var _b=(_1.isArrayLike(_a)&&_a.length==1)?_a[0]:{};_1.mixin(_b,this.required);return _b;}});return _1.rpc.JsonpService;}); \ No newline at end of file diff --git a/lib/dojo/rpc/JsonpService.js.uncompressed.js b/lib/dojo/rpc/JsonpService.js.uncompressed.js new file mode 100644 index 00000000..bc1d7108 --- /dev/null +++ b/lib/dojo/rpc/JsonpService.js.uncompressed.js @@ -0,0 +1,67 @@ +define("dojo/rpc/JsonpService", ["../main", "./RpcService", "../io/script"], function(dojo) { + // module: + // dojo/rpc/JsonpService + // summary: + // TODOC + + +dojo.declare("dojo.rpc.JsonpService", dojo.rpc.RpcService, { + // summary: + // Generic JSONP service. Minimally extends RpcService to allow + // easy definition of nearly any JSONP style service. Example + // SMD files exist in dojox.data + + constructor: function(args, requiredArgs){ + if(this.required) { + if(requiredArgs){ + dojo.mixin(this.required, requiredArgs); + } + + dojo.forEach(this.required, function(req){ + if(req=="" || req==undefined){ + throw new Error("Required Service Argument not found: "+req); + } + }); + } + }, + + strictArgChecks: false, + + bind: function(method, parameters, deferredRequestHandler, url){ + //summary: + // JSONP bind method. Takes remote method, parameters, + // deferred, and a url, calls createRequest to make a JSON-RPC + // envelope and passes that off with bind. + // method: string + // The name of the method we are calling + // parameters: array + // The parameters we are passing off to the method + // deferredRequestHandler: deferred + // The Deferred object for this particular request + + var def = dojo.io.script.get({ + url: url||this.serviceUrl, + callbackParamName: this.callbackParamName||"callback", + content: this.createRequest(parameters), + timeout: this.timeout, + handleAs: "json", + preventCache: true + }); + def.addCallbacks(this.resultCallback(deferredRequestHandler), this.errorCallback(deferredRequestHandler)); + }, + + createRequest: function(parameters){ + // summary: + // create a JSONP req + // params: array + // The array of parameters for this request; + + var params = (dojo.isArrayLike(parameters) && parameters.length==1) ? + parameters[0] : {}; + dojo.mixin(params,this.required); + return params; + } +}); + +return dojo.rpc.JsonpService; +}); diff --git a/lib/dojo/rpc/RpcService.js b/lib/dojo/rpc/RpcService.js index 5ef5dae7..e504818b 100644 --- a/lib/dojo/rpc/RpcService.js +++ b/lib/dojo/rpc/RpcService.js @@ -4,177 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.rpc.RpcService"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.rpc.RpcService"] = true; -dojo.provide("dojo.rpc.RpcService"); - - -dojo.declare("dojo.rpc.RpcService", null, { - constructor: function(args){ - //summary: - //Take a string as a url to retrieve an smd or an object that is an smd or partial smd to use - //as a definition for the service - // - // args: object - // Takes a number of properties as kwArgs for defining the service. It also - // accepts a string. When passed a string, it is treated as a url from - // which it should synchronously retrieve an smd file. Otherwise it is a kwArgs - // object. It accepts serviceUrl, to manually define a url for the rpc service - // allowing the rpc system to be used without an smd definition. strictArgChecks - // forces the system to verify that the # of arguments provided in a call - // matches those defined in the smd. smdString allows a developer to pass - // a jsonString directly, which will be converted into an object or alternatively - // smdObject is accepts an smdObject directly. - // - if(args){ - //if the arg is a string, we assume it is a url to retrieve an smd definition from - if( (dojo.isString(args)) || (args instanceof dojo._Url)){ - if (args instanceof dojo._Url){ - var url = args + ""; - }else{ - url = args; - } - var def = dojo.xhrGet({ - url: url, - handleAs: "json-comment-optional", - sync: true - }); - - def.addCallback(this, "processSmd"); - def.addErrback(function() { - throw new Error("Unable to load SMD from " + args); - }); - - }else if(args.smdStr){ - this.processSmd(dojo.eval("("+args.smdStr+")")); - }else{ - // otherwise we assume it's an arguments object with the following - // (optional) properties: - // - serviceUrl - // - strictArgChecks - // - smdStr - // - smdObj - - if(args.serviceUrl){ - this.serviceUrl = args.serviceUrl; - } - - this.timeout = args.timeout || 3000; - - if("strictArgChecks" in args){ - this.strictArgChecks = args.strictArgChecks; - } - - this.processSmd(args); - } - } - }, - - strictArgChecks: true, - serviceUrl: "", - - parseResults: function(obj){ - // summary - // parse the results coming back from an rpc request. this - // base implementation, just returns the full object - // subclasses should parse and only return the actual results - // obj: Object - // Object that is the return results from an rpc request - return obj; - }, - - errorCallback: function(/* dojo.Deferred */ deferredRequestHandler){ - // summary: - // create callback that calls the Deferres errback method - // deferredRequestHandler: Deferred - // The deferred object handling a request. - return function(data){ - deferredRequestHandler.errback(data.message); - }; - }, - - resultCallback: function(/* dojo.Deferred */ deferredRequestHandler){ - // summary: - // create callback that calls the Deferred's callback method - // deferredRequestHandler: Deferred - // The deferred object handling a request. - - var tf = dojo.hitch(this, - function(obj){ - if(obj.error!=null){ - var err; - if(typeof obj.error == 'object'){ - err = new Error(obj.error.message); - err.code = obj.error.code; - err.error = obj.error.error; - }else{ - err = new Error(obj.error); - } - err.id = obj.id; - err.errorObject = obj; - deferredRequestHandler.errback(err); - }else{ - deferredRequestHandler.callback(this.parseResults(obj)); - } - } - ); - return tf; - }, - - generateMethod: function(/*string*/ method, /*array*/ parameters, /*string*/ url){ - // summary: - // generate the local bind methods for the remote object - // method: string - // The name of the method we are generating - // parameters: array - // the array of parameters for this call. - // url: string - // the service url for this call - - return dojo.hitch(this, function(){ - var deferredRequestHandler = new dojo.Deferred(); - - // if params weren't specified, then we can assume it's varargs - if( (this.strictArgChecks) && - (parameters != null) && - (arguments.length != parameters.length) - ){ - // put error stuff here, no enough params - throw new Error("Invalid number of parameters for remote method."); - }else{ - this.bind(method, dojo._toArray(arguments), deferredRequestHandler, url); - } - - return deferredRequestHandler; - }); - }, - - processSmd: function(object){ - // summary: - // callback method for reciept of a smd object. Parse the smd - // and generate functions based on the description - // object: - // smd object defining this service. - - if(object.methods){ - dojo.forEach(object.methods, function(m){ - if(m && m.name){ - this[m.name] = this.generateMethod( m.name, - m.parameters, - m.url||m.serviceUrl||m.serviceURL); - if(!dojo.isFunction(this[m.name])){ - throw new Error("RpcService: Failed to create" + m.name + "()"); - /*console.log("RpcService: Failed to create", m.name, "()");*/ - } - } - }, this); - } - - this.serviceUrl = object.serviceUrl||object.serviceURL; - this.required = object.required; - this.smd = object; - } -}); - -} +//>>built +define("dojo/rpc/RpcService",["../main","../_base/url"],function(_1){_1.declare("dojo.rpc.RpcService",null,{constructor:function(_2){if(_2){if((_1.isString(_2))||(_2 instanceof _1._Url)){if(_2 instanceof _1._Url){var _3=_2+"";}else{_3=_2;}var _4=_1.xhrGet({url:_3,handleAs:"json-comment-optional",sync:true});_4.addCallback(this,"processSmd");_4.addErrback(function(){throw new Error("Unable to load SMD from "+_2);});}else{if(_2.smdStr){this.processSmd(_1.eval("("+_2.smdStr+")"));}else{if(_2.serviceUrl){this.serviceUrl=_2.serviceUrl;}this.timeout=_2.timeout||3000;if("strictArgChecks" in _2){this.strictArgChecks=_2.strictArgChecks;}this.processSmd(_2);}}}},strictArgChecks:true,serviceUrl:"",parseResults:function(_5){return _5;},errorCallback:function(_6){return function(_7){_6.errback(_7.message);};},resultCallback:function(_8){return _1.hitch(this,function(_9){if(_9.error!=null){var _a;if(typeof _9.error=="object"){_a=new Error(_9.error.message);_a.code=_9.error.code;_a.error=_9.error.error;}else{_a=new Error(_9.error);}_a.id=_9.id;_a.errorObject=_9;_8.errback(_a);}else{_8.callback(this.parseResults(_9));}});},generateMethod:function(_b,_c,_d){return _1.hitch(this,function(){var _e=new _1.Deferred();if((this.strictArgChecks)&&(_c!=null)&&(arguments.length!=_c.length)){throw new Error("Invalid number of parameters for remote method.");}else{this.bind(_b,_1._toArray(arguments),_e,_d);}return _e;});},processSmd:function(_f){if(_f.methods){_1.forEach(_f.methods,function(m){if(m&&m.name){this[m.name]=this.generateMethod(m.name,m.parameters,m.url||m.serviceUrl||m.serviceURL);if(!_1.isFunction(this[m.name])){throw new Error("RpcService: Failed to create"+m.name+"()");}}},this);}this.serviceUrl=_f.serviceUrl||_f.serviceURL;this.required=_f.required;this.smd=_f;}});return _1.rpc.RpcService;}); \ No newline at end of file diff --git a/lib/dojo/rpc/RpcService.js.uncompressed.js b/lib/dojo/rpc/RpcService.js.uncompressed.js new file mode 100644 index 00000000..3675dadf --- /dev/null +++ b/lib/dojo/rpc/RpcService.js.uncompressed.js @@ -0,0 +1,175 @@ +define("dojo/rpc/RpcService", ["../main", "../_base/url"], function(dojo) { + // module: + // dojo/rpc/RpcService + // summary: + // TODOC + + +dojo.declare("dojo.rpc.RpcService", null, { + constructor: function(args){ + //summary: + //Take a string as a url to retrieve an smd or an object that is an smd or partial smd to use + //as a definition for the service + // + // args: object + // Takes a number of properties as kwArgs for defining the service. It also + // accepts a string. When passed a string, it is treated as a url from + // which it should synchronously retrieve an smd file. Otherwise it is a kwArgs + // object. It accepts serviceUrl, to manually define a url for the rpc service + // allowing the rpc system to be used without an smd definition. strictArgChecks + // forces the system to verify that the # of arguments provided in a call + // matches those defined in the smd. smdString allows a developer to pass + // a jsonString directly, which will be converted into an object or alternatively + // smdObject is accepts an smdObject directly. + // + if(args){ + //if the arg is a string, we assume it is a url to retrieve an smd definition from + if( (dojo.isString(args)) || (args instanceof dojo._Url)){ + if (args instanceof dojo._Url){ + var url = args + ""; + }else{ + url = args; + } + var def = dojo.xhrGet({ + url: url, + handleAs: "json-comment-optional", + sync: true + }); + + def.addCallback(this, "processSmd"); + def.addErrback(function() { + throw new Error("Unable to load SMD from " + args); + }); + + }else if(args.smdStr){ + this.processSmd(dojo.eval("("+args.smdStr+")")); + }else{ + // otherwise we assume it's an arguments object with the following + // (optional) properties: + // - serviceUrl + // - strictArgChecks + // - smdStr + // - smdObj + + if(args.serviceUrl){ + this.serviceUrl = args.serviceUrl; + } + + this.timeout = args.timeout || 3000; + + if("strictArgChecks" in args){ + this.strictArgChecks = args.strictArgChecks; + } + + this.processSmd(args); + } + } + }, + + strictArgChecks: true, + serviceUrl: "", + + parseResults: function(obj){ + // summary: + // parse the results coming back from an rpc request. this + // base implementation, just returns the full object + // subclasses should parse and only return the actual results + // obj: Object + // Object that is the return results from an rpc request + return obj; + }, + + errorCallback: function(/* dojo.Deferred */ deferredRequestHandler){ + // summary: + // create callback that calls the Deferres errback method + // deferredRequestHandler: Deferred + // The deferred object handling a request. + return function(data){ + deferredRequestHandler.errback(data.message); + }; + }, + + resultCallback: function(/* dojo.Deferred */ deferredRequestHandler){ + // summary: + // create callback that calls the Deferred's callback method + // deferredRequestHandler: Deferred + // The deferred object handling a request. + + return dojo.hitch(this, + function(obj){ + if(obj.error!=null){ + var err; + if(typeof obj.error == 'object'){ + err = new Error(obj.error.message); + err.code = obj.error.code; + err.error = obj.error.error; + }else{ + err = new Error(obj.error); + } + err.id = obj.id; + err.errorObject = obj; + deferredRequestHandler.errback(err); + }else{ + deferredRequestHandler.callback(this.parseResults(obj)); + } + } + ); + }, + + generateMethod: function(/*string*/ method, /*array*/ parameters, /*string*/ url){ + // summary: + // generate the local bind methods for the remote object + // method: string + // The name of the method we are generating + // parameters: array + // the array of parameters for this call. + // url: string + // the service url for this call + + return dojo.hitch(this, function(){ + var deferredRequestHandler = new dojo.Deferred(); + + // if params weren't specified, then we can assume it's varargs + if( (this.strictArgChecks) && + (parameters != null) && + (arguments.length != parameters.length) + ){ + // put error stuff here, no enough params + throw new Error("Invalid number of parameters for remote method."); + }else{ + this.bind(method, dojo._toArray(arguments), deferredRequestHandler, url); + } + + return deferredRequestHandler; + }); + }, + + processSmd: function(object){ + // summary: + // callback method for reciept of a smd object. Parse the smd + // and generate functions based on the description + // object: + // smd object defining this service. + + if(object.methods){ + dojo.forEach(object.methods, function(m){ + if(m && m.name){ + this[m.name] = this.generateMethod( m.name, + m.parameters, + m.url||m.serviceUrl||m.serviceURL); + if(!dojo.isFunction(this[m.name])){ + throw new Error("RpcService: Failed to create" + m.name + "()"); + /*console.log("RpcService: Failed to create", m.name, "()");*/ + } + } + }, this); + } + + this.serviceUrl = object.serviceUrl||object.serviceURL; + this.required = object.required; + this.smd = object; + } +}); + +return dojo.rpc.RpcService; +}); diff --git a/lib/dojo/selector/_loader.js b/lib/dojo/selector/_loader.js new file mode 100644 index 00000000..68db99f0 --- /dev/null +++ b/lib/dojo/selector/_loader.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/selector/_loader",["../has","require"],function(_1,_2){"use strict";var _3=document.createElement("div");_1.add("dom-qsa2.1",!!_3.querySelectorAll);_1.add("dom-qsa3",function(){try{_3.innerHTML="<p class='TEST'></p>";return _3.querySelectorAll(".TEST:empty").length==1;}catch(e){}});var _4;var _5="./acme",_6="./lite";return {load:function(id,_7,_8,_9){var _a=_2;id=id=="default"?_1("config-selectorEngine")||"css3":id;id=id=="css2"||id=="lite"?_6:id=="css2.1"?_1("dom-qsa2.1")?_6:_5:id=="css3"?_1("dom-qsa3")?_6:_5:id=="acme"?_5:(_a=_7)&&id;if(id.charAt(id.length-1)=="?"){id=id.substring(0,id.length-1);var _b=true;}if(_b&&(_1("dom-compliant-qsa")||_4)){return _8(_4);}_a([id],function(_c){if(id!="./lite"){_4=_c;}_8(_c);});}};}); \ No newline at end of file diff --git a/lib/dojo/selector/_loader.js.uncompressed.js b/lib/dojo/selector/_loader.js.uncompressed.js new file mode 100644 index 00000000..9543069e --- /dev/null +++ b/lib/dojo/selector/_loader.js.uncompressed.js @@ -0,0 +1,45 @@ +define("dojo/selector/_loader", ["../has", "require"], + function(has, require){ +// summary: +// This module handles loading the appropriate selector engine for the given browser +"use strict"; +var testDiv = document.createElement("div"); +has.add("dom-qsa2.1", !!testDiv.querySelectorAll); +has.add("dom-qsa3", function(){ + // test to see if we have a reasonable native selector engine available + try{ + testDiv.innerHTML = "<p class='TEST'></p>"; // test kind of from sizzle + // Safari can't handle uppercase or unicode characters when + // in quirks mode, IE8 can't handle pseudos like :empty + return testDiv.querySelectorAll(".TEST:empty").length == 1; + }catch(e){} + }); +var fullEngine; +var acme = "./acme", lite = "./lite"; +return { + load: function(id, parentRequire, loaded, config){ + var req = require; + // here we implement the default logic for choosing a selector engine + id = id == "default" ? has("config-selectorEngine") || "css3" : id; + id = id == "css2" || id == "lite" ? lite : + id == "css2.1" ? has("dom-qsa2.1") ? lite : acme : + id == "css3" ? has("dom-qsa3") ? lite : acme : + id == "acme" ? acme : (req = parentRequire) && id; + if(id.charAt(id.length-1) == '?'){ + id = id.substring(0,id.length - 1); + var optionalLoad = true; + } + // the query engine is optional, only load it if a native one is not available or existing one has not been loaded + if(optionalLoad && (has("dom-compliant-qsa") || fullEngine)){ + return loaded(fullEngine); + } + // load the referenced selector engine + req([id], function(engine){ + if(id != "./lite"){ + fullEngine = engine; + } + loaded(engine); + }); + } +}; +}); diff --git a/lib/dojo/selector/acme.js b/lib/dojo/selector/acme.js new file mode 100644 index 00000000..e75fbf0f --- /dev/null +++ b/lib/dojo/selector/acme.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/selector/acme",["../_base/kernel","../has","../dom","../_base/sniff","../_base/array","../_base/lang","../_base/window"],function(_1,_2,_3){var _4=_1.trim;var _5=_1.forEach;var _6=function(){return _1.doc;};var _7=((_1.isWebKit||_1.isMozilla)&&((_6().compatMode)=="BackCompat"));var _8=">~+";var _9=false;var _a=function(){return true;};var _b=function(_c){if(_8.indexOf(_c.slice(-1))>=0){_c+=" * ";}else{_c+=" ";}var ts=function(s,e){return _4(_c.slice(s,e));};var _d=[];var _e=-1,_f=-1,_10=-1,_11=-1,_12=-1,_13=-1,_14=-1,lc="",cc="",_15;var x=0,ql=_c.length,_16=null,_17=null;var _18=function(){if(_14>=0){var tv=(_14==x)?null:ts(_14,x);_16[(_8.indexOf(tv)<0)?"tag":"oper"]=tv;_14=-1;}};var _19=function(){if(_13>=0){_16.id=ts(_13,x).replace(/\\/g,"");_13=-1;}};var _1a=function(){if(_12>=0){_16.classes.push(ts(_12+1,x).replace(/\\/g,""));_12=-1;}};var _1b=function(){_19();_18();_1a();};var _1c=function(){_1b();if(_11>=0){_16.pseudos.push({name:ts(_11+1,x)});}_16.loops=(_16.pseudos.length||_16.attrs.length||_16.classes.length);_16.oquery=_16.query=ts(_15,x);_16.otag=_16.tag=(_16["oper"])?null:(_16.tag||"*");if(_16.tag){_16.tag=_16.tag.toUpperCase();}if(_d.length&&(_d[_d.length-1].oper)){_16.infixOper=_d.pop();_16.query=_16.infixOper.query+" "+_16.query;}_d.push(_16);_16=null;};for(;lc=cc,cc=_c.charAt(x),x<ql;x++){if(lc=="\\"){continue;}if(!_16){_15=x;_16={query:null,pseudos:[],attrs:[],classes:[],tag:null,oper:null,id:null,getTag:function(){return (_9)?this.otag:this.tag;}};_14=x;}if(_e>=0){if(cc=="]"){if(!_17.attr){_17.attr=ts(_e+1,x);}else{_17.matchFor=ts((_10||_e+1),x);}var cmf=_17.matchFor;if(cmf){if((cmf.charAt(0)=="\"")||(cmf.charAt(0)=="'")){_17.matchFor=cmf.slice(1,-1);}}_16.attrs.push(_17);_17=null;_e=_10=-1;}else{if(cc=="="){var _1d=("|~^$*".indexOf(lc)>=0)?lc:"";_17.type=_1d+cc;_17.attr=ts(_e+1,x-_1d.length);_10=x+1;}}}else{if(_f>=0){if(cc==")"){if(_11>=0){_17.value=ts(_f+1,x);}_11=_f=-1;}}else{if(cc=="#"){_1b();_13=x+1;}else{if(cc=="."){_1b();_12=x;}else{if(cc==":"){_1b();_11=x;}else{if(cc=="["){_1b();_e=x;_17={};}else{if(cc=="("){if(_11>=0){_17={name:ts(_11+1,x),value:null};_16.pseudos.push(_17);}_f=x;}else{if((cc==" ")&&(lc!=cc)){_1c();}}}}}}}}}return _d;};var _1e=function(_1f,_20){if(!_1f){return _20;}if(!_20){return _1f;}return function(){return _1f.apply(window,arguments)&&_20.apply(window,arguments);};};var _21=function(i,arr){var r=arr||[];if(i){r.push(i);}return r;};var _22=function(n){return (1==n.nodeType);};var _23="";var _24=function(_25,_26){if(!_25){return _23;}if(_26=="class"){return _25.className||_23;}if(_26=="for"){return _25.htmlFor||_23;}if(_26=="style"){return _25.style.cssText||_23;}return (_9?_25.getAttribute(_26):_25.getAttribute(_26,2))||_23;};var _27={"*=":function(_28,_29){return function(_2a){return (_24(_2a,_28).indexOf(_29)>=0);};},"^=":function(_2b,_2c){return function(_2d){return (_24(_2d,_2b).indexOf(_2c)==0);};},"$=":function(_2e,_2f){return function(_30){var ea=" "+_24(_30,_2e);return (ea.lastIndexOf(_2f)==(ea.length-_2f.length));};},"~=":function(_31,_32){var _33=" "+_32+" ";return function(_34){var ea=" "+_24(_34,_31)+" ";return (ea.indexOf(_33)>=0);};},"|=":function(_35,_36){var _37=_36+"-";return function(_38){var ea=_24(_38,_35);return ((ea==_36)||(ea.indexOf(_37)==0));};},"=":function(_39,_3a){return function(_3b){return (_24(_3b,_39)==_3a);};}};var _3c=(typeof _6().firstChild.nextElementSibling=="undefined");var _3d=!_3c?"nextElementSibling":"nextSibling";var _3e=!_3c?"previousElementSibling":"previousSibling";var _3f=(_3c?_22:_a);var _40=function(_41){while(_41=_41[_3e]){if(_3f(_41)){return false;}}return true;};var _42=function(_43){while(_43=_43[_3d]){if(_3f(_43)){return false;}}return true;};var _44=function(_45){var _46=_45.parentNode;var i=0,_47=_46.children||_46.childNodes,ci=(_45["_i"]||-1),cl=(_46["_l"]||-1);if(!_47){return -1;}var l=_47.length;if(cl==l&&ci>=0&&cl>=0){return ci;}_46["_l"]=l;ci=-1;for(var te=_46["firstElementChild"]||_46["firstChild"];te;te=te[_3d]){if(_3f(te)){te["_i"]=++i;if(_45===te){ci=i;}}}return ci;};var _48=function(_49){return !((_44(_49))%2);};var _4a=function(_4b){return ((_44(_4b))%2);};var _4c={"checked":function(_4d,_4e){return function(_4f){return !!("checked" in _4f?_4f.checked:_4f.selected);};},"first-child":function(){return _40;},"last-child":function(){return _42;},"only-child":function(_50,_51){return function(_52){return _40(_52)&&_42(_52);};},"empty":function(_53,_54){return function(_55){var cn=_55.childNodes;var cnl=_55.childNodes.length;for(var x=cnl-1;x>=0;x--){var nt=cn[x].nodeType;if((nt===1)||(nt==3)){return false;}}return true;};},"contains":function(_56,_57){var cz=_57.charAt(0);if(cz=="\""||cz=="'"){_57=_57.slice(1,-1);}return function(_58){return (_58.innerHTML.indexOf(_57)>=0);};},"not":function(_59,_5a){var p=_b(_5a)[0];var _5b={el:1};if(p.tag!="*"){_5b.tag=1;}if(!p.classes.length){_5b.classes=1;}var ntf=_5c(p,_5b);return function(_5d){return (!ntf(_5d));};},"nth-child":function(_5e,_5f){var pi=parseInt;if(_5f=="odd"){return _4a;}else{if(_5f=="even"){return _48;}}if(_5f.indexOf("n")!=-1){var _60=_5f.split("n",2);var _61=_60[0]?((_60[0]=="-")?-1:pi(_60[0])):1;var idx=_60[1]?pi(_60[1]):0;var lb=0,ub=-1;if(_61>0){if(idx<0){idx=(idx%_61)&&(_61+(idx%_61));}else{if(idx>0){if(idx>=_61){lb=idx-idx%_61;}idx=idx%_61;}}}else{if(_61<0){_61*=-1;if(idx>0){ub=idx;idx=idx%_61;}}}if(_61>0){return function(_62){var i=_44(_62);return (i>=lb)&&(ub<0||i<=ub)&&((i%_61)==idx);};}else{_5f=idx;}}var _63=pi(_5f);return function(_64){return (_44(_64)==_63);};}};var _65=(_1.isIE&&(_1.isIE<9||_1.isQuirks))?function(_66){var clc=_66.toLowerCase();if(clc=="class"){_66="className";}return function(_67){return (_9?_67.getAttribute(_66):_67[_66]||_67[clc]);};}:function(_68){return function(_69){return (_69&&_69.getAttribute&&_69.hasAttribute(_68));};};var _5c=function(_6a,_6b){if(!_6a){return _a;}_6b=_6b||{};var ff=null;if(!("el" in _6b)){ff=_1e(ff,_22);}if(!("tag" in _6b)){if(_6a.tag!="*"){ff=_1e(ff,function(_6c){return (_6c&&(_6c.tagName==_6a.getTag()));});}}if(!("classes" in _6b)){_5(_6a.classes,function(_6d,idx,arr){var re=new RegExp("(?:^|\\s)"+_6d+"(?:\\s|$)");ff=_1e(ff,function(_6e){return re.test(_6e.className);});ff.count=idx;});}if(!("pseudos" in _6b)){_5(_6a.pseudos,function(_6f){var pn=_6f.name;if(_4c[pn]){ff=_1e(ff,_4c[pn](pn,_6f.value));}});}if(!("attrs" in _6b)){_5(_6a.attrs,function(_70){var _71;var a=_70.attr;if(_70.type&&_27[_70.type]){_71=_27[_70.type](a,_70.matchFor);}else{if(a.length){_71=_65(a);}}if(_71){ff=_1e(ff,_71);}});}if(!("id" in _6b)){if(_6a.id){ff=_1e(ff,function(_72){return (!!_72&&(_72.id==_6a.id));});}}if(!ff){if(!("default" in _6b)){ff=_a;}}return ff;};var _73=function(_74){return function(_75,ret,bag){while(_75=_75[_3d]){if(_3c&&(!_22(_75))){continue;}if((!bag||_76(_75,bag))&&_74(_75)){ret.push(_75);}break;}return ret;};};var _77=function(_78){return function(_79,ret,bag){var te=_79[_3d];while(te){if(_3f(te)){if(bag&&!_76(te,bag)){break;}if(_78(te)){ret.push(te);}}te=te[_3d];}return ret;};};var _7a=function(_7b){_7b=_7b||_a;return function(_7c,ret,bag){var te,x=0,_7d=_7c.children||_7c.childNodes;while(te=_7d[x++]){if(_3f(te)&&(!bag||_76(te,bag))&&(_7b(te,x))){ret.push(te);}}return ret;};};var _7e=function(_7f,_80){var pn=_7f.parentNode;while(pn){if(pn==_80){break;}pn=pn.parentNode;}return !!pn;};var _81={};var _82=function(_83){var _84=_81[_83.query];if(_84){return _84;}var io=_83.infixOper;var _85=(io?io.oper:"");var _86=_5c(_83,{el:1});var qt=_83.tag;var _87=("*"==qt);var ecs=_6()["getElementsByClassName"];if(!_85){if(_83.id){_86=(!_83.loops&&_87)?_a:_5c(_83,{el:1,id:1});_84=function(_88,arr){var te=_3.byId(_83.id,(_88.ownerDocument||_88));if(!te||!_86(te)){return;}if(9==_88.nodeType){return _21(te,arr);}else{if(_7e(te,_88)){return _21(te,arr);}}};}else{if(ecs&&/\{\s*\[native code\]\s*\}/.test(String(ecs))&&_83.classes.length&&!_7){_86=_5c(_83,{el:1,classes:1,id:1});var _89=_83.classes.join(" ");_84=function(_8a,arr,bag){var ret=_21(0,arr),te,x=0;var _8b=_8a.getElementsByClassName(_89);while((te=_8b[x++])){if(_86(te,_8a)&&_76(te,bag)){ret.push(te);}}return ret;};}else{if(!_87&&!_83.loops){_84=function(_8c,arr,bag){var ret=_21(0,arr),te,x=0;var _8d=_8c.getElementsByTagName(_83.getTag());while((te=_8d[x++])){if(_76(te,bag)){ret.push(te);}}return ret;};}else{_86=_5c(_83,{el:1,tag:1,id:1});_84=function(_8e,arr,bag){var ret=_21(0,arr),te,x=0;var _8f=_8e.getElementsByTagName(_83.getTag());while((te=_8f[x++])){if(_86(te,_8e)&&_76(te,bag)){ret.push(te);}}return ret;};}}}}else{var _90={el:1};if(_87){_90.tag=1;}_86=_5c(_83,_90);if("+"==_85){_84=_73(_86);}else{if("~"==_85){_84=_77(_86);}else{if(">"==_85){_84=_7a(_86);}}}}return _81[_83.query]=_84;};var _91=function(_92,_93){var _94=_21(_92),qp,x,te,qpl=_93.length,bag,ret;for(var i=0;i<qpl;i++){ret=[];qp=_93[i];x=_94.length-1;if(x>0){bag={};ret.nozip=true;}var gef=_82(qp);for(var j=0;(te=_94[j]);j++){gef(te,ret,bag);}if(!ret.length){break;}_94=ret;}return ret;};var _95={},_96={};var _97=function(_98){var _99=_b(_4(_98));if(_99.length==1){var tef=_82(_99[0]);return function(_9a){var r=tef(_9a,[]);if(r){r.nozip=true;}return r;};}return function(_9b){return _91(_9b,_99);};};var nua=navigator.userAgent;var wk="WebKit/";var _9c=(_1.isWebKit&&(nua.indexOf(wk)>0)&&(parseFloat(nua.split(wk)[1])>528));var _9d=_1.isIE?"commentStrip":"nozip";var qsa="querySelectorAll";var _9e=(!!_6()[qsa]&&(!_1.isSafari||(_1.isSafari>3.1)||_9c));var _9f=/n\+\d|([^ ])?([>~+])([^ =])?/g;var _a0=function(_a1,pre,ch,_a2){return ch?(pre?pre+" ":"")+ch+(_a2?" "+_a2:""):_a1;};var _a3=function(_a4,_a5){_a4=_a4.replace(_9f,_a0);if(_9e){var _a6=_96[_a4];if(_a6&&!_a5){return _a6;}}var _a7=_95[_a4];if(_a7){return _a7;}var qcz=_a4.charAt(0);var _a8=(-1==_a4.indexOf(" "));if((_a4.indexOf("#")>=0)&&(_a8)){_a5=true;}var _a9=(_9e&&(!_a5)&&(_8.indexOf(qcz)==-1)&&(!_1.isIE||(_a4.indexOf(":")==-1))&&(!(_7&&(_a4.indexOf(".")>=0)))&&(_a4.indexOf(":contains")==-1)&&(_a4.indexOf(":checked")==-1)&&(_a4.indexOf("|=")==-1));if(_a9){var tq=(_8.indexOf(_a4.charAt(_a4.length-1))>=0)?(_a4+" *"):_a4;return _96[_a4]=function(_aa){try{if(!((9==_aa.nodeType)||_a8)){throw "";}var r=_aa[qsa](tq);r[_9d]=true;return r;}catch(e){return _a3(_a4,true)(_aa);}};}else{var _ab=_a4.split(/\s*,\s*/);return _95[_a4]=((_ab.length<2)?_97(_a4):function(_ac){var _ad=0,ret=[],tp;while((tp=_ab[_ad++])){ret=ret.concat(_97(tp)(_ac));}return ret;});}};var _ae=0;var _af=_1.isIE?function(_b0){if(_9){return (_b0.getAttribute("_uid")||_b0.setAttribute("_uid",++_ae)||_ae);}else{return _b0.uniqueID;}}:function(_b1){return (_b1._uid||(_b1._uid=++_ae));};var _76=function(_b2,bag){if(!bag){return 1;}var id=_af(_b2);if(!bag[id]){return bag[id]=1;}return 0;};var _b3="_zipIdx";var _b4=function(arr){if(arr&&arr.nozip){return arr;}var ret=[];if(!arr||!arr.length){return ret;}if(arr[0]){ret.push(arr[0]);}if(arr.length<2){return ret;}_ae++;if(_1.isIE&&_9){var _b5=_ae+"";arr[0].setAttribute(_b3,_b5);for(var x=1,te;te=arr[x];x++){if(arr[x].getAttribute(_b3)!=_b5){ret.push(te);}te.setAttribute(_b3,_b5);}}else{if(_1.isIE&&arr.commentStrip){try{for(var x=1,te;te=arr[x];x++){if(_22(te)){ret.push(te);}}}catch(e){}}else{if(arr[0]){arr[0][_b3]=_ae;}for(var x=1,te;te=arr[x];x++){if(arr[x][_b3]!=_ae){ret.push(te);}te[_b3]=_ae;}}}return ret;};var _b6=function(_b7,_b8){_b8=_b8||_6();var od=_b8.ownerDocument||_b8.documentElement;_9=(_b8.contentType&&_b8.contentType=="application/xml")||(_1.isOpera&&(_b8.doctype||od.toString()=="[object XMLDocument]"))||(!!od)&&(_1.isIE?od.xml:(_b8.xmlVersion||od.xmlVersion));var r=_a3(_b7)(_b8);if(r&&r.nozip){return r;}return _b4(r);};_b6.filter=function(_b9,_ba,_bb){var _bc=[],_bd=_b(_ba),_be=(_bd.length==1&&!/[^\w#\.]/.test(_ba))?_5c(_bd[0]):function(_bf){return _1.query(_ba,_bb).indexOf(_bf)!=-1;};for(var x=0,te;te=_b9[x];x++){if(_be(te)){_bc.push(te);}}return _bc;};return _b6;}); \ No newline at end of file diff --git a/lib/dojo/selector/acme.js.uncompressed.js b/lib/dojo/selector/acme.js.uncompressed.js new file mode 100644 index 00000000..641478ec --- /dev/null +++ b/lib/dojo/selector/acme.js.uncompressed.js @@ -0,0 +1,1480 @@ +define("dojo/selector/acme", ["../_base/kernel", "../has", "../dom", "../_base/sniff", "../_base/array", "../_base/lang", "../_base/window"], function(dojo, has, dom){ + // module: + // dojo/selector/acme + // summary: + // This module defines the Acme selector engine + +/* + acme architectural overview: + + acme is a relatively full-featured CSS3 query library. It is + designed to take any valid CSS3 selector and return the nodes matching + the selector. To do this quickly, it processes queries in several + steps, applying caching where profitable. + + The steps (roughly in reverse order of the way they appear in the code): + 1.) check to see if we already have a "query dispatcher" + - if so, use that with the given parameterization. Skip to step 4. + 2.) attempt to determine which branch to dispatch the query to: + - JS (optimized DOM iteration) + - native (FF3.1+, Safari 3.1+, IE 8+) + 3.) tokenize and convert to executable "query dispatcher" + - this is where the lion's share of the complexity in the + system lies. In the DOM version, the query dispatcher is + assembled as a chain of "yes/no" test functions pertaining to + a section of a simple query statement (".blah:nth-child(odd)" + but not "div div", which is 2 simple statements). Individual + statement dispatchers are cached (to prevent re-definition) + as are entire dispatch chains (to make re-execution of the + same query fast) + 4.) the resulting query dispatcher is called in the passed scope + (by default the top-level document) + - for DOM queries, this results in a recursive, top-down + evaluation of nodes based on each simple query section + - for native implementations, this may mean working around spec + bugs. So be it. + 5.) matched nodes are pruned to ensure they are unique (if necessary) +*/ + + + //////////////////////////////////////////////////////////////////////// + // Toolkit aliases + //////////////////////////////////////////////////////////////////////// + + // if you are extracting acme for use in your own system, you will + // need to provide these methods and properties. No other porting should be + // necessary, save for configuring the system to use a class other than + // dojo.NodeList as the return instance instantiator + var trim = dojo.trim; + var each = dojo.forEach; + // d.isIE; // float + // d.isSafari; // float + // d.isOpera; // float + // d.isWebKit; // float + // d.doc ; // document element + + var getDoc = function(){ return dojo.doc; }; + // NOTE(alex): the spec is idiotic. CSS queries should ALWAYS be case-sensitive, but nooooooo + var cssCaseBug = ((dojo.isWebKit||dojo.isMozilla) && ((getDoc().compatMode) == "BackCompat")); + + //////////////////////////////////////////////////////////////////////// + // Global utilities + //////////////////////////////////////////////////////////////////////// + + + var specials = ">~+"; + + // global thunk to determine whether we should treat the current query as + // case sensitive or not. This switch is flipped by the query evaluator + // based on the document passed as the context to search. + var caseSensitive = false; + + // how high? + var yesman = function(){ return true; }; + + //////////////////////////////////////////////////////////////////////// + // Tokenizer + //////////////////////////////////////////////////////////////////////// + + var getQueryParts = function(query){ + // summary: + // state machine for query tokenization + // description: + // instead of using a brittle and slow regex-based CSS parser, + // acme implements an AST-style query representation. This + // representation is only generated once per query. For example, + // the same query run multiple times or under different root nodes + // does not re-parse the selector expression but instead uses the + // cached data structure. The state machine implemented here + // terminates on the last " " (space) character and returns an + // ordered array of query component structures (or "parts"). Each + // part represents an operator or a simple CSS filtering + // expression. The structure for parts is documented in the code + // below. + + + // NOTE: + // this code is designed to run fast and compress well. Sacrifices + // to readability and maintainability have been made. Your best + // bet when hacking the tokenizer is to put The Donnas on *really* + // loud (may we recommend their "Spend The Night" release?) and + // just assume you're gonna make mistakes. Keep the unit tests + // open and run them frequently. Knowing is half the battle ;-) + if(specials.indexOf(query.slice(-1)) >= 0){ + // if we end with a ">", "+", or "~", that means we're implicitly + // searching all children, so make it explicit + query += " * " + }else{ + // if you have not provided a terminator, one will be provided for + // you... + query += " "; + } + + var ts = function(/*Integer*/ s, /*Integer*/ e){ + // trim and slice. + + // take an index to start a string slice from and an end position + // and return a trimmed copy of that sub-string + return trim(query.slice(s, e)); + }; + + // the overall data graph of the full query, as represented by queryPart objects + var queryParts = []; + + + // state keeping vars + var inBrackets = -1, inParens = -1, inMatchFor = -1, + inPseudo = -1, inClass = -1, inId = -1, inTag = -1, + lc = "", cc = "", pStart; + + // iteration vars + var x = 0, // index in the query + ql = query.length, + currentPart = null, // data structure representing the entire clause + _cp = null; // the current pseudo or attr matcher + + // several temporary variables are assigned to this structure during a + // potential sub-expression match: + // attr: + // a string representing the current full attribute match in a + // bracket expression + // type: + // if there's an operator in a bracket expression, this is + // used to keep track of it + // value: + // the internals of parenthetical expression for a pseudo. for + // :nth-child(2n+1), value might be "2n+1" + + var endTag = function(){ + // called when the tokenizer hits the end of a particular tag name. + // Re-sets state variables for tag matching and sets up the matcher + // to handle the next type of token (tag or operator). + if(inTag >= 0){ + var tv = (inTag == x) ? null : ts(inTag, x); // .toLowerCase(); + currentPart[ (specials.indexOf(tv) < 0) ? "tag" : "oper" ] = tv; + inTag = -1; + } + }; + + var endId = function(){ + // called when the tokenizer might be at the end of an ID portion of a match + if(inId >= 0){ + currentPart.id = ts(inId, x).replace(/\\/g, ""); + inId = -1; + } + }; + + var endClass = function(){ + // called when the tokenizer might be at the end of a class name + // match. CSS allows for multiple classes, so we augment the + // current item with another class in its list + if(inClass >= 0){ + currentPart.classes.push(ts(inClass + 1, x).replace(/\\/g, "")); + inClass = -1; + } + }; + + var endAll = function(){ + // at the end of a simple fragment, so wall off the matches + endId(); + endTag(); + endClass(); + }; + + var endPart = function(){ + endAll(); + if(inPseudo >= 0){ + currentPart.pseudos.push({ name: ts(inPseudo + 1, x) }); + } + // hint to the selector engine to tell it whether or not it + // needs to do any iteration. Many simple selectors don't, and + // we can avoid significant construction-time work by advising + // the system to skip them + currentPart.loops = ( + currentPart.pseudos.length || + currentPart.attrs.length || + currentPart.classes.length ); + + currentPart.oquery = currentPart.query = ts(pStart, x); // save the full expression as a string + + + // otag/tag are hints to suggest to the system whether or not + // it's an operator or a tag. We save a copy of otag since the + // tag name is cast to upper-case in regular HTML matches. The + // system has a global switch to figure out if the current + // expression needs to be case sensitive or not and it will use + // otag or tag accordingly + currentPart.otag = currentPart.tag = (currentPart["oper"]) ? null : (currentPart.tag || "*"); + + if(currentPart.tag){ + // if we're in a case-insensitive HTML doc, we likely want + // the toUpperCase when matching on element.tagName. If we + // do it here, we can skip the string op per node + // comparison + currentPart.tag = currentPart.tag.toUpperCase(); + } + + // add the part to the list + if(queryParts.length && (queryParts[queryParts.length-1].oper)){ + // operators are always infix, so we remove them from the + // list and attach them to the next match. The evaluator is + // responsible for sorting out how to handle them. + currentPart.infixOper = queryParts.pop(); + currentPart.query = currentPart.infixOper.query + " " + currentPart.query; + /* + console.debug( "swapping out the infix", + currentPart.infixOper, + "and attaching it to", + currentPart); + */ + } + queryParts.push(currentPart); + + currentPart = null; + }; + + // iterate over the query, character by character, building up a + // list of query part objects + for(; lc=cc, cc=query.charAt(x), x < ql; x++){ + // cc: the current character in the match + // lc: the last character (if any) + + // someone is trying to escape something, so don't try to match any + // fragments. We assume we're inside a literal. + if(lc == "\\"){ continue; } + if(!currentPart){ // a part was just ended or none has yet been created + // NOTE: I hate all this alloc, but it's shorter than writing tons of if's + pStart = x; + // rules describe full CSS sub-expressions, like: + // #someId + // .className:first-child + // but not: + // thinger > div.howdy[type=thinger] + // the indidual components of the previous query would be + // split into 3 parts that would be represented a structure + // like: + // [ + // { + // query: "thinger", + // tag: "thinger", + // }, + // { + // query: "div.howdy[type=thinger]", + // classes: ["howdy"], + // infixOper: { + // query: ">", + // oper: ">", + // } + // }, + // ] + currentPart = { + query: null, // the full text of the part's rule + pseudos: [], // CSS supports multiple pseud-class matches in a single rule + attrs: [], // CSS supports multi-attribute match, so we need an array + classes: [], // class matches may be additive, e.g.: .thinger.blah.howdy + tag: null, // only one tag... + oper: null, // ...or operator per component. Note that these wind up being exclusive. + id: null, // the id component of a rule + getTag: function(){ + return (caseSensitive) ? this.otag : this.tag; + } + }; + + // if we don't have a part, we assume we're going to start at + // the beginning of a match, which should be a tag name. This + // might fault a little later on, but we detect that and this + // iteration will still be fine. + inTag = x; + } + + if(inBrackets >= 0){ + // look for a the close first + if(cc == "]"){ // if we're in a [...] clause and we end, do assignment + if(!_cp.attr){ + // no attribute match was previously begun, so we + // assume this is an attribute existence match in the + // form of [someAttributeName] + _cp.attr = ts(inBrackets+1, x); + }else{ + // we had an attribute already, so we know that we're + // matching some sort of value, as in [attrName=howdy] + _cp.matchFor = ts((inMatchFor||inBrackets+1), x); + } + var cmf = _cp.matchFor; + if(cmf){ + // try to strip quotes from the matchFor value. We want + // [attrName=howdy] to match the same + // as [attrName = 'howdy' ] + if( (cmf.charAt(0) == '"') || (cmf.charAt(0) == "'") ){ + _cp.matchFor = cmf.slice(1, -1); + } + } + // end the attribute by adding it to the list of attributes. + currentPart.attrs.push(_cp); + _cp = null; // necessary? + inBrackets = inMatchFor = -1; + }else if(cc == "="){ + // if the last char was an operator prefix, make sure we + // record it along with the "=" operator. + var addToCc = ("|~^$*".indexOf(lc) >=0 ) ? lc : ""; + _cp.type = addToCc+cc; + _cp.attr = ts(inBrackets+1, x-addToCc.length); + inMatchFor = x+1; + } + // now look for other clause parts + }else if(inParens >= 0){ + // if we're in a parenthetical expression, we need to figure + // out if it's attached to a pseudo-selector rule like + // :nth-child(1) + if(cc == ")"){ + if(inPseudo >= 0){ + _cp.value = ts(inParens+1, x); + } + inPseudo = inParens = -1; + } + }else if(cc == "#"){ + // start of an ID match + endAll(); + inId = x+1; + }else if(cc == "."){ + // start of a class match + endAll(); + inClass = x; + }else if(cc == ":"){ + // start of a pseudo-selector match + endAll(); + inPseudo = x; + }else if(cc == "["){ + // start of an attribute match. + endAll(); + inBrackets = x; + // provide a new structure for the attribute match to fill-in + _cp = { + /*===== + attr: null, type: null, matchFor: null + =====*/ + }; + }else if(cc == "("){ + // we really only care if we've entered a parenthetical + // expression if we're already inside a pseudo-selector match + if(inPseudo >= 0){ + // provide a new structure for the pseudo match to fill-in + _cp = { + name: ts(inPseudo+1, x), + value: null + }; + currentPart.pseudos.push(_cp); + } + inParens = x; + }else if( + (cc == " ") && + // if it's a space char and the last char is too, consume the + // current one without doing more work + (lc != cc) + ){ + endPart(); + } + } + return queryParts; + }; + + + //////////////////////////////////////////////////////////////////////// + // DOM query infrastructure + //////////////////////////////////////////////////////////////////////// + + var agree = function(first, second){ + // the basic building block of the yes/no chaining system. agree(f1, + // f2) generates a new function which returns the boolean results of + // both of the passed functions to a single logical-anded result. If + // either are not passed, the other is used exclusively. + if(!first){ return second; } + if(!second){ return first; } + + return function(){ + return first.apply(window, arguments) && second.apply(window, arguments); + } + }; + + var getArr = function(i, arr){ + // helps us avoid array alloc when we don't need it + var r = arr||[]; // FIXME: should this be 'new d._NodeListCtor()' ? + if(i){ r.push(i); } + return r; + }; + + var _isElement = function(n){ return (1 == n.nodeType); }; + + // FIXME: need to coalesce _getAttr with defaultGetter + var blank = ""; + var _getAttr = function(elem, attr){ + if(!elem){ return blank; } + if(attr == "class"){ + return elem.className || blank; + } + if(attr == "for"){ + return elem.htmlFor || blank; + } + if(attr == "style"){ + return elem.style.cssText || blank; + } + return (caseSensitive ? elem.getAttribute(attr) : elem.getAttribute(attr, 2)) || blank; + }; + + var attrs = { + "*=": function(attr, value){ + return function(elem){ + // E[foo*="bar"] + // an E element whose "foo" attribute value contains + // the substring "bar" + return (_getAttr(elem, attr).indexOf(value)>=0); + } + }, + "^=": function(attr, value){ + // E[foo^="bar"] + // an E element whose "foo" attribute value begins exactly + // with the string "bar" + return function(elem){ + return (_getAttr(elem, attr).indexOf(value)==0); + } + }, + "$=": function(attr, value){ + // E[foo$="bar"] + // an E element whose "foo" attribute value ends exactly + // with the string "bar" + return function(elem){ + var ea = " "+_getAttr(elem, attr); + return (ea.lastIndexOf(value)==(ea.length-value.length)); + } + }, + "~=": function(attr, value){ + // E[foo~="bar"] + // an E element whose "foo" attribute value is a list of + // space-separated values, one of which is exactly equal + // to "bar" + + // return "[contains(concat(' ',@"+attr+",' '), ' "+ value +" ')]"; + var tval = " "+value+" "; + return function(elem){ + var ea = " "+_getAttr(elem, attr)+" "; + return (ea.indexOf(tval)>=0); + } + }, + "|=": function(attr, value){ + // E[hreflang|="en"] + // an E element whose "hreflang" attribute has a + // hyphen-separated list of values beginning (from the + // left) with "en" + var valueDash = value+"-"; + return function(elem){ + var ea = _getAttr(elem, attr); + return ( + (ea == value) || + (ea.indexOf(valueDash)==0) + ); + } + }, + "=": function(attr, value){ + return function(elem){ + return (_getAttr(elem, attr) == value); + } + } + }; + + // avoid testing for node type if we can. Defining this in the negative + // here to avoid negation in the fast path. + var _noNES = (typeof getDoc().firstChild.nextElementSibling == "undefined"); + var _ns = !_noNES ? "nextElementSibling" : "nextSibling"; + var _ps = !_noNES ? "previousElementSibling" : "previousSibling"; + var _simpleNodeTest = (_noNES ? _isElement : yesman); + + var _lookLeft = function(node){ + // look left + while(node = node[_ps]){ + if(_simpleNodeTest(node)){ return false; } + } + return true; + }; + + var _lookRight = function(node){ + // look right + while(node = node[_ns]){ + if(_simpleNodeTest(node)){ return false; } + } + return true; + }; + + var getNodeIndex = function(node){ + var root = node.parentNode; + var i = 0, + tret = root.children || root.childNodes, + ci = (node["_i"]||-1), + cl = (root["_l"]||-1); + + if(!tret){ return -1; } + var l = tret.length; + + // we calculate the parent length as a cheap way to invalidate the + // cache. It's not 100% accurate, but it's much more honest than what + // other libraries do + if( cl == l && ci >= 0 && cl >= 0 ){ + // if it's legit, tag and release + return ci; + } + + // else re-key things + root["_l"] = l; + ci = -1; + for(var te = root["firstElementChild"]||root["firstChild"]; te; te = te[_ns]){ + if(_simpleNodeTest(te)){ + te["_i"] = ++i; + if(node === te){ + // NOTE: + // shortcutting the return at this step in indexing works + // very well for benchmarking but we avoid it here since + // it leads to potential O(n^2) behavior in sequential + // getNodexIndex operations on a previously un-indexed + // parent. We may revisit this at a later time, but for + // now we just want to get the right answer more often + // than not. + ci = i; + } + } + } + return ci; + }; + + var isEven = function(elem){ + return !((getNodeIndex(elem)) % 2); + }; + + var isOdd = function(elem){ + return ((getNodeIndex(elem)) % 2); + }; + + var pseudos = { + "checked": function(name, condition){ + return function(elem){ + return !!("checked" in elem ? elem.checked : elem.selected); + } + }, + "first-child": function(){ return _lookLeft; }, + "last-child": function(){ return _lookRight; }, + "only-child": function(name, condition){ + return function(node){ + return _lookLeft(node) && _lookRight(node); + }; + }, + "empty": function(name, condition){ + return function(elem){ + // DomQuery and jQuery get this wrong, oddly enough. + // The CSS 3 selectors spec is pretty explicit about it, too. + var cn = elem.childNodes; + var cnl = elem.childNodes.length; + // if(!cnl){ return true; } + for(var x=cnl-1; x >= 0; x--){ + var nt = cn[x].nodeType; + if((nt === 1)||(nt == 3)){ return false; } + } + return true; + } + }, + "contains": function(name, condition){ + var cz = condition.charAt(0); + if( cz == '"' || cz == "'" ){ //remove quote + condition = condition.slice(1, -1); + } + return function(elem){ + return (elem.innerHTML.indexOf(condition) >= 0); + } + }, + "not": function(name, condition){ + var p = getQueryParts(condition)[0]; + var ignores = { el: 1 }; + if(p.tag != "*"){ + ignores.tag = 1; + } + if(!p.classes.length){ + ignores.classes = 1; + } + var ntf = getSimpleFilterFunc(p, ignores); + return function(elem){ + return (!ntf(elem)); + } + }, + "nth-child": function(name, condition){ + var pi = parseInt; + // avoid re-defining function objects if we can + if(condition == "odd"){ + return isOdd; + }else if(condition == "even"){ + return isEven; + } + // FIXME: can we shorten this? + if(condition.indexOf("n") != -1){ + var tparts = condition.split("n", 2); + var pred = tparts[0] ? ((tparts[0] == '-') ? -1 : pi(tparts[0])) : 1; + var idx = tparts[1] ? pi(tparts[1]) : 0; + var lb = 0, ub = -1; + if(pred > 0){ + if(idx < 0){ + idx = (idx % pred) && (pred + (idx % pred)); + }else if(idx>0){ + if(idx >= pred){ + lb = idx - idx % pred; + } + idx = idx % pred; + } + }else if(pred<0){ + pred *= -1; + // idx has to be greater than 0 when pred is negative; + // shall we throw an error here? + if(idx > 0){ + ub = idx; + idx = idx % pred; + } + } + if(pred > 0){ + return function(elem){ + var i = getNodeIndex(elem); + return (i>=lb) && (ub<0 || i<=ub) && ((i % pred) == idx); + } + }else{ + condition = idx; + } + } + var ncount = pi(condition); + return function(elem){ + return (getNodeIndex(elem) == ncount); + } + } + }; + + var defaultGetter = (dojo.isIE && (dojo.isIE < 9 || dojo.isQuirks)) ? function(cond){ + var clc = cond.toLowerCase(); + if(clc == "class"){ cond = "className"; } + return function(elem){ + return (caseSensitive ? elem.getAttribute(cond) : elem[cond]||elem[clc]); + } + } : function(cond){ + return function(elem){ + return (elem && elem.getAttribute && elem.hasAttribute(cond)); + } + }; + + var getSimpleFilterFunc = function(query, ignores){ + // generates a node tester function based on the passed query part. The + // query part is one of the structures generated by the query parser + // when it creates the query AST. The "ignores" object specifies which + // (if any) tests to skip, allowing the system to avoid duplicating + // work where it may have already been taken into account by other + // factors such as how the nodes to test were fetched in the first + // place + if(!query){ return yesman; } + ignores = ignores||{}; + + var ff = null; + + if(!("el" in ignores)){ + ff = agree(ff, _isElement); + } + + if(!("tag" in ignores)){ + if(query.tag != "*"){ + ff = agree(ff, function(elem){ + return (elem && (elem.tagName == query.getTag())); + }); + } + } + + if(!("classes" in ignores)){ + each(query.classes, function(cname, idx, arr){ + // get the class name + /* + var isWildcard = cname.charAt(cname.length-1) == "*"; + if(isWildcard){ + cname = cname.substr(0, cname.length-1); + } + // I dislike the regex thing, even if memoized in a cache, but it's VERY short + var re = new RegExp("(?:^|\\s)" + cname + (isWildcard ? ".*" : "") + "(?:\\s|$)"); + */ + var re = new RegExp("(?:^|\\s)" + cname + "(?:\\s|$)"); + ff = agree(ff, function(elem){ + return re.test(elem.className); + }); + ff.count = idx; + }); + } + + if(!("pseudos" in ignores)){ + each(query.pseudos, function(pseudo){ + var pn = pseudo.name; + if(pseudos[pn]){ + ff = agree(ff, pseudos[pn](pn, pseudo.value)); + } + }); + } + + if(!("attrs" in ignores)){ + each(query.attrs, function(attr){ + var matcher; + var a = attr.attr; + // type, attr, matchFor + if(attr.type && attrs[attr.type]){ + matcher = attrs[attr.type](a, attr.matchFor); + }else if(a.length){ + matcher = defaultGetter(a); + } + if(matcher){ + ff = agree(ff, matcher); + } + }); + } + + if(!("id" in ignores)){ + if(query.id){ + ff = agree(ff, function(elem){ + return (!!elem && (elem.id == query.id)); + }); + } + } + + if(!ff){ + if(!("default" in ignores)){ + ff = yesman; + } + } + return ff; + }; + + var _nextSibling = function(filterFunc){ + return function(node, ret, bag){ + while(node = node[_ns]){ + if(_noNES && (!_isElement(node))){ continue; } + if( + (!bag || _isUnique(node, bag)) && + filterFunc(node) + ){ + ret.push(node); + } + break; + } + return ret; + } + }; + + var _nextSiblings = function(filterFunc){ + return function(root, ret, bag){ + var te = root[_ns]; + while(te){ + if(_simpleNodeTest(te)){ + if(bag && !_isUnique(te, bag)){ + break; + } + if(filterFunc(te)){ + ret.push(te); + } + } + te = te[_ns]; + } + return ret; + } + }; + + // get an array of child *elements*, skipping text and comment nodes + var _childElements = function(filterFunc){ + filterFunc = filterFunc||yesman; + return function(root, ret, bag){ + // get an array of child elements, skipping text and comment nodes + var te, x = 0, tret = root.children || root.childNodes; + while(te = tret[x++]){ + if( + _simpleNodeTest(te) && + (!bag || _isUnique(te, bag)) && + (filterFunc(te, x)) + ){ + ret.push(te); + } + } + return ret; + }; + }; + + /* + // thanks, Dean! + var itemIsAfterRoot = d.isIE ? function(item, root){ + return (item.sourceIndex > root.sourceIndex); + } : function(item, root){ + return (item.compareDocumentPosition(root) == 2); + }; + */ + + // test to see if node is below root + var _isDescendant = function(node, root){ + var pn = node.parentNode; + while(pn){ + if(pn == root){ + break; + } + pn = pn.parentNode; + } + return !!pn; + }; + + var _getElementsFuncCache = {}; + + var getElementsFunc = function(query){ + var retFunc = _getElementsFuncCache[query.query]; + // if we've got a cached dispatcher, just use that + if(retFunc){ return retFunc; } + // else, generate a new on + + // NOTE: + // this function returns a function that searches for nodes and + // filters them. The search may be specialized by infix operators + // (">", "~", or "+") else it will default to searching all + // descendants (the " " selector). Once a group of children is + // found, a test function is applied to weed out the ones we + // don't want. Many common cases can be fast-pathed. We spend a + // lot of cycles to create a dispatcher that doesn't do more work + // than necessary at any point since, unlike this function, the + // dispatchers will be called every time. The logic of generating + // efficient dispatchers looks like this in pseudo code: + // + // # if it's a purely descendant query (no ">", "+", or "~" modifiers) + // if infixOperator == " ": + // if only(id): + // return def(root): + // return d.byId(id, root); + // + // elif id: + // return def(root): + // return filter(d.byId(id, root)); + // + // elif cssClass && getElementsByClassName: + // return def(root): + // return filter(root.getElementsByClassName(cssClass)); + // + // elif only(tag): + // return def(root): + // return root.getElementsByTagName(tagName); + // + // else: + // # search by tag name, then filter + // return def(root): + // return filter(root.getElementsByTagName(tagName||"*")); + // + // elif infixOperator == ">": + // # search direct children + // return def(root): + // return filter(root.children); + // + // elif infixOperator == "+": + // # search next sibling + // return def(root): + // return filter(root.nextElementSibling); + // + // elif infixOperator == "~": + // # search rightward siblings + // return def(root): + // return filter(nextSiblings(root)); + + var io = query.infixOper; + var oper = (io ? io.oper : ""); + // the default filter func which tests for all conditions in the query + // part. This is potentially inefficient, so some optimized paths may + // re-define it to test fewer things. + var filterFunc = getSimpleFilterFunc(query, { el: 1 }); + var qt = query.tag; + var wildcardTag = ("*" == qt); + var ecs = getDoc()["getElementsByClassName"]; + + if(!oper){ + // if there's no infix operator, then it's a descendant query. ID + // and "elements by class name" variants can be accelerated so we + // call them out explicitly: + if(query.id){ + // testing shows that the overhead of yesman() is acceptable + // and can save us some bytes vs. re-defining the function + // everywhere. + filterFunc = (!query.loops && wildcardTag) ? + yesman : + getSimpleFilterFunc(query, { el: 1, id: 1 }); + + retFunc = function(root, arr){ + var te = dom.byId(query.id, (root.ownerDocument||root)); + if(!te || !filterFunc(te)){ return; } + if(9 == root.nodeType){ // if root's a doc, we just return directly + return getArr(te, arr); + }else{ // otherwise check ancestry + if(_isDescendant(te, root)){ + return getArr(te, arr); + } + } + } + }else if( + ecs && + // isAlien check. Workaround for Prototype.js being totally evil/dumb. + /\{\s*\[native code\]\s*\}/.test(String(ecs)) && + query.classes.length && + !cssCaseBug + ){ + // it's a class-based query and we've got a fast way to run it. + + // ignore class and ID filters since we will have handled both + filterFunc = getSimpleFilterFunc(query, { el: 1, classes: 1, id: 1 }); + var classesString = query.classes.join(" "); + retFunc = function(root, arr, bag){ + var ret = getArr(0, arr), te, x=0; + var tret = root.getElementsByClassName(classesString); + while((te = tret[x++])){ + if(filterFunc(te, root) && _isUnique(te, bag)){ + ret.push(te); + } + } + return ret; + }; + + }else if(!wildcardTag && !query.loops){ + // it's tag only. Fast-path it. + retFunc = function(root, arr, bag){ + var ret = getArr(0, arr), te, x=0; + var tret = root.getElementsByTagName(query.getTag()); + while((te = tret[x++])){ + if(_isUnique(te, bag)){ + ret.push(te); + } + } + return ret; + }; + }else{ + // the common case: + // a descendant selector without a fast path. By now it's got + // to have a tag selector, even if it's just "*" so we query + // by that and filter + filterFunc = getSimpleFilterFunc(query, { el: 1, tag: 1, id: 1 }); + retFunc = function(root, arr, bag){ + var ret = getArr(0, arr), te, x=0; + // we use getTag() to avoid case sensitivity issues + var tret = root.getElementsByTagName(query.getTag()); + while((te = tret[x++])){ + if(filterFunc(te, root) && _isUnique(te, bag)){ + ret.push(te); + } + } + return ret; + }; + } + }else{ + // the query is scoped in some way. Instead of querying by tag we + // use some other collection to find candidate nodes + var skipFilters = { el: 1 }; + if(wildcardTag){ + skipFilters.tag = 1; + } + filterFunc = getSimpleFilterFunc(query, skipFilters); + if("+" == oper){ + retFunc = _nextSibling(filterFunc); + }else if("~" == oper){ + retFunc = _nextSiblings(filterFunc); + }else if(">" == oper){ + retFunc = _childElements(filterFunc); + } + } + // cache it and return + return _getElementsFuncCache[query.query] = retFunc; + }; + + var filterDown = function(root, queryParts){ + // NOTE: + // this is the guts of the DOM query system. It takes a list of + // parsed query parts and a root and finds children which match + // the selector represented by the parts + var candidates = getArr(root), qp, x, te, qpl = queryParts.length, bag, ret; + + for(var i = 0; i < qpl; i++){ + ret = []; + qp = queryParts[i]; + x = candidates.length - 1; + if(x > 0){ + // if we have more than one root at this level, provide a new + // hash to use for checking group membership but tell the + // system not to post-filter us since we will already have been + // gauranteed to be unique + bag = {}; + ret.nozip = true; + } + var gef = getElementsFunc(qp); + for(var j = 0; (te = candidates[j]); j++){ + // for every root, get the elements that match the descendant + // selector, adding them to the "ret" array and filtering them + // via membership in this level's bag. If there are more query + // parts, then this level's return will be used as the next + // level's candidates + gef(te, ret, bag); + } + if(!ret.length){ break; } + candidates = ret; + } + return ret; + }; + + //////////////////////////////////////////////////////////////////////// + // the query runner + //////////////////////////////////////////////////////////////////////// + + // these are the primary caches for full-query results. The query + // dispatcher functions are generated then stored here for hash lookup in + // the future + var _queryFuncCacheDOM = {}, + _queryFuncCacheQSA = {}; + + // this is the second level of spliting, from full-length queries (e.g., + // "div.foo .bar") into simple query expressions (e.g., ["div.foo", + // ".bar"]) + var getStepQueryFunc = function(query){ + var qparts = getQueryParts(trim(query)); + + // if it's trivial, avoid iteration and zipping costs + if(qparts.length == 1){ + // we optimize this case here to prevent dispatch further down the + // chain, potentially slowing things down. We could more elegantly + // handle this in filterDown(), but it's slower for simple things + // that need to be fast (e.g., "#someId"). + var tef = getElementsFunc(qparts[0]); + return function(root){ + var r = tef(root, []); + if(r){ r.nozip = true; } + return r; + } + } + + // otherwise, break it up and return a runner that iterates over the parts recursively + return function(root){ + return filterDown(root, qparts); + } + }; + + // NOTES: + // * we can't trust QSA for anything but document-rooted queries, so + // caching is split into DOM query evaluators and QSA query evaluators + // * caching query results is dirty and leak-prone (or, at a minimum, + // prone to unbounded growth). Other toolkits may go this route, but + // they totally destroy their own ability to manage their memory + // footprint. If we implement it, it should only ever be with a fixed + // total element reference # limit and an LRU-style algorithm since JS + // has no weakref support. Caching compiled query evaluators is also + // potentially problematic, but even on large documents the size of the + // query evaluators is often < 100 function objects per evaluator (and + // LRU can be applied if it's ever shown to be an issue). + // * since IE's QSA support is currently only for HTML documents and even + // then only in IE 8's "standards mode", we have to detect our dispatch + // route at query time and keep 2 separate caches. Ugg. + + // we need to determine if we think we can run a given query via + // querySelectorAll or if we'll need to fall back on DOM queries to get + // there. We need a lot of information about the environment and the query + // to make the determiniation (e.g. does it support QSA, does the query in + // question work in the native QSA impl, etc.). + var nua = navigator.userAgent; + // some versions of Safari provided QSA, but it was buggy and crash-prone. + // We need te detect the right "internal" webkit version to make this work. + var wk = "WebKit/"; + var is525 = ( + dojo.isWebKit && + (nua.indexOf(wk) > 0) && + (parseFloat(nua.split(wk)[1]) > 528) + ); + + // IE QSA queries may incorrectly include comment nodes, so we throw the + // zipping function into "remove" comments mode instead of the normal "skip + // it" which every other QSA-clued browser enjoys + var noZip = dojo.isIE ? "commentStrip" : "nozip"; + + var qsa = "querySelectorAll"; + var qsaAvail = ( + !!getDoc()[qsa] && + // see #5832 + (!dojo.isSafari || (dojo.isSafari > 3.1) || is525 ) + ); + + //Don't bother with n+3 type of matches, IE complains if we modify those. + var infixSpaceRe = /n\+\d|([^ ])?([>~+])([^ =])?/g; + var infixSpaceFunc = function(match, pre, ch, post){ + return ch ? (pre ? pre + " " : "") + ch + (post ? " " + post : "") : /*n+3*/ match; + }; + + var getQueryFunc = function(query, forceDOM){ + //Normalize query. The CSS3 selectors spec allows for omitting spaces around + //infix operators, >, ~ and + + //Do the work here since detection for spaces is used as a simple "not use QSA" + //test below. + query = query.replace(infixSpaceRe, infixSpaceFunc); + + if(qsaAvail){ + // if we've got a cached variant and we think we can do it, run it! + var qsaCached = _queryFuncCacheQSA[query]; + if(qsaCached && !forceDOM){ return qsaCached; } + } + + // else if we've got a DOM cached variant, assume that we already know + // all we need to and use it + var domCached = _queryFuncCacheDOM[query]; + if(domCached){ return domCached; } + + // TODO: + // today we're caching DOM and QSA branches separately so we + // recalc useQSA every time. If we had a way to tag root+query + // efficiently, we'd be in good shape to do a global cache. + + var qcz = query.charAt(0); + var nospace = (-1 == query.indexOf(" ")); + + // byId searches are wicked fast compared to QSA, even when filtering + // is required + if( (query.indexOf("#") >= 0) && (nospace) ){ + forceDOM = true; + } + + var useQSA = ( + qsaAvail && (!forceDOM) && + // as per CSS 3, we can't currently start w/ combinator: + // http://www.w3.org/TR/css3-selectors/#w3cselgrammar + (specials.indexOf(qcz) == -1) && + // IE's QSA impl sucks on pseudos + (!dojo.isIE || (query.indexOf(":") == -1)) && + + (!(cssCaseBug && (query.indexOf(".") >= 0))) && + + // FIXME: + // need to tighten up browser rules on ":contains" and "|=" to + // figure out which aren't good + // Latest webkit (around 531.21.8) does not seem to do well with :checked on option + // elements, even though according to spec, selected options should + // match :checked. So go nonQSA for it: + // http://bugs.dojotoolkit.org/ticket/5179 + (query.indexOf(":contains") == -1) && (query.indexOf(":checked") == -1) && + (query.indexOf("|=") == -1) // some browsers don't grok it + ); + + // TODO: + // if we've got a descendant query (e.g., "> .thinger" instead of + // just ".thinger") in a QSA-able doc, but are passed a child as a + // root, it should be possible to give the item a synthetic ID and + // trivially rewrite the query to the form "#synid > .thinger" to + // use the QSA branch + + + if(useQSA){ + var tq = (specials.indexOf(query.charAt(query.length-1)) >= 0) ? + (query + " *") : query; + return _queryFuncCacheQSA[query] = function(root){ + try{ + // the QSA system contains an egregious spec bug which + // limits us, effectively, to only running QSA queries over + // entire documents. See: + // http://ejohn.org/blog/thoughts-on-queryselectorall/ + // despite this, we can also handle QSA runs on simple + // selectors, but we don't want detection to be expensive + // so we're just checking for the presence of a space char + // right now. Not elegant, but it's cheaper than running + // the query parser when we might not need to + if(!((9 == root.nodeType) || nospace)){ throw ""; } + var r = root[qsa](tq); + // skip expensive duplication checks and just wrap in a NodeList + r[noZip] = true; + return r; + }catch(e){ + // else run the DOM branch on this query, ensuring that we + // default that way in the future + return getQueryFunc(query, true)(root); + } + } + }else{ + // DOM branch + var parts = query.split(/\s*,\s*/); + return _queryFuncCacheDOM[query] = ((parts.length < 2) ? + // if not a compound query (e.g., ".foo, .bar"), cache and return a dispatcher + getStepQueryFunc(query) : + // if it *is* a complex query, break it up into its + // constituent parts and return a dispatcher that will + // merge the parts when run + function(root){ + var pindex = 0, // avoid array alloc for every invocation + ret = [], + tp; + while((tp = parts[pindex++])){ + ret = ret.concat(getStepQueryFunc(tp)(root)); + } + return ret; + } + ); + } + }; + + var _zipIdx = 0; + + // NOTE: + // this function is Moo inspired, but our own impl to deal correctly + // with XML in IE + var _nodeUID = dojo.isIE ? function(node){ + if(caseSensitive){ + // XML docs don't have uniqueID on their nodes + return (node.getAttribute("_uid") || node.setAttribute("_uid", ++_zipIdx) || _zipIdx); + + }else{ + return node.uniqueID; + } + } : + function(node){ + return (node._uid || (node._uid = ++_zipIdx)); + }; + + // determine if a node in is unique in a "bag". In this case we don't want + // to flatten a list of unique items, but rather just tell if the item in + // question is already in the bag. Normally we'd just use hash lookup to do + // this for us but IE's DOM is busted so we can't really count on that. On + // the upside, it gives us a built in unique ID function. + var _isUnique = function(node, bag){ + if(!bag){ return 1; } + var id = _nodeUID(node); + if(!bag[id]){ return bag[id] = 1; } + return 0; + }; + + // attempt to efficiently determine if an item in a list is a dupe, + // returning a list of "uniques", hopefully in doucment order + var _zipIdxName = "_zipIdx"; + var _zip = function(arr){ + if(arr && arr.nozip){ + return arr; + } + var ret = []; + if(!arr || !arr.length){ return ret; } + if(arr[0]){ + ret.push(arr[0]); + } + if(arr.length < 2){ return ret; } + + _zipIdx++; + + // we have to fork here for IE and XML docs because we can't set + // expandos on their nodes (apparently). *sigh* + if(dojo.isIE && caseSensitive){ + var szidx = _zipIdx+""; + arr[0].setAttribute(_zipIdxName, szidx); + for(var x = 1, te; te = arr[x]; x++){ + if(arr[x].getAttribute(_zipIdxName) != szidx){ + ret.push(te); + } + te.setAttribute(_zipIdxName, szidx); + } + }else if(dojo.isIE && arr.commentStrip){ + try{ + for(var x = 1, te; te = arr[x]; x++){ + if(_isElement(te)){ + ret.push(te); + } + } + }catch(e){ /* squelch */ } + }else{ + if(arr[0]){ arr[0][_zipIdxName] = _zipIdx; } + for(var x = 1, te; te = arr[x]; x++){ + if(arr[x][_zipIdxName] != _zipIdx){ + ret.push(te); + } + te[_zipIdxName] = _zipIdx; + } + } + return ret; + }; + + // the main executor + var query = function(/*String*/ query, /*String|DOMNode?*/ root){ + // summary: + // Returns nodes which match the given CSS3 selector, searching the + // entire document by default but optionally taking a node to scope + // the search by. Returns an array. + // description: + // dojo.query() is the swiss army knife of DOM node manipulation in + // Dojo. Much like Prototype's "$$" (bling-bling) function or JQuery's + // "$" function, dojo.query provides robust, high-performance + // CSS-based node selector support with the option of scoping searches + // to a particular sub-tree of a document. + // + // Supported Selectors: + // -------------------- + // + // acme supports a rich set of CSS3 selectors, including: + // + // * class selectors (e.g., `.foo`) + // * node type selectors like `span` + // * ` ` descendant selectors + // * `>` child element selectors + // * `#foo` style ID selectors + // * `*` universal selector + // * `~`, the preceded-by sibling selector + // * `+`, the immediately preceded-by sibling selector + // * attribute queries: + // | * `[foo]` attribute presence selector + // | * `[foo='bar']` attribute value exact match + // | * `[foo~='bar']` attribute value list item match + // | * `[foo^='bar']` attribute start match + // | * `[foo$='bar']` attribute end match + // | * `[foo*='bar']` attribute substring match + // * `:first-child`, `:last-child`, and `:only-child` positional selectors + // * `:empty` content emtpy selector + // * `:checked` pseudo selector + // * `:nth-child(n)`, `:nth-child(2n+1)` style positional calculations + // * `:nth-child(even)`, `:nth-child(odd)` positional selectors + // * `:not(...)` negation pseudo selectors + // + // Any legal combination of these selectors will work with + // `dojo.query()`, including compound selectors ("," delimited). + // Very complex and useful searches can be constructed with this + // palette of selectors and when combined with functions for + // manipulation presented by dojo.NodeList, many types of DOM + // manipulation operations become very straightforward. + // + // Unsupported Selectors: + // ---------------------- + // + // While dojo.query handles many CSS3 selectors, some fall outside of + // what's reasonable for a programmatic node querying engine to + // handle. Currently unsupported selectors include: + // + // * namespace-differentiated selectors of any form + // * all `::` pseduo-element selectors + // * certain pseduo-selectors which don't get a lot of day-to-day use: + // | * `:root`, `:lang()`, `:target`, `:focus` + // * all visual and state selectors: + // | * `:root`, `:active`, `:hover`, `:visisted`, `:link`, + // `:enabled`, `:disabled` + // * `:*-of-type` pseudo selectors + // + // dojo.query and XML Documents: + // ----------------------------- + // + // `dojo.query` (as of dojo 1.2) supports searching XML documents + // in a case-sensitive manner. If an HTML document is served with + // a doctype that forces case-sensitivity (e.g., XHTML 1.1 + // Strict), dojo.query() will detect this and "do the right + // thing". Case sensitivity is dependent upon the document being + // searched and not the query used. It is therefore possible to + // use case-sensitive queries on strict sub-documents (iframes, + // etc.) or XML documents while still assuming case-insensitivity + // for a host/root document. + // + // Non-selector Queries: + // --------------------- + // + // If something other than a String is passed for the query, + // `dojo.query` will return a new `dojo.NodeList` instance + // constructed from that parameter alone and all further + // processing will stop. This means that if you have a reference + // to a node or NodeList, you can quickly construct a new NodeList + // from the original by calling `dojo.query(node)` or + // `dojo.query(list)`. + // + // query: + // The CSS3 expression to match against. For details on the syntax of + // CSS3 selectors, see <http://www.w3.org/TR/css3-selectors/#selectors> + // root: + // A DOMNode (or node id) to scope the search from. Optional. + // returns: Array + // example: + // search the entire document for elements with the class "foo": + // | dojo.query(".foo"); + // these elements will match: + // | <span class="foo"></span> + // | <span class="foo bar"></span> + // | <p class="thud foo"></p> + // example: + // search the entire document for elements with the classes "foo" *and* "bar": + // | dojo.query(".foo.bar"); + // these elements will match: + // | <span class="foo bar"></span> + // while these will not: + // | <span class="foo"></span> + // | <p class="thud foo"></p> + // example: + // find `<span>` elements which are descendants of paragraphs and + // which have a "highlighted" class: + // | dojo.query("p span.highlighted"); + // the innermost span in this fragment matches: + // | <p class="foo"> + // | <span>... + // | <span class="highlighted foo bar">...</span> + // | </span> + // | </p> + // example: + // set an "odd" class on all odd table rows inside of the table + // `#tabular_data`, using the `>` (direct child) selector to avoid + // affecting any nested tables: + // | dojo.query("#tabular_data > tbody > tr:nth-child(odd)").addClass("odd"); + // example: + // remove all elements with the class "error" from the document + // and store them in a list: + // | var errors = dojo.query(".error").orphan(); + // example: + // add an onclick handler to every submit button in the document + // which causes the form to be sent via Ajax instead: + // | dojo.query("input[type='submit']").onclick(function(e){ + // | dojo.stopEvent(e); // prevent sending the form + // | var btn = e.target; + // | dojo.xhrPost({ + // | form: btn.form, + // | load: function(data){ + // | // replace the form with the response + // | var div = dojo.doc.createElement("div"); + // | dojo.place(div, btn.form, "after"); + // | div.innerHTML = data; + // | dojo.style(btn.form, "display", "none"); + // | } + // | }); + // | }); + + root = root||getDoc(); + var od = root.ownerDocument||root.documentElement; + + // throw the big case sensitivity switch + + // NOTE: + // Opera in XHTML mode doesn't detect case-sensitivity correctly + // and it's not clear that there's any way to test for it + caseSensitive = (root.contentType && root.contentType=="application/xml") || + (dojo.isOpera && (root.doctype || od.toString() == "[object XMLDocument]")) || + (!!od) && + (dojo.isIE ? od.xml : (root.xmlVersion || od.xmlVersion)); + + // NOTE: + // adding "true" as the 2nd argument to getQueryFunc is useful for + // testing the DOM branch without worrying about the + // behavior/performance of the QSA branch. + var r = getQueryFunc(query)(root); + + // FIXME: + // need to investigate this branch WRT #8074 and #8075 + if(r && r.nozip){ + return r; + } + return _zip(r); // dojo.NodeList + }; + query.filter = function(/*Node[]*/ nodeList, /*String*/ filter, /*String|DOMNode?*/ root){ + // summary: + // function for filtering a NodeList based on a selector, optimized for simple selectors + var tmpNodeList = [], + parts = getQueryParts(filter), + filterFunc = + (parts.length == 1 && !/[^\w#\.]/.test(filter)) ? + getSimpleFilterFunc(parts[0]) : + function(node){ + return dojo.query(filter, root).indexOf(node) != -1; + }; + for(var x = 0, te; te = nodeList[x]; x++){ + if(filterFunc(te)){ tmpNodeList.push(te); } + } + return tmpNodeList; + }; + return query; +});//end defineQuery diff --git a/lib/dojo/selector/lite.js b/lib/dojo/selector/lite.js new file mode 100644 index 00000000..c20fe724 --- /dev/null +++ b/lib/dojo/selector/lite.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/selector/lite",["../has","../_base/kernel"],function(_1,_2){"use strict";var _3=document.createElement("div");var _4=_3.matchesSelector||_3.webkitMatchesSelector||_3.mozMatchesSelector||_3.msMatchesSelector||_3.oMatchesSelector;var _5=_3.querySelectorAll;_1.add("dom-matches-selector",!!_4);_1.add("dom-qsa",!!_5);var _6=function(_7,_8){if(_9&&_7.indexOf(",")>-1){return _9(_7,_8);}var _a=(_5?/^([\w]*)#([\w\-]+$)|^(\.)([\w\-\*]+$)|^(\w+$)/:/^([\w]*)#([\w\-]+)(?:\s+(.*))?$|(?:^|(>|.+\s+))([\w\-\*]+)(\S*$)/).exec(_7);_8=_8||document;if(_a){if(_a[2]){var _b=_2.byId?_2.byId(_a[2]):document.getElementById(_a[2]);if(!_b||(_a[1]&&_a[1]!=_b.tagName.toLowerCase())){return [];}if(_8!=document){var _c=_b;while(_c!=_8){_c=_c.parentNode;if(!_c){return [];}}}return _a[3]?_6(_a[3],_b):[_b];}if(_a[3]&&_8.getElementsByClassName){return _8.getElementsByClassName(_a[4]);}var _b;if(_a[5]){_b=_8.getElementsByTagName(_a[5]);if(_a[4]||_a[6]){_7=(_a[4]||"")+_a[6];}else{return _b;}}}if(_5){if(_8.nodeType===1&&_8.nodeName.toLowerCase()!=="object"){return _d(_8,_7,_8.querySelectorAll);}else{return _8.querySelectorAll(_7);}}else{if(!_b){_b=_8.getElementsByTagName("*");}}var _e=[];for(var i=0,l=_b.length;i<l;i++){var _f=_b[i];if(_f.nodeType==1&&_10(_f,_7,_8)){_e.push(_f);}}return _e;};var _d=function(_11,_12,_13){var _14=_11,old=_11.getAttribute("id"),nid=old||"__dojo__",_15=_11.parentNode,_16=/^\s*[+~]/.test(_12);if(_16&&!_15){return [];}if(!old){_11.setAttribute("id",nid);}else{nid=nid.replace(/'/g,"\\$&");}if(_16&&_15){_11=_11.parentNode;}try{return _13.call(_11,"[id='"+nid+"'] "+_12);}finally{if(!old){_14.removeAttribute("id");}}};if(!_1("dom-matches-selector")){var _10=(function(){var _17=_3.tagName=="div"?"toLowerCase":"toUpperCase";function tag(_18){_18=_18[_17]();return function(_19){return _19.tagName==_18;};};function _1a(_1b){var _1c=" "+_1b+" ";return function(_1d){return _1d.className.indexOf(_1b)>-1&&(" "+_1d.className+" ").indexOf(_1c)>-1;};};var _1e={"^=":function(_1f,_20){return _1f.indexOf(_20)==0;},"*=":function(_21,_22){return _21.indexOf(_22)>-1;},"$=":function(_23,_24){return _23.substring(_23.length-_24.length,_23.length)==_24;},"~=":function(_25,_26){return (" "+_25+" ").indexOf(" "+_26+" ")>-1;},"|=":function(_27,_28){return (_27+"-").indexOf(_28+"-")==0;},"=":function(_29,_2a){return _29==_2a;},"":function(_2b,_2c){return true;}};function _2d(_2e,_2f,_30){if(_2f.match(/['"]/)){_2f=eval(_2f);}var _31=_1e[_30||""];return function(_32){var _33=_32.getAttribute(_2e);return _33&&_31(_33,_2f);};};function _34(_35){return function(_36,_37){while((_36=_36.parentNode)!=_37){if(_35(_36,_37)){return true;}}};};function _38(_39){return function(_3a,_3b){_3a=_3a.parentNode;return _39?_3a!=_3b&&_39(_3a,_3b):_3a==_3b;};};var _3c={};function and(_3d,_3e){return _3d?function(_3f,_40){return _3e(_3f)&&_3d(_3f,_40);}:_3e;};return function(_41,_42,_43){var _44=_3c[_42];if(!_44){if(_42.replace(/(?:\s*([> ])\s*)|(\.)?([\w-]+)|\[([\w-]+)\s*(.?=)?\s*([^\]]*)\]/g,function(t,_45,_46,_47,_48,_49,_4a){if(_47){if(_46=="."){_44=and(_44,_1a(_47));}else{_44=and(_44,tag(_47));}}else{if(_45){_44=(_45==" "?_34:_38)(_44);}else{if(_48){_44=and(_44,_2d(_48,_4a,_49));}}}return "";})){throw new Error("Syntax error in query");}if(!_44){return true;}_3c[_42]=_44;}return _44(_41,_43);};})();}if(!_1("dom-qsa")){var _9=function(_4b,_4c){_4b=_4b.split(/\s*,\s*/);var _4d=[];for(var i=0;i<_4b.length;i++){var _4e=_6(_4b[i],_4c);for(var j=0,l=_4e.length;j<l;j++){var _4f=_4e[j];_4d[_4f.sourceIndex]=_4f;}}var _50=[];for(i in _4d){_50.push(_4d[i]);}return _50;};}_6.match=_4?function(_51,_52,_53){if(_53){return _d(_53,_52,function(_54){return _4.call(_51,_54);});}return _4.call(_51,_52);}:_10;return _6;}); \ No newline at end of file diff --git a/lib/dojo/selector/lite.js.uncompressed.js b/lib/dojo/selector/lite.js.uncompressed.js new file mode 100644 index 00000000..374f7a2a --- /dev/null +++ b/lib/dojo/selector/lite.js.uncompressed.js @@ -0,0 +1,264 @@ +define("dojo/selector/lite", ["../has", "../_base/kernel"], function(has, dojo){ +"use strict"; +// summary: +// A small lightweight query selector engine that implements CSS2.1 selectors +// minus pseudo-classes and the sibling combinator, plus CSS3 attribute selectors +var testDiv = document.createElement("div"); +var matchesSelector = testDiv.matchesSelector || testDiv.webkitMatchesSelector || testDiv.mozMatchesSelector || testDiv.msMatchesSelector || testDiv.oMatchesSelector; // IE9, WebKit, Firefox have this, but not Opera yet +var querySelectorAll = testDiv.querySelectorAll; +has.add("dom-matches-selector", !!matchesSelector); +has.add("dom-qsa", !!querySelectorAll); + +// this is a simple query engine. It has handles basic selectors, and for simple +// common selectors is extremely fast +var liteEngine = function(selector, root){ + if(combine && selector.indexOf(',') > -1){ + return combine(selector, root); + } + var match = (querySelectorAll ? + /^([\w]*)#([\w\-]+$)|^(\.)([\w\-\*]+$)|^(\w+$)/ : // this one only matches on simple queries where we can beat qSA with specific methods + /^([\w]*)#([\w\-]+)(?:\s+(.*))?$|(?:^|(>|.+\s+))([\w\-\*]+)(\S*$)/) // this one matches parts of the query that we can use to speed up manual filtering + .exec(selector); + root = root || document; + if(match){ + // fast path regardless of whether or not querySelectorAll exists + if(match[2]){ + // an #id + // use dojo.byId if available as it fixes the id retrieval in IE + var found = dojo.byId ? dojo.byId(match[2]) : document.getElementById(match[2]); + if(!found || (match[1] && match[1] != found.tagName.toLowerCase())){ + // if there is a tag qualifer and it doesn't match, no matches + return []; + } + if(root != document){ + // there is a root element, make sure we are a child of it + var parent = found; + while(parent != root){ + parent = parent.parentNode; + if(!parent){ + return []; + } + } + } + return match[3] ? + liteEngine(match[3], found) + : [found]; + } + if(match[3] && root.getElementsByClassName){ + // a .class + return root.getElementsByClassName(match[4]); + } + var found; + if(match[5]){ + // a tag + found = root.getElementsByTagName(match[5]); + if(match[4] || match[6]){ + selector = (match[4] || "") + match[6]; + }else{ + // that was the entirety of the query, return results + return found; + } + } + } + if(querySelectorAll){ + // qSA works strangely on Element-rooted queries + // We can work around this by specifying an extra ID on the root + // and working up from there (Thanks to Andrew Dupont for the technique) + // IE 8 doesn't work on object elements + if (root.nodeType === 1 && root.nodeName.toLowerCase() !== "object"){ + return useRoot(root, selector, root.querySelectorAll); + }else{ + // we can use the native qSA + return root.querySelectorAll(selector); + } + }else if(!found){ + // search all children and then filter + found = root.getElementsByTagName("*"); + } + // now we filter the nodes that were found using the matchesSelector + var results = []; + for(var i = 0, l = found.length; i < l; i++){ + var node = found[i]; + if(node.nodeType == 1 && jsMatchesSelector(node, selector, root)){ + // keep the nodes that match the selector + results.push(node); + } + } + return results; +}; +var useRoot = function(context, query, method){ + // this function creates a temporary id so we can do rooted qSA queries, this is taken from sizzle + var oldContext = context, + old = context.getAttribute( "id" ), + nid = old || "__dojo__", + hasParent = context.parentNode, + relativeHierarchySelector = /^\s*[+~]/.test( query ); + + if(relativeHierarchySelector && !hasParent){ + return []; + } + if(!old){ + context.setAttribute("id", nid); + }else{ + nid = nid.replace(/'/g, "\\$&"); + } + if(relativeHierarchySelector && hasParent){ + context = context.parentNode; + } + + try { + return method.call(context, "[id='" + nid + "'] " + query ); + } finally { + if ( !old ) { + oldContext.removeAttribute( "id" ); + } + } +}; + +if(!has("dom-matches-selector")){ + var jsMatchesSelector = (function(){ + // a JS implementation of CSS selector matching, first we start with the various handlers + var caseFix = testDiv.tagName == "div" ? "toLowerCase" : "toUpperCase"; + function tag(tagName){ + tagName = tagName[caseFix](); + return function(node){ + return node.tagName == tagName; + } + } + function className(className){ + var classNameSpaced = ' ' + className + ' '; + return function(node){ + return node.className.indexOf(className) > -1 && (' ' + node.className + ' ').indexOf(classNameSpaced) > -1; + } + } + var attrComparators = { + "^=": function(attrValue, value){ + return attrValue.indexOf(value) == 0; + }, + "*=": function(attrValue, value){ + return attrValue.indexOf(value) > -1; + }, + "$=": function(attrValue, value){ + return attrValue.substring(attrValue.length - value.length, attrValue.length) == value; + }, + "~=": function(attrValue, value){ + return (' ' + attrValue + ' ').indexOf(' ' + value + ' ') > -1; + }, + "|=": function(attrValue, value){ + return (attrValue + '-').indexOf(value + '-') == 0; + }, + "=": function(attrValue, value){ + return attrValue == value; + }, + "": function(attrValue, value){ + return true; + } + }; + function attr(name, value, type){ + if(value.match(/['"]/)){ + // it is quoted, do an eval to parse the string (CSS and JS parsing are close enough) + value = eval(value); + } + var comparator = attrComparators[type || ""]; + return function(node){ + var attrValue = node.getAttribute(name); + return attrValue && comparator(attrValue, value); + } + } + function ancestor(matcher){ + return function(node, root){ + while((node = node.parentNode) != root){ + if(matcher(node, root)){ + return true; + } + } + }; + } + function parent(matcher){ + return function(node, root){ + node = node.parentNode; + return matcher ? + node != root && matcher(node, root) + : node == root; + }; + } + var cache = {}; + function and(matcher, next){ + return matcher ? + function(node, root){ + return next(node) && matcher(node, root); + } + : next; + } + return function(node, selector, root){ + // this returns true or false based on if the node matches the selector (optionally within the given root) + var matcher = cache[selector]; // check to see if we have created a matcher function for the given selector + if(!matcher){ + // create a matcher function for the given selector + // parse the selectors + if(selector.replace(/(?:\s*([> ])\s*)|(\.)?([\w-]+)|\[([\w-]+)\s*(.?=)?\s*([^\]]*)\]/g, function(t, combinator, type, value, attrName, attrType, attrValue){ + if(value){ + if(type == "."){ + matcher = and(matcher, className(value)); + } + else{ + matcher = and(matcher, tag(value)); + } + } + else if(combinator){ + matcher = (combinator == " " ? ancestor : parent)(matcher); + } + else if(attrName){ + matcher = and(matcher, attr(attrName, attrValue, attrType)); + } + return ""; + })){ + throw new Error("Syntax error in query"); + } + if(!matcher){ + return true; + } + cache[selector] = matcher; + } + // now run the matcher function on the node + return matcher(node, root); + }; + })(); +} +if(!has("dom-qsa")){ + var combine = function(selector, root){ + // combined queries + selector = selector.split(/\s*,\s*/); + var indexed = []; + // add all results and keep unique ones, this only runs in IE, so we take advantage + // of known IE features, particularly sourceIndex which is unique and allows us to + // order the results + for(var i = 0; i < selector.length; i++){ + var results = liteEngine(selector[i], root); + for(var j = 0, l = results.length; j < l; j++){ + var node = results[j]; + indexed[node.sourceIndex] = node; + } + } + // now convert from a sparse array to a dense array + var totalResults = []; + for(i in indexed){ + totalResults.push(indexed[i]); + } + return totalResults; + }; +} + +liteEngine.match = matchesSelector ? function(node, selector, root){ + if(root){ + // doesn't support three args, use rooted id trick + return useRoot(root, selector, function(query){ + return matchesSelector.call(node, query); + }); + } + // we have a native matchesSelector, use that + return matchesSelector.call(node, selector); +} : jsMatchesSelector; // otherwise use the JS matches impl + +return liteEngine; +}); diff --git a/lib/dojo/store/Cache.js b/lib/dojo/store/Cache.js index d08d1709..3ca7e050 100644 --- a/lib/dojo/store/Cache.js +++ b/lib/dojo/store/Cache.js @@ -4,149 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.store.Cache"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.store.Cache"] = true; -dojo.provide("dojo.store.Cache"); - -dojo.getObject("store", true, dojo); - -/*===== -dojo.declare("dojo.store.__CacheArgs", null, { - constructor: function(){ - // summary: - // These are additional options for how caching is handled. - // isLoaded: Function? - // This is a function that will be called for each item in a query response to determine - // if it is cacheable. If isLoaded returns true, the item will be cached, otherwise it - // will not be cached. If isLoaded is not provided, all items will be cached. - this.isLoaded = isLoaded; - } -}); -=====*/ -dojo.store.Cache = function(masterStore, cachingStore, /*dojo.store.__CacheArgs*/ options){ - // summary: - // The Cache store wrapper takes a master store and a caching store, - // caches data from the master into the caching store for faster - // lookup. Normally one would use a memory store for the caching - // store and a server store like JsonRest for the master store. - // masterStore: - // This is the authoritative store, all uncached requests or non-safe requests will - // be made against this store. - // cachingStore: - // This is the caching store that will be used to store responses for quick access. - // Typically this should be a local store. - // options: - // These are additional options for how caching is handled. - options = options || {}; - return dojo.delegate(masterStore, { - query: function(query, directives){ - var results = masterStore.query(query, directives); - results.forEach(function(object){ - if(!options.isLoaded || options.isLoaded(object)){ - cachingStore.put(object); - } - }); - return results; - }, - // look for a queryEngine in either store - queryEngine: masterStore.queryEngine || cachingStore.queryEngine, - get: function(id, directives){ - return dojo.when(cachingStore.get(id), function(result){ - return result || dojo.when(masterStore.get(id, directives), function(result){ - if(result){ - cachingStore.put(result, {id: id}); - } - return result; - }); - }); - }, - add: function(object, directives){ - return dojo.when(masterStore.add(object, directives), function(result){ - // now put result in cache - return cachingStore.add(typeof result == "object" ? result : object, directives); - }); - }, - put: function(object, directives){ - // first remove from the cache, so it is empty until we get a response from the master store - cachingStore.remove((directives && directives.id) || this.getIdentity(object)); - return dojo.when(masterStore.put(object, directives), function(result){ - // now put result in cache - return cachingStore.put(typeof result == "object" ? result : object, directives); - }); - }, - remove: function(id, directives){ - return dojo.when(masterStore.remove(id, directives), function(result){ - return cachingStore.remove(id, directives); - }); - }, - evict: function(id){ - return cachingStore.remove(id); - } - }); -}; -/*===== -dojo.declare("dojo.store.Cache", null, { - // example: - // | var master = new dojo.store.Memory(data); - // | var cacher = new dojo.store.Memory(); - // | var store = new dojo.store.Cache(master, cacher); - // - query: function(query, directives){ - // summary: - // Query the underlying master store and cache any results. - // query: Object|String - // The object or string containing query information. Dependent on the query engine used. - // directives: dojo.store.util.SimpleQueryEngine.__queryOptions? - // An optional keyword arguments object with additional parameters describing the query. - // returns: dojo.store.util.QueryResults - // A QueryResults object that can be used to iterate over. - }, - get: function(id, directives){ - // summary: - // Get the object with the specific id. - // id: Number - // The identifier for the object in question. - // directives: dojo.store.__GetOptions? - // Any additional parameters needed to describe how the get should be performed. - // returns: dojo.store.util.QueryResults - // A QueryResults object. - }, - add: function(object, directives){ - // summary: - // Add the given object to the store. - // object: Object - // The object to add to the store. - // directives: dojo.store.__AddOptions? - // Any additional parameters needed to describe how the add should be performed. - // returns: Number - // The new id for the object. - }, - put: function(object, directives){ - // summary: - // Put the object into the store (similar to an HTTP PUT). - // object: Object - // The object to put to the store. - // directives: dojo.store.__PutOptions? - // Any additional parameters needed to describe how the put should be performed. - // returns: Number - // The new id for the object. - }, - remove: function(id, directives){ - // summary: - // Remove the object with the specific id. - // id: Number - // The identifier for the object in question. - // directives: dojo.store.__RemoveOptions? - // Any additional parameters needed to describe how the remove should be performed. - }, - evict: function(id){ - // summary: - // Remove the object with the given id from the underlying caching store. - // id: Number - // The identifier for the object in question. - } -}); -=====*/ - -} +//>>built +define("dojo/store/Cache",["../_base/lang","../_base/Deferred"],function(_1,_2){var _3=_1.getObject("dojo.store",true);_3.Cache=function(_4,_5,_6){_6=_6||{};return _1.delegate(_4,{query:function(_7,_8){var _9=_4.query(_7,_8);_9.forEach(function(_a){if(!_6.isLoaded||_6.isLoaded(_a)){_5.put(_a);}});return _9;},queryEngine:_4.queryEngine||_5.queryEngine,get:function(id,_b){return _2.when(_5.get(id),function(_c){return _c||_2.when(_4.get(id,_b),function(_d){if(_d){_5.put(_d,{id:id});}return _d;});});},add:function(_e,_f){return _2.when(_4.add(_e,_f),function(_10){return _5.add(typeof _10=="object"?_10:_e,_f);});},put:function(_11,_12){_5.remove((_12&&_12.id)||this.getIdentity(_11));return _2.when(_4.put(_11,_12),function(_13){return _5.put(typeof _13=="object"?_13:_11,_12);});},remove:function(id,_14){return _2.when(_4.remove(id,_14),function(_15){return _5.remove(id,_14);});},evict:function(id){return _5.remove(id);}});};return _3.Cache;}); \ No newline at end of file diff --git a/lib/dojo/store/Cache.js.uncompressed.js b/lib/dojo/store/Cache.js.uncompressed.js new file mode 100644 index 00000000..d6951deb --- /dev/null +++ b/lib/dojo/store/Cache.js.uncompressed.js @@ -0,0 +1,148 @@ +define("dojo/store/Cache", ["../_base/lang","../_base/Deferred" +],function(lang, Deferred) { + // module: + // dojo/store/Cache + // summary: + // TODOC + +var store = lang.getObject("dojo.store", true); + +/*===== +dojo.declare("dojo.store.__CacheArgs", null, { + constructor: function(){ + // summary: + // These are additional options for how caching is handled. + // isLoaded: Function? + // This is a function that will be called for each item in a query response to determine + // if it is cacheable. If isLoaded returns true, the item will be cached, otherwise it + // will not be cached. If isLoaded is not provided, all items will be cached. + this.isLoaded = isLoaded; + } +}); +=====*/ +store.Cache = function(masterStore, cachingStore, /*dojo.store.__CacheArgs*/ options){ + // summary: + // The Cache store wrapper takes a master store and a caching store, + // caches data from the master into the caching store for faster + // lookup. Normally one would use a memory store for the caching + // store and a server store like JsonRest for the master store. + // masterStore: + // This is the authoritative store, all uncached requests or non-safe requests will + // be made against this store. + // cachingStore: + // This is the caching store that will be used to store responses for quick access. + // Typically this should be a local store. + // options: + // These are additional options for how caching is handled. + options = options || {}; + return lang.delegate(masterStore, { + query: function(query, directives){ + var results = masterStore.query(query, directives); + results.forEach(function(object){ + if(!options.isLoaded || options.isLoaded(object)){ + cachingStore.put(object); + } + }); + return results; + }, + // look for a queryEngine in either store + queryEngine: masterStore.queryEngine || cachingStore.queryEngine, + get: function(id, directives){ + return Deferred.when(cachingStore.get(id), function(result){ + return result || Deferred.when(masterStore.get(id, directives), function(result){ + if(result){ + cachingStore.put(result, {id: id}); + } + return result; + }); + }); + }, + add: function(object, directives){ + return Deferred.when(masterStore.add(object, directives), function(result){ + // now put result in cache + return cachingStore.add(typeof result == "object" ? result : object, directives); + }); + }, + put: function(object, directives){ + // first remove from the cache, so it is empty until we get a response from the master store + cachingStore.remove((directives && directives.id) || this.getIdentity(object)); + return Deferred.when(masterStore.put(object, directives), function(result){ + // now put result in cache + return cachingStore.put(typeof result == "object" ? result : object, directives); + }); + }, + remove: function(id, directives){ + return Deferred.when(masterStore.remove(id, directives), function(result){ + return cachingStore.remove(id, directives); + }); + }, + evict: function(id){ + return cachingStore.remove(id); + } + }); +}; +/*===== +dojo.declare("dojo.store.Cache", null, { + // example: + // | var master = new dojo.store.Memory(data); + // | var cacher = new dojo.store.Memory(); + // | var store = new dojo.store.Cache(master, cacher); + // + query: function(query, directives){ + // summary: + // Query the underlying master store and cache any results. + // query: Object|String + // The object or string containing query information. Dependent on the query engine used. + // directives: dojo.store.util.SimpleQueryEngine.__queryOptions? + // An optional keyword arguments object with additional parameters describing the query. + // returns: dojo.store.util.QueryResults + // A QueryResults object that can be used to iterate over. + }, + get: function(id, directives){ + // summary: + // Get the object with the specific id. + // id: Number + // The identifier for the object in question. + // directives: dojo.store.__GetOptions? + // Any additional parameters needed to describe how the get should be performed. + // returns: dojo.store.util.QueryResults + // A QueryResults object. + }, + add: function(object, directives){ + // summary: + // Add the given object to the store. + // object: Object + // The object to add to the store. + // directives: dojo.store.__AddOptions? + // Any additional parameters needed to describe how the add should be performed. + // returns: Number + // The new id for the object. + }, + put: function(object, directives){ + // summary: + // Put the object into the store (similar to an HTTP PUT). + // object: Object + // The object to put to the store. + // directives: dojo.store.__PutOptions? + // Any additional parameters needed to describe how the put should be performed. + // returns: Number + // The new id for the object. + }, + remove: function(id, directives){ + // summary: + // Remove the object with the specific id. + // id: Number + // The identifier for the object in question. + // directives: dojo.store.__RemoveOptions? + // Any additional parameters needed to describe how the remove should be performed. + }, + evict: function(id){ + // summary: + // Remove the object with the given id from the underlying caching store. + // id: Number + // The identifier for the object in question. + } +}); +=====*/ +return store.Cache; +}); diff --git a/lib/dojo/store/DataStore.js b/lib/dojo/store/DataStore.js index 99c81fd5..e65eb0e6 100644 --- a/lib/dojo/store/DataStore.js +++ b/lib/dojo/store/DataStore.js @@ -4,139 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.store.DataStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.store.DataStore"] = true; -dojo.provide("dojo.store.DataStore"); -dojo.require("dojo.store.util.QueryResults"); - - -dojo.declare("dojo.store.DataStore", null, { - target: "", - constructor: function(options){ - // summary: - // This is an adapter for using Dojo Data stores with an object store consumer. - // You can provide a Dojo data store and use this adapter to interact with it through - // the Dojo object store API - // options: Object? - // This provides any configuration information that will be mixed into the store, - // including a reference to the Dojo data store under the property "store". - dojo.mixin(this, options); - }, - _objectConverter: function(callback){ - var store = this.store; - return function(item){ - var object = {}; - var attributes = store.getAttributes(item); - for(var i = 0; i < attributes.length; i++){ - object[attributes[i]] = store.getValue(item, attributes[i]); - } - return callback(object); - }; - }, - get: function(id, options){ - // summary: - // Retrieves an object by it's identity. This will trigger a fetchItemByIdentity - // id: Object? - // The identity to use to lookup the object - var returnedObject, returnedError; - var deferred = new dojo.Deferred(); - this.store.fetchItemByIdentity({ - identity: id, - onItem: this._objectConverter(function(object){ - deferred.resolve(returnedObject = object); - }), - onError: function(error){ - deferred.reject(returnedError = error); - } - }); - if(returnedObject){ - // if it was returned synchronously - return returnedObject; - } - if(returnedError){ - throw returnedError; - } - return deferred.promise; - }, - put: function(object, options){ - // summary: - // Stores an object by its identity. - // object: Object - // The object to store. - // options: Object? - // Additional metadata for storing the data. Includes a reference to an id - // that the object may be stored with (i.e. { id: "foo" }). - var id = options && typeof options.id != "undefined" || this.getIdentity(object); - var store = this.store; - if(typeof id == "undefined"){ - store.newItem(object); - }else{ - store.fetchItemByIdentity({ - identity: id, - onItem: function(item){ - if(item){ - for(var i in object){ - if(store.getValue(item, i) != object[i]){ - store.setValue(item, i, object[i]); - } - } - }else{ - store.newItem(object); - } - } - }); - } - }, - remove: function(id){ - // summary: - // Deletes an object by its identity. - // id: Object - // The identity to use to delete the object - var store = this.store; - this.store.fetchItemByIdentity({ - identity: id, - onItem: function(item){ - store.deleteItem(item); - } - }); - }, - query: function(query, options){ - // summary: - // Queries the store for objects. - // query: Object - // The query to use for retrieving objects from the store - // options: Object? - // Optional options object as used by the underlying dojo.data Store. - // returns: dojo.store.util.QueryResults - // A query results object that can be used to iterate over results. - var returnedObject, returnedError; - var deferred = new dojo.Deferred(); - deferred.total = new dojo.Deferred(); - var converter = this._objectConverter(function(object){return object;}); - this.store.fetch(dojo.mixin({ - query: query, - onBegin: function(count){ - deferred.total.resolve(count); - }, - onComplete: function(results){ - deferred.resolve(dojo.map(results, converter)); - }, - onError: function(error){ - deferred.reject(error); - } - }, options)); - return dojo.store.util.QueryResults(deferred); - }, - getIdentity: function(object){ - // summary: - // Fetch the identity for the given object. - // object: Object - // The data object to get the identity from. - // returns: Number - // The id of the given object. - return object[this.idProperty || this.store.getIdentityAttributes()[0]]; - } -}); - -} +//>>built +define("dojo/store/DataStore",["../_base/lang","../_base/declare","../_base/Deferred","../_base/array","./util/QueryResults"],function(_1,_2,_3,_4,_5){return _2("dojo.store.DataStore",null,{target:"",constructor:function(_6){_1.mixin(this,_6);if(!"idProperty" in _6){var _7;try{_7=this.store.getIdentityAttributes();}catch(e){}this.idProperty=(!_7||!idAttributes[0])||this.idProperty;}var _8=this.store.getFeatures();if(!_8["dojo.data.api.Read"]){this.get=null;}if(!_8["dojo.data.api.Identity"]){this.getIdentity=null;}if(!_8["dojo.data.api.Write"]){this.put=this.add=null;}},idProperty:"id",store:null,_objectConverter:function(_9){var _a=this.store;var _b=this.idProperty;return function(_c){var _d={};var _e=_a.getAttributes(_c);for(var i=0;i<_e.length;i++){_d[_e[i]]=_a.getValue(_c,_e[i]);}if(!(_b in _d)){_d[_b]=_a.getIdentity(_c);}return _9(_d);};},get:function(id,_f){var _10,_11;var _12=new _3();this.store.fetchItemByIdentity({identity:id,onItem:this._objectConverter(function(_13){_12.resolve(_10=_13);}),onError:function(_14){_12.reject(_11=_14);}});if(_10){return _10;}if(_11){throw _11;}return _12.promise;},put:function(_15,_16){var id=_16&&typeof _16.id!="undefined"||this.getIdentity(_15);var _17=this.store;var _18=this.idProperty;if(typeof id=="undefined"){_17.newItem(_15);}else{_17.fetchItemByIdentity({identity:id,onItem:function(_19){if(_19){for(var i in _15){if(i!=_18&&_17.getValue(_19,i)!=_15[i]){_17.setValue(_19,i,_15[i]);}}}else{_17.newItem(_15);}}});}},remove:function(id){var _1a=this.store;this.store.fetchItemByIdentity({identity:id,onItem:function(_1b){_1a.deleteItem(_1b);}});},query:function(_1c,_1d){var _1e;var _1f=new _3(function(){_1e.abort&&_1e.abort();});_1f.total=new _3();var _20=this._objectConverter(function(_21){return _21;});_1e=this.store.fetch(_1.mixin({query:_1c,onBegin:function(_22){_1f.total.resolve(_22);},onComplete:function(_23){_1f.resolve(_4.map(_23,_20));},onError:function(_24){_1f.reject(_24);}},_1d));return _5(_1f);},getIdentity:function(_25){return _25[this.idProperty];}});}); \ No newline at end of file diff --git a/lib/dojo/store/DataStore.js.uncompressed.js b/lib/dojo/store/DataStore.js.uncompressed.js new file mode 100644 index 00000000..e2a96e31 --- /dev/null +++ b/lib/dojo/store/DataStore.js.uncompressed.js @@ -0,0 +1,170 @@ +define("dojo/store/DataStore", ["../_base/lang", "../_base/declare", "../_base/Deferred", "../_base/array", "./util/QueryResults" +], function(lang,declare,Deferred,array,QueryResults) { + // module: + // dojo/store/DataStore + // summary: + // TODOC + + +return declare("dojo.store.DataStore", null, { + target: "", + constructor: function(options){ + // summary: + // This is an adapter for using Dojo Data stores with an object store consumer. + // You can provide a Dojo data store and use this adapter to interact with it through + // the Dojo object store API + // options: Object? + // This provides any configuration information that will be mixed into the store, + // including a reference to the Dojo data store under the property "store". + lang.mixin(this, options); + if(!"idProperty" in options){ + var idAttribute; + try{ + idAttribute = this.store.getIdentityAttributes(); + }catch(e){ + // some store are not requiring an item instance to give us the ID attributes + // but some other do and throw errors in that case. + } + // if no idAttribute we have implicit id + this.idProperty = (!idAttribute || !idAttributes[0]) || this.idProperty; + } + var features = this.store.getFeatures(); + // check the feature set and null out any methods that shouldn't be available + if(!features["dojo.data.api.Read"]){ + this.get = null; + } + if(!features["dojo.data.api.Identity"]){ + this.getIdentity = null; + } + if(!features["dojo.data.api.Write"]){ + this.put = this.add = null; + } + }, + // idProperty: String + // The object property to use to store the identity of the store items. + idProperty: "id", + // store: + // The object store to convert to a data store + store: null, + _objectConverter: function(callback){ + var store = this.store; + var idProperty = this.idProperty; + return function(item){ + var object = {}; + var attributes = store.getAttributes(item); + for(var i = 0; i < attributes.length; i++){ + object[attributes[i]] = store.getValue(item, attributes[i]); + } + if(!(idProperty in object)){ + object[idProperty] = store.getIdentity(item); + } + return callback(object); + }; + }, + get: function(id, options){ + // summary: + // Retrieves an object by it's identity. This will trigger a fetchItemByIdentity + // id: Object? + // The identity to use to lookup the object + var returnedObject, returnedError; + var deferred = new Deferred(); + this.store.fetchItemByIdentity({ + identity: id, + onItem: this._objectConverter(function(object){ + deferred.resolve(returnedObject = object); + }), + onError: function(error){ + deferred.reject(returnedError = error); + } + }); + if(returnedObject){ + // if it was returned synchronously + return returnedObject; + } + if(returnedError){ + throw returnedError; + } + return deferred.promise; + }, + put: function(object, options){ + // summary: + // Stores an object by its identity. + // object: Object + // The object to store. + // options: Object? + // Additional metadata for storing the data. Includes a reference to an id + // that the object may be stored with (i.e. { id: "foo" }). + var id = options && typeof options.id != "undefined" || this.getIdentity(object); + var store = this.store; + var idProperty = this.idProperty; + if(typeof id == "undefined"){ + store.newItem(object); + }else{ + store.fetchItemByIdentity({ + identity: id, + onItem: function(item){ + if(item){ + for(var i in object){ + if(i != idProperty && // don't copy id properties since they are immutable and should be omitted for implicit ids + store.getValue(item, i) != object[i]){ + store.setValue(item, i, object[i]); + } + } + }else{ + store.newItem(object); + } + } + }); + } + }, + remove: function(id){ + // summary: + // Deletes an object by its identity. + // id: Object + // The identity to use to delete the object + var store = this.store; + this.store.fetchItemByIdentity({ + identity: id, + onItem: function(item){ + store.deleteItem(item); + } + }); + }, + query: function(query, options){ + // summary: + // Queries the store for objects. + // query: Object + // The query to use for retrieving objects from the store + // options: Object? + // Optional options object as used by the underlying dojo.data Store. + // returns: dojo.store.util.QueryResults + // A query results object that can be used to iterate over results. + var fetchHandle; + var deferred = new Deferred(function(){ fetchHandle.abort && fetchHandle.abort(); }); + deferred.total = new Deferred(); + var converter = this._objectConverter(function(object){return object;}); + fetchHandle = this.store.fetch(lang.mixin({ + query: query, + onBegin: function(count){ + deferred.total.resolve(count); + }, + onComplete: function(results){ + deferred.resolve(array.map(results, converter)); + }, + onError: function(error){ + deferred.reject(error); + } + }, options)); + return QueryResults(deferred); + }, + getIdentity: function(object){ + // summary: + // Fetch the identity for the given object. + // object: Object + // The data object to get the identity from. + // returns: Number + // The id of the given object. + return object[this.idProperty]; + } +}); +}); diff --git a/lib/dojo/store/JsonRest.js b/lib/dojo/store/JsonRest.js index 5f9254c3..dc00d973 100644 --- a/lib/dojo/store/JsonRest.js +++ b/lib/dojo/store/JsonRest.js @@ -4,143 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.store.JsonRest"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.store.JsonRest"] = true; -dojo.provide("dojo.store.JsonRest"); -dojo.require("dojo.store.util.QueryResults"); - - -dojo.declare("dojo.store.JsonRest", null, { - constructor: function(/*dojo.store.JsonRest*/ options){ - // summary: - // This is a basic store for RESTful communicating with a server through JSON - // formatted data. - // options: - // This provides any configuration information that will be mixed into the store - dojo.mixin(this, options); - }, - // target: String - // The target base URL to use for all requests to the server. This string will be - // prepended to the id to generate the URL (relative or absolute) for requests - // sent to the server - target: "", - // idProperty: String - // Indicates the property to use as the identity property. The values of this - // property should be unique. - idProperty: "id", - - get: function(id, options){ - // summary: - // Retrieves an object by its identity. This will trigger a GET request to the server using - // the url `this.target + id`. - // id: Number - // The identity to use to lookup the object - // returns: Object - // The object in the store that matches the given id. - var headers = options || {}; - headers.Accept = "application/javascript, application/json"; - return dojo.xhrGet({ - url:this.target + id, - handleAs: "json", - headers: headers - }); - }, - getIdentity: function(object){ - // summary: - // Returns an object's identity - // object: Object - // The object to get the identity from - // returns: Number - return object[this.idProperty]; - }, - put: function(object, options){ - // summary: - // Stores an object. This will trigger a PUT request to the server - // if the object has an id, otherwise it will trigger a POST request. - // object: Object - // The object to store. - // options: dojo.store.api.Store.PutDirectives? - // Additional metadata for storing the data. Includes an "id" - // property if a specific id is to be used. - // returns: Number - options = options || {}; - var id = ("id" in options) ? options.id : this.getIdentity(object); - var hasId = typeof id != "undefined"; - return dojo.xhr(hasId && !options.incremental ? "PUT" : "POST", { - url: hasId ? this.target + id : this.target, - postData: dojo.toJson(object), - handleAs: "json", - headers:{ - "Content-Type": "application/json", - "If-Match": options.overwrite === true ? "*" : null, - "If-None-Match": options.overwrite === false ? "*" : null - } - }); - }, - add: function(object, options){ - // summary: - // Adds an object. This will trigger a PUT request to the server - // if the object has an id, otherwise it will trigger a POST request. - // object: Object - // The object to store. - // options: dojo.store.api.Store.PutDirectives? - // Additional metadata for storing the data. Includes an "id" - // property if a specific id is to be used. - options = options || {}; - options.overwrite = false; - return this.put(object, options); - }, - remove: function(id){ - // summary: - // Deletes an object by its identity. This will trigger a DELETE request to the server. - // id: Number - // The identity to use to delete the object - return dojo.xhrDelete({ - url:this.target + id - }); - }, - query: function(query, options){ - // summary: - // Queries the store for objects. This will trigger a GET request to the server, with the - // query added as a query string. - // query: Object - // The query to use for retrieving objects from the store. - // options: dojo.store.api.Store.QueryOptions? - // The optional arguments to apply to the resultset. - // returns: dojo.store.api.Store.QueryResults - // The results of the query, extended with iterative methods. - var headers = {Accept: "application/javascript, application/json"}; - options = options || {}; - - if(options.start >= 0 || options.count >= 0){ - headers.Range = "items=" + (options.start || '0') + '-' + - (("count" in options && options.count != Infinity) ? - (options.count + (options.start || 0) - 1) : ''); - } - if(dojo.isObject(query)){ - query = dojo.objectToQuery(query); - query = query ? "?" + query: ""; - } - if(options && options.sort){ - query += (query ? "&" : "?") + "sort("; - for(var i = 0; i<options.sort.length; i++){ - var sort = options.sort[i]; - query += (i > 0 ? "," : "") + (sort.descending ? '-' : '+') + encodeURIComponent(sort.attribute); - } - query += ")"; - } - var results = dojo.xhrGet({ - url: this.target + (query || ""), - handleAs: "json", - headers: headers - }); - results.total = results.then(function(){ - var range = results.ioArgs.xhr.getResponseHeader("Content-Range"); - return range && (range=range.match(/\/(.*)/)) && +range[1]; - }); - return dojo.store.util.QueryResults(results); - } -}); - -} +//>>built +define("dojo/store/JsonRest",["../_base/xhr","../json","../_base/declare","./util/QueryResults"],function(_1,_2,_3,_4){return _3("dojo.store.JsonRest",null,{constructor:function(_5){_3.safeMixin(this,_5);},target:"",idProperty:"id",get:function(id,_6){var _7=_6||{};_7.Accept=this.accepts;return _1("GET",{url:this.target+id,handleAs:"json",headers:_7});},accepts:"application/javascript, application/json",getIdentity:function(_8){return _8[this.idProperty];},put:function(_9,_a){_a=_a||{};var id=("id" in _a)?_a.id:this.getIdentity(_9);var _b=typeof id!="undefined";return _1(_b&&!_a.incremental?"PUT":"POST",{url:_b?this.target+id:this.target,postData:_2.stringify(_9),handleAs:"json",headers:{"Content-Type":"application/json",Accept:this.accepts,"If-Match":_a.overwrite===true?"*":null,"If-None-Match":_a.overwrite===false?"*":null}});},add:function(_c,_d){_d=_d||{};_d.overwrite=false;return this.put(_c,_d);},remove:function(id){return _1("DELETE",{url:this.target+id});},query:function(_e,_f){var _10={Accept:this.accepts};_f=_f||{};if(_f.start>=0||_f.count>=0){_10.Range="items="+(_f.start||"0")+"-"+(("count" in _f&&_f.count!=Infinity)?(_f.count+(_f.start||0)-1):"");}if(_e&&typeof _e=="object"){_e=_1.objectToQuery(_e);_e=_e?"?"+_e:"";}if(_f&&_f.sort){var _11=this.sortParam;_e+=(_e?"&":"?")+(_11?_11+"=":"sort(");for(var i=0;i<_f.sort.length;i++){var _12=_f.sort[i];_e+=(i>0?",":"")+(_12.descending?"-":"+")+encodeURIComponent(_12.attribute);}if(!_11){_e+=")";}}var _13=_1("GET",{url:this.target+(_e||""),handleAs:"json",headers:_10});_13.total=_13.then(function(){var _14=_13.ioArgs.xhr.getResponseHeader("Content-Range");return _14&&(_14=_14.match(/\/(.*)/))&&+_14[1];});return _4(_13);}});}); \ No newline at end of file diff --git a/lib/dojo/store/JsonRest.js.uncompressed.js b/lib/dojo/store/JsonRest.js.uncompressed.js new file mode 100644 index 00000000..a395f907 --- /dev/null +++ b/lib/dojo/store/JsonRest.js.uncompressed.js @@ -0,0 +1,155 @@ +define("dojo/store/JsonRest", ["../_base/xhr", "../json", "../_base/declare", "./util/QueryResults" +], function(xhr, JSON, declare, QueryResults) { + // module: + // dojo/store/JsonRest + // summary: + // The module defines a JSON/REST based object store + +return declare("dojo.store.JsonRest", null, { + // summary: + // This is a basic store for RESTful communicating with a server through JSON + // formatted data. It implements dojo.store.api.Store. + + constructor: function(/*dojo.store.JsonRest*/ options){ + // summary: + // This is a basic store for RESTful communicating with a server through JSON + // formatted data. + // options: + // This provides any configuration information that will be mixed into the store + declare.safeMixin(this, options); + }, + // target: String + // The target base URL to use for all requests to the server. This string will be + // prepended to the id to generate the URL (relative or absolute) for requests + // sent to the server + target: "", + // idProperty: String + // Indicates the property to use as the identity property. The values of this + // property should be unique. + idProperty: "id", + // sortParam: String + // The query parameter to used for holding sort information. If this is omitted, than + // the sort information is included in a functional query token to avoid colliding + // with the set of name/value pairs. + + get: function(id, options){ + // summary: + // Retrieves an object by its identity. This will trigger a GET request to the server using + // the url `this.target + id`. + // id: Number + // The identity to use to lookup the object + // returns: Object + // The object in the store that matches the given id. + var headers = options || {}; + headers.Accept = this.accepts; + return xhr("GET", { + url:this.target + id, + handleAs: "json", + headers: headers + }); + }, + // accepts: String + // Defines the Accept header to use on HTTP requests + accepts: "application/javascript, application/json", + getIdentity: function(object){ + // summary: + // Returns an object's identity + // object: Object + // The object to get the identity from + // returns: Number + return object[this.idProperty]; + }, + put: function(object, options){ + // summary: + // Stores an object. This will trigger a PUT request to the server + // if the object has an id, otherwise it will trigger a POST request. + // object: Object + // The object to store. + // options: dojo.store.api.Store.PutDirectives? + // Additional metadata for storing the data. Includes an "id" + // property if a specific id is to be used. + // returns: Number + options = options || {}; + var id = ("id" in options) ? options.id : this.getIdentity(object); + var hasId = typeof id != "undefined"; + return xhr(hasId && !options.incremental ? "PUT" : "POST", { + url: hasId ? this.target + id : this.target, + postData: JSON.stringify(object), + handleAs: "json", + headers:{ + "Content-Type": "application/json", + Accept: this.accepts, + "If-Match": options.overwrite === true ? "*" : null, + "If-None-Match": options.overwrite === false ? "*" : null + } + }); + }, + add: function(object, options){ + // summary: + // Adds an object. This will trigger a PUT request to the server + // if the object has an id, otherwise it will trigger a POST request. + // object: Object + // The object to store. + // options: dojo.store.api.Store.PutDirectives? + // Additional metadata for storing the data. Includes an "id" + // property if a specific id is to be used. + options = options || {}; + options.overwrite = false; + return this.put(object, options); + }, + remove: function(id){ + // summary: + // Deletes an object by its identity. This will trigger a DELETE request to the server. + // id: Number + // The identity to use to delete the object + return xhr("DELETE",{ + url:this.target + id + }); + }, + query: function(query, options){ + // summary: + // Queries the store for objects. This will trigger a GET request to the server, with the + // query added as a query string. + // query: Object + // The query to use for retrieving objects from the store. + // options: dojo.store.api.Store.QueryOptions? + // The optional arguments to apply to the resultset. + // returns: dojo.store.api.Store.QueryResults + // The results of the query, extended with iterative methods. + var headers = {Accept: this.accepts}; + options = options || {}; + + if(options.start >= 0 || options.count >= 0){ + headers.Range = "items=" + (options.start || '0') + '-' + + (("count" in options && options.count != Infinity) ? + (options.count + (options.start || 0) - 1) : ''); + } + if(query && typeof query == "object"){ + query = xhr.objectToQuery(query); + query = query ? "?" + query: ""; + } + if(options && options.sort){ + var sortParam = this.sortParam; + query += (query ? "&" : "?") + (sortParam ? sortParam + '=' : "sort("); + for(var i = 0; i<options.sort.length; i++){ + var sort = options.sort[i]; + query += (i > 0 ? "," : "") + (sort.descending ? '-' : '+') + encodeURIComponent(sort.attribute); + } + if(!sortParam){ + query += ")"; + } + } + var results = xhr("GET", { + url: this.target + (query || ""), + handleAs: "json", + headers: headers + }); + results.total = results.then(function(){ + var range = results.ioArgs.xhr.getResponseHeader("Content-Range"); + return range && (range=range.match(/\/(.*)/)) && +range[1]; + }); + return QueryResults(results); + } +}); + +}); \ No newline at end of file diff --git a/lib/dojo/store/Memory.js b/lib/dojo/store/Memory.js index b9001cda..9d1b17a9 100644 --- a/lib/dojo/store/Memory.js +++ b/lib/dojo/store/Memory.js @@ -4,161 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.store.Memory"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.store.Memory"] = true; -dojo.provide("dojo.store.Memory"); -dojo.require("dojo.store.util.QueryResults"); -dojo.require("dojo.store.util.SimpleQueryEngine"); - - -dojo.declare("dojo.store.Memory", null, { - // summary: - // This is a basic in-memory object store. It implements dojo.store.api.Store. - constructor: function(/*dojo.store.Memory*/ options){ - // summary: - // Creates a memory object store. - // options: - // This provides any configuration information that will be mixed into the store. - // This should generally include the data property to provide the starting set of data. - this.index = {}; - dojo.mixin(this, options); - this.setData(this.data || []); - }, - // data: Array - // The array of all the objects in the memory store - data:null, - - // idProperty: String - // Indicates the property to use as the identity property. The values of this - // property should be unique. - idProperty: "id", - - // index: Object - // An index of data by id - index:null, - - // queryEngine: Function - // Defines the query engine to use for querying the data store - queryEngine: dojo.store.util.SimpleQueryEngine, - get: function(id){ - // summary: - // Retrieves an object by its identity - // id: Number - // The identity to use to lookup the object - // returns: Object - // The object in the store that matches the given id. - return this.index[id]; - }, - getIdentity: function(object){ - // summary: - // Returns an object's identity - // object: Object - // The object to get the identity from - // returns: Number - return object[this.idProperty]; - }, - put: function(object, options){ - // summary: - // Stores an object - // object: Object - // The object to store. - // options: dojo.store.api.Store.PutDirectives?? - // Additional metadata for storing the data. Includes an "id" - // property if a specific id is to be used. - // returns: Number - var id = options && options.id || object[this.idProperty] || Math.random(); - this.index[id] = object; - var data = this.data, - idProperty = this.idProperty; - for(var i = 0, l = data.length; i < l; i++){ - if(data[i][idProperty] == id){ - data[i] = object; - return id; - } - } - this.data.push(object); - return id; - }, - add: function(object, options){ - // summary: - // Creates an object, throws an error if the object already exists - // object: Object - // The object to store. - // options: dojo.store.api.Store.PutDirectives?? - // Additional metadata for storing the data. Includes an "id" - // property if a specific id is to be used. - // returns: Number - if(this.index[options && options.id || object[this.idProperty]]){ - throw new Error("Object already exists"); - } - return this.put(object, options); - }, - remove: function(id){ - // summary: - // Deletes an object by its identity - // id: Number - // The identity to use to delete the object - delete this.index[id]; - var data = this.data, - idProperty = this.idProperty; - for(var i = 0, l = data.length; i < l; i++){ - if(data[i][idProperty] == id){ - data.splice(i, 1); - return; - } - } - }, - query: function(query, options){ - // summary: - // Queries the store for objects. - // query: Object - // The query to use for retrieving objects from the store. - // options: dojo.store.api.Store.QueryOptions? - // The optional arguments to apply to the resultset. - // returns: dojo.store.api.Store.QueryResults - // The results of the query, extended with iterative methods. - // - // example: - // Given the following store: - // - // | var store = new dojo.store.Memory({ - // | data: [ - // | {id: 1, name: "one", prime: false }, - // | {id: 2, name: "two", even: true, prime: true}, - // | {id: 3, name: "three", prime: true}, - // | {id: 4, name: "four", even: true, prime: false}, - // | {id: 5, name: "five", prime: true} - // | ] - // | }); - // - // ...find all items where "prime" is true: - // - // | var results = store.query({ prime: true }); - // - // ...or find all items where "even" is true: - // - // | var results = store.query({ even: true }); - return dojo.store.util.QueryResults(this.queryEngine(query, options)(this.data)); - }, - setData: function(data){ - // summary: - // Sets the given data as the source for this store, and indexes it - // data: Object[] - // An array of objects to use as the source of data. - if(data.items){ - // just for convenience with the data format IFRS expects - this.idProperty = data.identifier; - data = this.data = data.items; - }else{ - this.data = data; - } - - for(var i = 0, l = data.length; i < l; i++){ - var object = data[i]; - this.index[object[this.idProperty]] = object; - } - } -}); - -} +//>>built +define("dojo/store/Memory",["../_base/declare","./util/QueryResults","./util/SimpleQueryEngine"],function(_1,_2,_3){return _1("dojo.store.Memory",null,{constructor:function(_4){for(var i in _4){this[i]=_4[i];}this.setData(this.data||[]);},data:null,idProperty:"id",index:null,queryEngine:_3,get:function(id){return this.data[this.index[id]];},getIdentity:function(_5){return _5[this.idProperty];},put:function(_6,_7){var _8=this.data,_9=this.index,_a=this.idProperty;var id=(_7&&"id" in _7)?_7.id:_a in _6?_6[_a]:Math.random();if(id in _9){if(_7&&_7.overwrite===false){throw new Error("Object already exists");}_8[_9[id]]=_6;}else{_9[id]=_8.push(_6)-1;}return id;},add:function(_b,_c){(_c=_c||{}).overwrite=false;return this.put(_b,_c);},remove:function(id){var _d=this.index;var _e=this.data;if(id in _d){_e.splice(_d[id],1);this.setData(_e);return true;}},query:function(_f,_10){return _2(this.queryEngine(_f,_10)(this.data));},setData:function(_11){if(_11.items){this.idProperty=_11.identifier;_11=this.data=_11.items;}else{this.data=_11;}this.index={};for(var i=0,l=_11.length;i<l;i++){this.index[_11[i][this.idProperty]]=i;}}});}); \ No newline at end of file diff --git a/lib/dojo/store/Memory.js.uncompressed.js b/lib/dojo/store/Memory.js.uncompressed.js new file mode 100644 index 00000000..ecea859b --- /dev/null +++ b/lib/dojo/store/Memory.js.uncompressed.js @@ -0,0 +1,161 @@ +define("dojo/store/Memory", ["../_base/declare", "./util/QueryResults", "./util/SimpleQueryEngine"], function(declare, QueryResults, SimpleQueryEngine) { + // module: + // dojo/store/Memory + // summary: + // The module defines an in-memory object store. + + +return declare("dojo.store.Memory", null, { + // summary: + // This is a basic in-memory object store. It implements dojo.store.api.Store. + constructor: function(/*dojo.store.Memory*/ options){ + // summary: + // Creates a memory object store. + // options: + // This provides any configuration information that will be mixed into the store. + // This should generally include the data property to provide the starting set of data. + for(var i in options){ + this[i] = options[i]; + } + this.setData(this.data || []); + }, + // data: Array + // The array of all the objects in the memory store + data:null, + + // idProperty: String + // Indicates the property to use as the identity property. The values of this + // property should be unique. + idProperty: "id", + + // index: Object + // An index of data indices into the data array by id + index:null, + + // queryEngine: Function + // Defines the query engine to use for querying the data store + queryEngine: SimpleQueryEngine, + get: function(id){ + // summary: + // Retrieves an object by its identity + // id: Number + // The identity to use to lookup the object + // returns: Object + // The object in the store that matches the given id. + return this.data[this.index[id]]; + }, + getIdentity: function(object){ + // summary: + // Returns an object's identity + // object: Object + // The object to get the identity from + // returns: Number + return object[this.idProperty]; + }, + put: function(object, options){ + // summary: + // Stores an object + // object: Object + // The object to store. + // options: dojo.store.api.Store.PutDirectives?? + // Additional metadata for storing the data. Includes an "id" + // property if a specific id is to be used. + // returns: Number + var data = this.data, + index = this.index, + idProperty = this.idProperty; + var id = (options && "id" in options) ? options.id : idProperty in object ? object[idProperty] : Math.random(); + if(id in index){ + // object exists + if(options && options.overwrite === false){ + throw new Error("Object already exists"); + } + // replace the entry in data + data[index[id]] = object; + }else{ + // add the new object + index[id] = data.push(object) - 1; + } + return id; + }, + add: function(object, options){ + // summary: + // Creates an object, throws an error if the object already exists + // object: Object + // The object to store. + // options: dojo.store.api.Store.PutDirectives?? + // Additional metadata for storing the data. Includes an "id" + // property if a specific id is to be used. + // returns: Number + (options = options || {}).overwrite = false; + // call put with overwrite being false + return this.put(object, options); + }, + remove: function(id){ + // summary: + // Deletes an object by its identity + // id: Number + // The identity to use to delete the object + // returns: Boolean + // Returns true if an object was removed, falsy (undefined) if no object matched the id + var index = this.index; + var data = this.data; + if(id in index){ + data.splice(index[id], 1); + // now we have to reindex + this.setData(data); + return true; + } + }, + query: function(query, options){ + // summary: + // Queries the store for objects. + // query: Object + // The query to use for retrieving objects from the store. + // options: dojo.store.api.Store.QueryOptions? + // The optional arguments to apply to the resultset. + // returns: dojo.store.api.Store.QueryResults + // The results of the query, extended with iterative methods. + // + // example: + // Given the following store: + // + // | var store = new dojo.store.Memory({ + // | data: [ + // | {id: 1, name: "one", prime: false }, + // | {id: 2, name: "two", even: true, prime: true}, + // | {id: 3, name: "three", prime: true}, + // | {id: 4, name: "four", even: true, prime: false}, + // | {id: 5, name: "five", prime: true} + // | ] + // | }); + // + // ...find all items where "prime" is true: + // + // | var results = store.query({ prime: true }); + // + // ...or find all items where "even" is true: + // + // | var results = store.query({ even: true }); + return QueryResults(this.queryEngine(query, options)(this.data)); + }, + setData: function(data){ + // summary: + // Sets the given data as the source for this store, and indexes it + // data: Object[] + // An array of objects to use as the source of data. + if(data.items){ + // just for convenience with the data format IFRS expects + this.idProperty = data.identifier; + data = this.data = data.items; + }else{ + this.data = data; + } + this.index = {}; + for(var i = 0, l = data.length; i < l; i++){ + this.index[data[i][this.idProperty]] = i; + } + } +}); + +}); diff --git a/lib/dojo/store/Observable.js b/lib/dojo/store/Observable.js index f231e032..a1d47cc5 100644 --- a/lib/dojo/store/Observable.js +++ b/lib/dojo/store/Observable.js @@ -4,170 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.store.Observable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.store.Observable"] = true; -dojo.provide("dojo.store.Observable"); - -dojo.getObject("store", true, dojo); - -dojo.store.Observable = function(store){ - // summary: - // The Observable store wrapper takes a store and sets an observe method on query() - // results that can be used to monitor results for changes. - // - // description: - // Observable wraps an existing store so that notifications can be made when a query - // is performed. - // - // example: - // Create a Memory store that returns an observable query, and then log some - // information about that query. - // - // | var store = dojo.store.Observable(new dojo.store.Memory({ - // | data: [ - // | {id: 1, name: "one", prime: false}, - // | {id: 2, name: "two", even: true, prime: true}, - // | {id: 3, name: "three", prime: true}, - // | {id: 4, name: "four", even: true, prime: false}, - // | {id: 5, name: "five", prime: true} - // | ] - // | })); - // | var changes = [], results = store.query({ prime: true }); - // | var observer = results.observe(function(object, previousIndex, newIndex){ - // | changes.push({previousIndex:previousIndex, newIndex:newIndex, object:object}); - // | }); - // - // See the Observable tests for more information. - - var queryUpdaters = [], revision = 0; - // a Comet driven store could directly call notify to notify observers when data has - // changed on the backend - store.notify = function(object, existingId){ - revision++; - var updaters = queryUpdaters.slice(); - for(var i = 0, l = updaters.length; i < l; i++){ - updaters[i](object, existingId); - } - }; - var originalQuery = store.query; - store.query = function(query, options){ - options = options || {}; - var results = originalQuery.apply(this, arguments); - if(results && results.forEach){ - var nonPagedOptions = dojo.mixin({}, options); - delete nonPagedOptions.start; - delete nonPagedOptions.count; - - var queryExecutor = store.queryEngine && store.queryEngine(query, nonPagedOptions); - var queryRevision = revision; - var listeners = [], queryUpdater; - results.observe = function(listener, includeObjectUpdates){ - if(listeners.push(listener) == 1){ - // first listener was added, create the query checker and updater - queryUpdaters.push(queryUpdater = function(changed, existingId){ - dojo.when(results, function(resultsArray){ - var atEnd = resultsArray.length != options.count; - var i; - if(++queryRevision != revision){ - throw new Error("Query is out of date, you must observe() the query prior to any data modifications"); - } - var removedObject, removedFrom = -1, insertedInto = -1; - if(existingId){ - // remove the old one - for(i = 0, l = resultsArray.length; i < l; i++){ - var object = resultsArray[i]; - if(store.getIdentity(object) == existingId){ - removedObject = object; - removedFrom = i; - if(queryExecutor || !changed){// if it was changed and we don't have a queryExecutor, we shouldn't remove it because updated objects would be eliminated - resultsArray.splice(i, 1); - } - break; - } - } - } - if(queryExecutor){ - // add the new one - if(changed && - // if a matches function exists, use that (probably more efficient) - (queryExecutor.matches ? queryExecutor.matches(changed) : queryExecutor([changed]).length)){ - - if(removedFrom > -1){ - // put back in the original slot so it doesn't move unless it needs to (relying on a stable sort below) - resultsArray.splice(removedFrom, 0, changed); - }else{ - resultsArray.push(changed); - } - insertedInto = dojo.indexOf(queryExecutor(resultsArray), changed); - if((options.start && insertedInto == 0) || - (!atEnd && insertedInto == resultsArray.length -1)){ - // if it is at the end of the page, assume it goes into the prev or next page - insertedInto = -1; - } - } - }else if(changed){ - // we don't have a queryEngine, so we can't provide any information - // about where it was inserted, but we can at least indicate a new object - insertedInto = removedFrom >= 0 ? removedFrom : (store.defaultIndex || 0); - } - if((removedFrom > -1 || insertedInto > -1) && - (includeObjectUpdates || !queryExecutor || (removedFrom != insertedInto))){ - var copyListeners = listeners.slice(); - for(i = 0;listener = copyListeners[i]; i++){ - listener(changed || removedObject, removedFrom, insertedInto); - } - } - }); - }); - } - return { - cancel: function(){ - // remove this listener - listeners.splice(dojo.indexOf(listeners, listener), 1); - if(!listeners.length){ - // no more listeners, remove the query updater too - queryUpdaters.splice(dojo.indexOf(queryUpdaters, queryUpdater), 1); - } - } - }; - }; - } - return results; - }; - var inMethod; - function whenFinished(method, action){ - var original = store[method]; - if(original){ - store[method] = function(value){ - if(inMethod){ - // if one method calls another (like add() calling put()) we don't want two events - return original.apply(this, arguments); - } - inMethod = true; - try{ - return dojo.when(original.apply(this, arguments), function(results){ - action((typeof results == "object" && results) || value); - return results; - }); - }finally{ - inMethod = false; - } - }; - } - } - // monitor for updates by listening to these methods - whenFinished("put", function(object){ - store.notify(object, store.getIdentity(object)); - }); - whenFinished("add", function(object){ - store.notify(object); - }); - whenFinished("remove", function(id){ - store.notify(undefined, id); - }); - - return store; -}; - -} +//>>built +define("dojo/store/Observable",["../_base/kernel","../_base/lang","../_base/Deferred","../_base/array"],function(_1,_2,_3,_4){var ds=_2.getObject("dojo.store",true);return ds.Observable=function(_5){var _6,_7=[],_8=0;_5.notify=function(_9,_a){_8++;var _b=_7.slice();for(var i=0,l=_b.length;i<l;i++){_b[i](_9,_a);}};var _c=_5.query;_5.query=function(_d,_e){_e=_e||{};var _f=_c.apply(this,arguments);if(_f&&_f.forEach){var _10=_2.mixin({},_e);delete _10.start;delete _10.count;var _11=_5.queryEngine&&_5.queryEngine(_d,_10);var _12=_8;var _13=[],_14;_f.observe=function(_15,_16){if(_13.push(_15)==1){_7.push(_14=function(_17,_18){_3.when(_f,function(_19){var _1a=_19.length!=_e.count;var i,l,_15;if(++_12!=_8){throw new Error("Query is out of date, you must observe() the query prior to any data modifications");}var _1b,_1c=-1,_1d=-1;if(_18!==_6){for(i=0,l=_19.length;i<l;i++){var _1e=_19[i];if(_5.getIdentity(_1e)==_18){_1b=_1e;_1c=i;if(_11||!_17){_19.splice(i,1);}break;}}}if(_11){if(_17&&(_11.matches?_11.matches(_17):_11([_17]).length)){var _1f=_1c>-1?_1c:_19.length;_19.splice(_1f,0,_17);_1d=_4.indexOf(_11(_19),_17);_19.splice(_1f,1);if((_e.start&&_1d==0)||(!_1a&&_1d==_19.length)){_1d=-1;}else{_19.splice(_1d,0,_17);}}}else{if(_17&&!_e.start){_1d=_1c>=0?_1c:(_5.defaultIndex||0);}}if((_1c>-1||_1d>-1)&&(_16||!_11||(_1c!=_1d))){var _20=_13.slice();for(i=0;_15=_20[i];i++){_15(_17||_1b,_1c,_1d);}}});});}return {cancel:function(){var _21=_4.indexOf(_13,_15);if(_21>-1){_13.splice(_21,1);if(!_13.length){_7.splice(_4.indexOf(_7,_14),1);}}}};};}return _f;};var _22;function _23(_24,_25){var _26=_5[_24];if(_26){_5[_24]=function(_27){if(_22){return _26.apply(this,arguments);}_22=true;try{var _28=_26.apply(this,arguments);_3.when(_28,function(_29){_25((typeof _29=="object"&&_29)||_27);});return _28;}finally{_22=false;}};}};_23("put",function(_2a){_5.notify(_2a,_5.getIdentity(_2a));});_23("add",function(_2b){_5.notify(_2b);});_23("remove",function(id){_5.notify(undefined,id);});return _5;};}); \ No newline at end of file diff --git a/lib/dojo/store/Observable.js.uncompressed.js b/lib/dojo/store/Observable.js.uncompressed.js new file mode 100644 index 00000000..62e4a859 --- /dev/null +++ b/lib/dojo/store/Observable.js.uncompressed.js @@ -0,0 +1,175 @@ +define("dojo/store/Observable", ["../_base/kernel", "../_base/lang", "../_base/Deferred", "../_base/array" +], function(kernel, lang, Deferred, array) { + // module: + // dojo/store/Observable + // summary: + // TODOC + +var ds = lang.getObject("dojo.store", true); + +return ds.Observable = function(store){ + // summary: + // The Observable store wrapper takes a store and sets an observe method on query() + // results that can be used to monitor results for changes. + // + // description: + // Observable wraps an existing store so that notifications can be made when a query + // is performed. + // + // example: + // Create a Memory store that returns an observable query, and then log some + // information about that query. + // + // | var store = dojo.store.Observable(new dojo.store.Memory({ + // | data: [ + // | {id: 1, name: "one", prime: false}, + // | {id: 2, name: "two", even: true, prime: true}, + // | {id: 3, name: "three", prime: true}, + // | {id: 4, name: "four", even: true, prime: false}, + // | {id: 5, name: "five", prime: true} + // | ] + // | })); + // | var changes = [], results = store.query({ prime: true }); + // | var observer = results.observe(function(object, previousIndex, newIndex){ + // | changes.push({previousIndex:previousIndex, newIndex:newIndex, object:object}); + // | }); + // + // See the Observable tests for more information. + + var undef, queryUpdaters = [], revision = 0; + // a Comet driven store could directly call notify to notify observers when data has + // changed on the backend + store.notify = function(object, existingId){ + revision++; + var updaters = queryUpdaters.slice(); + for(var i = 0, l = updaters.length; i < l; i++){ + updaters[i](object, existingId); + } + }; + var originalQuery = store.query; + store.query = function(query, options){ + options = options || {}; + var results = originalQuery.apply(this, arguments); + if(results && results.forEach){ + var nonPagedOptions = lang.mixin({}, options); + delete nonPagedOptions.start; + delete nonPagedOptions.count; + + var queryExecutor = store.queryEngine && store.queryEngine(query, nonPagedOptions); + var queryRevision = revision; + var listeners = [], queryUpdater; + results.observe = function(listener, includeObjectUpdates){ + if(listeners.push(listener) == 1){ + // first listener was added, create the query checker and updater + queryUpdaters.push(queryUpdater = function(changed, existingId){ + Deferred.when(results, function(resultsArray){ + var atEnd = resultsArray.length != options.count; + var i, l, listener; + if(++queryRevision != revision){ + throw new Error("Query is out of date, you must observe() the query prior to any data modifications"); + } + var removedObject, removedFrom = -1, insertedInto = -1; + if(existingId !== undef){ + // remove the old one + for(i = 0, l = resultsArray.length; i < l; i++){ + var object = resultsArray[i]; + if(store.getIdentity(object) == existingId){ + removedObject = object; + removedFrom = i; + if(queryExecutor || !changed){// if it was changed and we don't have a queryExecutor, we shouldn't remove it because updated objects would be eliminated + resultsArray.splice(i, 1); + } + break; + } + } + } + if(queryExecutor){ + // add the new one + if(changed && + // if a matches function exists, use that (probably more efficient) + (queryExecutor.matches ? queryExecutor.matches(changed) : queryExecutor([changed]).length)){ + + var firstInsertedInto = removedFrom > -1 ? + removedFrom : // put back in the original slot so it doesn't move unless it needs to (relying on a stable sort below) + resultsArray.length; + resultsArray.splice(firstInsertedInto, 0, changed); // add the new item + insertedInto = array.indexOf(queryExecutor(resultsArray), changed); // sort it + // we now need to push the chagne back into the original results array + resultsArray.splice(firstInsertedInto, 1); // remove the inserted item from the previous index + + if((options.start && insertedInto == 0) || + (!atEnd && insertedInto == resultsArray.length)){ + // if it is at the end of the page, assume it goes into the prev or next page + insertedInto = -1; + }else{ + resultsArray.splice(insertedInto, 0, changed); // and insert into the results array with the correct index + } + } + }else if(changed && !options.start){ + // we don't have a queryEngine, so we can't provide any information + // about where it was inserted, but we can at least indicate a new object + insertedInto = removedFrom >= 0 ? removedFrom : (store.defaultIndex || 0); + } + if((removedFrom > -1 || insertedInto > -1) && + (includeObjectUpdates || !queryExecutor || (removedFrom != insertedInto))){ + var copyListeners = listeners.slice(); + for(i = 0;listener = copyListeners[i]; i++){ + listener(changed || removedObject, removedFrom, insertedInto); + } + } + }); + }); + } + return { + cancel: function(){ + // remove this listener + var index = array.indexOf(listeners, listener); + if(index > -1){ // check to make sure we haven't already called cancel + listeners.splice(index, 1); + if(!listeners.length){ + // no more listeners, remove the query updater too + queryUpdaters.splice(array.indexOf(queryUpdaters, queryUpdater), 1); + } + } + } + }; + }; + } + return results; + }; + var inMethod; + function whenFinished(method, action){ + var original = store[method]; + if(original){ + store[method] = function(value){ + if(inMethod){ + // if one method calls another (like add() calling put()) we don't want two events + return original.apply(this, arguments); + } + inMethod = true; + try{ + var results = original.apply(this, arguments); + Deferred.when(results, function(results){ + action((typeof results == "object" && results) || value); + }); + return results; + }finally{ + inMethod = false; + } + }; + } + } + // monitor for updates by listening to these methods + whenFinished("put", function(object){ + store.notify(object, store.getIdentity(object)); + }); + whenFinished("add", function(object){ + store.notify(object); + }); + whenFinished("remove", function(id){ + store.notify(undefined, id); + }); + + return store; +}; +}); diff --git a/lib/dojo/store/api/Store.js b/lib/dojo/store/api/Store.js index ca26226d..d4f4b0b9 100644 --- a/lib/dojo/store/api/Store.js +++ b/lib/dojo/store/api/Store.js @@ -4,301 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -define([], function() { - // module: - // dojo/store/api/Store - // summary: - // The module defines the Dojo object store interface. - -dojo.declare("dojo.store.api.Store", null, { - // summary: - // This is an abstract API that data provider implementations conform to. - // This file defines methods signatures and intentionally leaves all the - // methods unimplemented. For more information on the dojo.store APIs, - // please visit: http://dojotoolkit.org/reference-guide/dojo/store.html - // Every method and property is optional, and is only needed if the functionality - // it provides is required. - // Every method may return a promise for the specified return value if the - // execution of the operation is asynchronous (except - // for query() which already defines an async return value). - - // idProperty: String - // If the store has a single primary key, this tndicates the property to use as the - // identity property. The values of this property should be unique. - idProperty: "id", - - // queryEngine: Function - // If the store can be queried locally (on the client side in JS), this defines - // the query engine to use for querying the data store. - // This takes a query and query options and returns a function that can execute - // the provided query on a JavaScript array. The queryEngine may be replace to - // provide more sophisticated querying capabilities. For example: - // | var query = store.queryEngine({foo:"bar"}, {count:10}); - // | query(someArray) -> filtered array - // The returned query function may have a "matches" property that can be - // used to determine if an object matches the query. For example: - // | query.matches({id:"some-object", foo:"bar"}) -> true - // | query.matches({id:"some-object", foo:"something else"}) -> false - queryEngine: null, - - get: function(id){ - // summary: - // Retrieves an object by its identity - // id: Number - // The identity to use to lookup the object - // returns: Object - // The object in the store that matches the given id. - }, - getIdentity: function(object){ - // summary: - // Returns an object's identity - // object: Object - // The object to get the identity from - // returns: String|Number - }, - put: function(object, directives){ - // summary: - // Stores an object - // object: Object - // The object to store. - // directives: dojo.store.api.Store.PutDirectives? - // Additional directives for storing objects. - // returns: Number|String - }, - add: function(object, directives){ - // summary: - // Creates an object, throws an error if the object already exists - // object: Object - // The object to store. - // directives: dojo.store.api.Store.PutDirectives? - // Additional directives for creating objects. - // returns: Number|String - }, - remove: function(id){ - // summary: - // Deletes an object by its identity - // id: Number - // The identity to use to delete the object - delete this.index[id]; - var data = this.data, - idProperty = this.idProperty; - for(var i = 0, l = data.length; i < l; i++){ - if(data[i][idProperty] == id){ - data.splice(i, 1); - return; - } - } - }, - query: function(query, options){ - // summary: - // Queries the store for objects. This does not alter the store, but returns a - // set of data from the store. - // query: String|Object|Function - // The query to use for retrieving objects from the store. - // options: dojo.store.api.Store.QueryOptions - // The optional arguments to apply to the resultset. - // returns: dojo.store.api.Store.QueryResults - // The results of the query, extended with iterative methods. - // - // example: - // Given the following store: - // - // ...find all items where "prime" is true: - // - // | store.query({ prime: true }).forEach(function(object){ - // | // handle each object - // | }); - }, - transaction: function(){ - // summary: - // Starts a new transaction. - // Note that a store user might not call transaction() prior to using put, - // delete, etc. in which case these operations effectively could be thought of - // as "auto-commit" style actions. - // returns: dojo.store.api.Store.Transaction - // This represents the new current transaction. - }, - getChildren: function(parent, options){ - // summary: - // Retrieves the children of an object. - // parent: Object - // The object to find the children of. - // options: dojo.store.api.Store.QueryOptions? - // Additional options to apply to the retrieval of the children. - // returns: dojo.store.api.Store.QueryResults - // A result set of the children of the parent object. - }, - getMetadata: function(object){ - // summary: - // Returns any metadata about the object. This may include attribution, - // cache directives, history, or version information. - // object: Object - // The object to return metadata for. - // returns: Object - // An object containing metadata. - } -}); - -dojo.store.api.Store.PutDirectives = function(id, before, parent, overwrite){ - // summary: - // Directives passed to put() and add() handlers for guiding the update and - // creation of stored objects. - // id: String|Number? - // Indicates the identity of the object if a new object is created - // before: Object? - // If the collection of objects in the store has a natural ordering, - // this indicates that the created or updated object should be placed before the - // object specified by the value of this property. A value of null indicates that the - // object should be last. - // parent: Object?, - // If the store is hierarchical (with single parenting) this property indicates the - // new parent of the created or updated object. - // overwrite: Boolean? - // If this is provided as a boolean it indicates that the object should or should not - // overwrite an existing object. A value of true indicates that a new object - // should not be created, the operation should update an existing object. A - // value of false indicates that an existing object should not be updated, a new - // object should be created (which is the same as an add() operation). When - // this property is not provided, either an update or creation is acceptable. - this.id = id; - this.before = before; - this.parent = parent; - this.overwrite = overwrite; -}; - -dojo.store.api.Store.SortInformation = function(attribute, descending){ - // summary: - // An object describing what attribute to sort on, and the direction of the sort. - // attribute: String - // The name of the attribute to sort on. - // descending: Boolean - // The direction of the sort. Default is false. - this.attribute = attribute; - this.descending = descending; -}; - -dojo.store.api.Store.QueryOptions = function(sort, start, count){ - // summary: - // Optional object with additional parameters for query results. - // sort: dojo.store.api.Store.SortInformation[]? - // A list of attributes to sort on, as well as direction - // For example: - // | [{attribute:"price, descending: true}]. - // If the sort parameter is omitted, then the natural order of the store may be - // applied if there is a natural order. - // start: Number? - // The first result to begin iteration on - // count: Number? - // The number of how many results should be returned. - this.sort = sort; - this.start = start; - this.count = count; -}; - -dojo.declare("dojo.store.api.Store.QueryResults", null, { - // summary: - // This is an object returned from query() calls that provides access to the results - // of a query. Queries may be executed asynchronously. - - forEach: function(callback, thisObject){ - // summary: - // Iterates over the query results, based on - // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach. - // Note that this may executed asynchronously. The callback may be called - // after this function returns. - // callback: - // Function that is called for each object in the query results - // thisObject: - // The object to use as |this| in the callback. - - }, - filter: function(callback, thisObject){ - // summary: - // Filters the query results, based on - // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter. - // Note that this may executed asynchronously. The callback may be called - // after this function returns. - // callback: - // Function that is called for each object in the query results - // thisObject: - // The object to use as |this| in the callback. - // returns: dojo.store.api.Store.QueryResults - }, - map: function(callback, thisObject){ - // summary: - // Maps the query results, based on - // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map. - // Note that this may executed asynchronously. The callback may be called - // after this function returns. - // callback: - // Function that is called for each object in the query results - // thisObject: - // The object to use as |this| in the callback. - // returns: dojo.store.api.Store.QueryResults - }, - then: function(callback, errorHandler){ - // summary: - // This registers a callback for when the query is complete, if the query is asynchronous. - // This is an optional method, and may not be present for synchronous queries. - // callback: - // This is called when the query is completed successfully, and is passed a single argument - // that is an array representing the query results. - // errorHandler: - // This is called if the query failed, and is passed a single argument that is the error - // for the failure. - }, - observe: function(listener, includeAllUpdates){ - // summary: - // This registers a callback for notification of when data is modified in the query results. - // This is an optional method, and is usually provided by dojo.store.Observable. - // listener: Function - // The listener function is called when objects in the query results are modified - // to affect the query result. The listener function is called with the following - // arguments: - // | listener(object, removedFrom, insertedInto); - // * The object parameter indicates the object that was create, modified, or deleted. - // * The removedFrom parameter indicates the index in the result array where - // the object used to be. If the value is -1, then the object is an addition to - // this result set (due to a new object being created, or changed such that it - // is a part of the result set). - // * The insertedInto parameter indicates the index in the result array where - // the object should be now. If the value is -1, then the object is a removal - // from this result set (due to an object being deleted, or changed such that it - // is not a part of the result set). - // includeAllUpdates: - // This indicates whether or not to include object updates that do not affect - // the inclusion or order of the object in the query results. By default this is false, - // which means that if any object is updated in such a way that it remains - // in the result set and it's position in result sets is not affected, then the listener - // will not be fired. - - }, - // total: Number|Promise? - // This property should be included in if the query options included the "count" - // property limiting the result set. This property indicates the total number of objects - // matching the query (as if "start" and "count" weren't present). This may be - // a promise if the query is asynchronous. - total: 0 -}); - -dojo.declare("dojo.store.api.Store.Transaction", null, { - // summary: - // This is an object returned from transaction() calls that represents the current - // transaction. - - commit: function(){ - // summary: - // Commits the transaction. This may throw an error if it fails. Of if the operation - // is asynchronous, it may return a promise that represents the eventual success - // or failure of the commit. - }, - abort: function(callback, thisObject){ - // summary: - // Aborts the transaction. This may throw an error if it fails. Of if the operation - // is asynchronous, it may return a promise that represents the eventual success - // or failure of the abort. - } -}); - -}); +//>>built +define("dojo/store/api/Store",["dojo/_base/declare"],function(_1){var _2=_1("dojo.store.api.Store",null,{idProperty:"id",queryEngine:null,get:function(id){},getIdentity:function(_3){},put:function(_4,_5){},add:function(_6,_7){},remove:function(id){delete this.index[id];var _8=this.data,_9=this.idProperty;for(var i=0,l=_8.length;i<l;i++){if(_8[i][_9]==id){_8.splice(i,1);return;}}},query:function(_a,_b){},transaction:function(){},getChildren:function(_c,_d){},getMetadata:function(_e){}});_2.PutDirectives=function(id,_f,_10,_11){this.id=id;this.before=_f;this.parent=_10;this.overwrite=_11;};_2.SortInformation=function(_12,_13){this.attribute=_12;this.descending=_13;};_2.QueryOptions=function(_14,_15,_16){this.sort=_14;this.start=_15;this.count=_16;};_1("dojo.store.api.Store.QueryResults",null,{forEach:function(_17,_18){},filter:function(_19,_1a){},map:function(_1b,_1c){},then:function(_1d,_1e){},observe:function(_1f,_20){},total:0});_1("dojo.store.api.Store.Transaction",null,{commit:function(){},abort:function(_21,_22){}});return _2;}); \ No newline at end of file diff --git a/lib/dojo/store/api/Store.js.uncompressed.js b/lib/dojo/store/api/Store.js.uncompressed.js new file mode 100644 index 00000000..55078d77 --- /dev/null +++ b/lib/dojo/store/api/Store.js.uncompressed.js @@ -0,0 +1,297 @@ +define("dojo/store/api/Store", ["dojo/_base/declare"], function(declare) { + // module: + // dojo/store/api/Store + // summary: + // The module defines the Dojo object store interface. + +var Store = declare("dojo.store.api.Store", null, { + // summary: + // This is an abstract API that data provider implementations conform to. + // This file defines methods signatures and intentionally leaves all the + // methods unimplemented. For more information on the dojo.store APIs, + // please visit: http://dojotoolkit.org/reference-guide/dojo/store.html + // Every method and property is optional, and is only needed if the functionality + // it provides is required. + // Every method may return a promise for the specified return value if the + // execution of the operation is asynchronous (except + // for query() which already defines an async return value). + + // idProperty: String + // If the store has a single primary key, this tndicates the property to use as the + // identity property. The values of this property should be unique. + idProperty: "id", + + // queryEngine: Function + // If the store can be queried locally (on the client side in JS), this defines + // the query engine to use for querying the data store. + // This takes a query and query options and returns a function that can execute + // the provided query on a JavaScript array. The queryEngine may be replace to + // provide more sophisticated querying capabilities. For example: + // | var query = store.queryEngine({foo:"bar"}, {count:10}); + // | query(someArray) -> filtered array + // The returned query function may have a "matches" property that can be + // used to determine if an object matches the query. For example: + // | query.matches({id:"some-object", foo:"bar"}) -> true + // | query.matches({id:"some-object", foo:"something else"}) -> false + queryEngine: null, + + get: function(id){ + // summary: + // Retrieves an object by its identity + // id: Number + // The identity to use to lookup the object + // returns: Object + // The object in the store that matches the given id. + }, + getIdentity: function(object){ + // summary: + // Returns an object's identity + // object: Object + // The object to get the identity from + // returns: String|Number + }, + put: function(object, directives){ + // summary: + // Stores an object + // object: Object + // The object to store. + // directives: dojo.store.api.Store.PutDirectives? + // Additional directives for storing objects. + // returns: Number|String + }, + add: function(object, directives){ + // summary: + // Creates an object, throws an error if the object already exists + // object: Object + // The object to store. + // directives: dojo.store.api.Store.PutDirectives? + // Additional directives for creating objects. + // returns: Number|String + }, + remove: function(id){ + // summary: + // Deletes an object by its identity + // id: Number + // The identity to use to delete the object + delete this.index[id]; + var data = this.data, + idProperty = this.idProperty; + for(var i = 0, l = data.length; i < l; i++){ + if(data[i][idProperty] == id){ + data.splice(i, 1); + return; + } + } + }, + query: function(query, options){ + // summary: + // Queries the store for objects. This does not alter the store, but returns a + // set of data from the store. + // query: String|Object|Function + // The query to use for retrieving objects from the store. + // options: dojo.store.api.Store.QueryOptions + // The optional arguments to apply to the resultset. + // returns: dojo.store.api.Store.QueryResults + // The results of the query, extended with iterative methods. + // + // example: + // Given the following store: + // + // ...find all items where "prime" is true: + // + // | store.query({ prime: true }).forEach(function(object){ + // | // handle each object + // | }); + }, + transaction: function(){ + // summary: + // Starts a new transaction. + // Note that a store user might not call transaction() prior to using put, + // delete, etc. in which case these operations effectively could be thought of + // as "auto-commit" style actions. + // returns: dojo.store.api.Store.Transaction + // This represents the new current transaction. + }, + getChildren: function(parent, options){ + // summary: + // Retrieves the children of an object. + // parent: Object + // The object to find the children of. + // options: dojo.store.api.Store.QueryOptions? + // Additional options to apply to the retrieval of the children. + // returns: dojo.store.api.Store.QueryResults + // A result set of the children of the parent object. + }, + getMetadata: function(object){ + // summary: + // Returns any metadata about the object. This may include attribution, + // cache directives, history, or version information. + // object: Object + // The object to return metadata for. + // returns: Object + // An object containing metadata. + } +}); + +Store.PutDirectives = function(id, before, parent, overwrite){ + // summary: + // Directives passed to put() and add() handlers for guiding the update and + // creation of stored objects. + // id: String|Number? + // Indicates the identity of the object if a new object is created + // before: Object? + // If the collection of objects in the store has a natural ordering, + // this indicates that the created or updated object should be placed before the + // object specified by the value of this property. A value of null indicates that the + // object should be last. + // parent: Object?, + // If the store is hierarchical (with single parenting) this property indicates the + // new parent of the created or updated object. + // overwrite: Boolean? + // If this is provided as a boolean it indicates that the object should or should not + // overwrite an existing object. A value of true indicates that a new object + // should not be created, the operation should update an existing object. A + // value of false indicates that an existing object should not be updated, a new + // object should be created (which is the same as an add() operation). When + // this property is not provided, either an update or creation is acceptable. + this.id = id; + this.before = before; + this.parent = parent; + this.overwrite = overwrite; +}; + +Store.SortInformation = function(attribute, descending){ + // summary: + // An object describing what attribute to sort on, and the direction of the sort. + // attribute: String + // The name of the attribute to sort on. + // descending: Boolean + // The direction of the sort. Default is false. + this.attribute = attribute; + this.descending = descending; +}; + +Store.QueryOptions = function(sort, start, count){ + // summary: + // Optional object with additional parameters for query results. + // sort: dojo.store.api.Store.SortInformation[]? + // A list of attributes to sort on, as well as direction + // For example: + // | [{attribute:"price, descending: true}]. + // If the sort parameter is omitted, then the natural order of the store may be + // applied if there is a natural order. + // start: Number? + // The first result to begin iteration on + // count: Number? + // The number of how many results should be returned. + this.sort = sort; + this.start = start; + this.count = count; +}; + +declare("dojo.store.api.Store.QueryResults", null, { + // summary: + // This is an object returned from query() calls that provides access to the results + // of a query. Queries may be executed asynchronously. + + forEach: function(callback, thisObject){ + // summary: + // Iterates over the query results, based on + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/forEach. + // Note that this may executed asynchronously. The callback may be called + // after this function returns. + // callback: + // Function that is called for each object in the query results + // thisObject: + // The object to use as |this| in the callback. + + }, + filter: function(callback, thisObject){ + // summary: + // Filters the query results, based on + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/filter. + // Note that this may executed asynchronously. The callback may be called + // after this function returns. + // callback: + // Function that is called for each object in the query results + // thisObject: + // The object to use as |this| in the callback. + // returns: dojo.store.api.Store.QueryResults + }, + map: function(callback, thisObject){ + // summary: + // Maps the query results, based on + // https://developer.mozilla.org/en/Core_JavaScript_1.5_Reference/Objects/Array/map. + // Note that this may executed asynchronously. The callback may be called + // after this function returns. + // callback: + // Function that is called for each object in the query results + // thisObject: + // The object to use as |this| in the callback. + // returns: dojo.store.api.Store.QueryResults + }, + then: function(callback, errorHandler){ + // summary: + // This registers a callback for when the query is complete, if the query is asynchronous. + // This is an optional method, and may not be present for synchronous queries. + // callback: + // This is called when the query is completed successfully, and is passed a single argument + // that is an array representing the query results. + // errorHandler: + // This is called if the query failed, and is passed a single argument that is the error + // for the failure. + }, + observe: function(listener, includeAllUpdates){ + // summary: + // This registers a callback for notification of when data is modified in the query results. + // This is an optional method, and is usually provided by dojo.store.Observable. + // listener: Function + // The listener function is called when objects in the query results are modified + // to affect the query result. The listener function is called with the following + // arguments: + // | listener(object, removedFrom, insertedInto); + // * The object parameter indicates the object that was create, modified, or deleted. + // * The removedFrom parameter indicates the index in the result array where + // the object used to be. If the value is -1, then the object is an addition to + // this result set (due to a new object being created, or changed such that it + // is a part of the result set). + // * The insertedInto parameter indicates the index in the result array where + // the object should be now. If the value is -1, then the object is a removal + // from this result set (due to an object being deleted, or changed such that it + // is not a part of the result set). + // includeAllUpdates: + // This indicates whether or not to include object updates that do not affect + // the inclusion or order of the object in the query results. By default this is false, + // which means that if any object is updated in such a way that it remains + // in the result set and it's position in result sets is not affected, then the listener + // will not be fired. + + }, + // total: Number|Promise? + // This property should be included in if the query options included the "count" + // property limiting the result set. This property indicates the total number of objects + // matching the query (as if "start" and "count" weren't present). This may be + // a promise if the query is asynchronous. + total: 0 +}); + +declare("dojo.store.api.Store.Transaction", null, { + // summary: + // This is an object returned from transaction() calls that represents the current + // transaction. + + commit: function(){ + // summary: + // Commits the transaction. This may throw an error if it fails. Of if the operation + // is asynchronous, it may return a promise that represents the eventual success + // or failure of the commit. + }, + abort: function(callback, thisObject){ + // summary: + // Aborts the transaction. This may throw an error if it fails. Of if the operation + // is asynchronous, it may return a promise that represents the eventual success + // or failure of the abort. + } +}); +return Store; +}); diff --git a/lib/dojo/store/util/QueryResults.js b/lib/dojo/store/util/QueryResults.js index a237d1dc..fc164ec6 100644 --- a/lib/dojo/store/util/QueryResults.js +++ b/lib/dojo/store/util/QueryResults.js @@ -4,64 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.store.util.QueryResults"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.store.util.QueryResults"] = true; -dojo.provide("dojo.store.util.QueryResults"); - -dojo.getObject("store.util", true, dojo); - -dojo.store.util.QueryResults = function(results){ - // summary: - // A function that wraps the results of a store query with additional - // methods. - // - // description: - // QueryResults is a basic wrapper that allows for array-like iteration - // over any kind of returned data from a query. While the simplest store - // will return a plain array of data, other stores may return deferreds or - // promises; this wrapper makes sure that *all* results can be treated - // the same. - // - // Additional methods include `forEach`, `filter` and `map`. - // - // returns: Object - // An array-like object that can be used for iterating over. - // - // example: - // Query a store and iterate over the results. - // - // | store.query({ prime: true }).forEach(function(item){ - // | // do something - // | }); - - if(!results){ - return results; - } - // if it is a promise it may be frozen - if(results.then){ - results = dojo.delegate(results); - } - function addIterativeMethod(method){ - if(!results[method]){ - results[method] = function(){ - var args = arguments; - return dojo.when(results, function(results){ - Array.prototype.unshift.call(args, results); - return dojo.store.util.QueryResults(dojo[method].apply(dojo, args)); - }); - }; - } - } - addIterativeMethod("forEach"); - addIterativeMethod("filter"); - addIterativeMethod("map"); - if(!results.total){ - results.total = dojo.when(results, function(results){ - return results.length; - }); - } - return results; -}; - -} +//>>built +define("dojo/store/util/QueryResults",["../../_base/array","../../_base/lang","../../_base/Deferred"],function(_1,_2,_3){var _4=_2.getObject("dojo.store.util",true);_4.QueryResults=function(_5){if(!_5){return _5;}if(_5.then){_5=_2.delegate(_5);}function _6(_7){if(!_5[_7]){_5[_7]=function(){var _8=arguments;return _3.when(_5,function(_9){Array.prototype.unshift.call(_8,_9);return _4.QueryResults(_1[_7].apply(_1,_8));});};}};_6("forEach");_6("filter");_6("map");if(!_5.total){_5.total=_3.when(_5,function(_a){return _a.length;});}return _5;};return _4.QueryResults;}); \ No newline at end of file diff --git a/lib/dojo/store/util/QueryResults.js.uncompressed.js b/lib/dojo/store/util/QueryResults.js.uncompressed.js new file mode 100644 index 00000000..cd9e1969 --- /dev/null +++ b/lib/dojo/store/util/QueryResults.js.uncompressed.js @@ -0,0 +1,64 @@ +define("dojo/store/util/QueryResults", ["../../_base/array", "../../_base/lang", "../../_base/Deferred" +], function(array, lang, Deferred) { + // module: + // dojo/store/util/QueryResults + // summary: + // The module defines a query results wrapper + +var util = lang.getObject("dojo.store.util", true); + +util.QueryResults = function(results){ + // summary: + // A function that wraps the results of a store query with additional + // methods. + // + // description: + // QueryResults is a basic wrapper that allows for array-like iteration + // over any kind of returned data from a query. While the simplest store + // will return a plain array of data, other stores may return deferreds or + // promises; this wrapper makes sure that *all* results can be treated + // the same. + // + // Additional methods include `forEach`, `filter` and `map`. + // + // returns: Object + // An array-like object that can be used for iterating over. + // + // example: + // Query a store and iterate over the results. + // + // | store.query({ prime: true }).forEach(function(item){ + // | // do something + // | }); + + if(!results){ + return results; + } + // if it is a promise it may be frozen + if(results.then){ + results = lang.delegate(results); + } + function addIterativeMethod(method){ + if(!results[method]){ + results[method] = function(){ + var args = arguments; + return Deferred.when(results, function(results){ + Array.prototype.unshift.call(args, results); + return util.QueryResults(array[method].apply(array, args)); + }); + }; + } + } + addIterativeMethod("forEach"); + addIterativeMethod("filter"); + addIterativeMethod("map"); + if(!results.total){ + results.total = Deferred.when(results, function(results){ + return results.length; + }); + } + return results; +}; + +return util.QueryResults; +}); diff --git a/lib/dojo/store/util/SimpleQueryEngine.js b/lib/dojo/store/util/SimpleQueryEngine.js index 4b29f20c..aa398f6e 100644 --- a/lib/dojo/store/util/SimpleQueryEngine.js +++ b/lib/dojo/store/util/SimpleQueryEngine.js @@ -4,113 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.store.util.SimpleQueryEngine"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.store.util.SimpleQueryEngine"] = true; -dojo.provide("dojo.store.util.SimpleQueryEngine"); - -dojo.getObject("store.util", true, dojo); - -dojo.store.util.SimpleQueryEngine = function(query, options){ - // summary: - // Simple query engine that matches using filter functions, named filter - // functions or objects by name-value on a query object hash - // - // description: - // The SimpleQueryEngine provides a way of getting a QueryResults through - // the use of a simple object hash as a filter. The hash will be used to - // match properties on data objects with the corresponding value given. In - // other words, only exact matches will be returned. - // - // This function can be used as a template for more complex query engines; - // for example, an engine can be created that accepts an object hash that - // contains filtering functions, or a string that gets evaluated, etc. - // - // When creating a new dojo.store, simply set the store's queryEngine - // field as a reference to this function. - // - // query: Object - // An object hash with fields that may match fields of items in the store. - // Values in the hash will be compared by normal == operator, but regular expressions - // or any object that provides a test() method are also supported and can be - // used to match strings by more complex expressions - // (and then the regex's or object's test() method will be used to match values). - // - // options: dojo.store.util.SimpleQueryEngine.__queryOptions? - // An object that contains optional information such as sort, start, and count. - // - // returns: Function - // A function that caches the passed query under the field "matches". See any - // of the "query" methods on dojo.stores. - // - // example: - // Define a store with a reference to this engine, and set up a query method. - // - // | var myStore = function(options){ - // | // ...more properties here - // | this.queryEngine = dojo.store.util.SimpleQueryEngine; - // | // define our query method - // | this.query = function(query, options){ - // | return dojo.store.util.QueryResults(this.queryEngine(query, options)(this.data)); - // | }; - // | }; - - // create our matching query function - switch(typeof query){ - default: - throw new Error("Can not query with a " + typeof query); - case "object": case "undefined": - var queryObject = query; - query = function(object){ - for(var key in queryObject){ - var required = queryObject[key]; - if(required && required.test){ - if(!required.test(object[key])){ - return false; - } - }else if(required != object[key]){ - return false; - } - } - return true; - }; - break; - case "string": - // named query - if(!this[query]){ - throw new Error("No filter function " + query + " was found in store"); - } - query = this[query]; - // fall through - case "function": - // fall through - } - function execute(array){ - // execute the whole query, first we filter - var results = dojo.filter(array, query); - // next we sort - if(options && options.sort){ - results.sort(function(a, b){ - for(var sort, i=0; sort = options.sort[i]; i++){ - var aValue = a[sort.attribute]; - var bValue = b[sort.attribute]; - if (aValue != bValue) { - return !!sort.descending == aValue > bValue ? -1 : 1; - } - } - return 0; - }); - } - // now we paginate - if(options && (options.start || options.count)){ - var total = results.length; - results = results.slice(options.start || 0, (options.start || 0) + (options.count || Infinity)); - results.total = total; - } - return results; - } - execute.matches = query; - return execute; -}; - -} +//>>built +define("dojo/store/util/SimpleQueryEngine",["../../_base/array"],function(_1){return function(_2,_3){switch(typeof _2){default:throw new Error("Can not query with a "+typeof _2);case "object":case "undefined":var _4=_2;_2=function(_5){for(var _6 in _4){var _7=_4[_6];if(_7&&_7.test){if(!_7.test(_5[_6])){return false;}}else{if(_7!=_5[_6]){return false;}}}return true;};break;case "string":if(!this[_2]){throw new Error("No filter function "+_2+" was found in store");}_2=this[_2];case "function":}function _8(_9){var _a=_1.filter(_9,_2);if(_3&&_3.sort){_a.sort(function(a,b){for(var _b,i=0;_b=_3.sort[i];i++){var _c=a[_b.attribute];var _d=b[_b.attribute];if(_c!=_d){return !!_b.descending==_c>_d?-1:1;}}return 0;});}if(_3&&(_3.start||_3.count)){var _e=_a.length;_a=_a.slice(_3.start||0,(_3.start||0)+(_3.count||Infinity));_a.total=_e;}return _a;};_8.matches=_2;return _8;};}); \ No newline at end of file diff --git a/lib/dojo/store/util/SimpleQueryEngine.js.uncompressed.js b/lib/dojo/store/util/SimpleQueryEngine.js.uncompressed.js new file mode 100644 index 00000000..4f241e6f --- /dev/null +++ b/lib/dojo/store/util/SimpleQueryEngine.js.uncompressed.js @@ -0,0 +1,108 @@ +define("dojo/store/util/SimpleQueryEngine", ["../../_base/array"], function(arrayUtil) { + // module: + // dojo/store/util/SimpleQueryEngine + // summary: + // The module defines a simple filtering query engine for object stores. + +return function(query, options){ + // summary: + // Simple query engine that matches using filter functions, named filter + // functions or objects by name-value on a query object hash + // + // description: + // The SimpleQueryEngine provides a way of getting a QueryResults through + // the use of a simple object hash as a filter. The hash will be used to + // match properties on data objects with the corresponding value given. In + // other words, only exact matches will be returned. + // + // This function can be used as a template for more complex query engines; + // for example, an engine can be created that accepts an object hash that + // contains filtering functions, or a string that gets evaluated, etc. + // + // When creating a new dojo.store, simply set the store's queryEngine + // field as a reference to this function. + // + // query: Object + // An object hash with fields that may match fields of items in the store. + // Values in the hash will be compared by normal == operator, but regular expressions + // or any object that provides a test() method are also supported and can be + // used to match strings by more complex expressions + // (and then the regex's or object's test() method will be used to match values). + // + // options: dojo.store.util.SimpleQueryEngine.__queryOptions? + // An object that contains optional information such as sort, start, and count. + // + // returns: Function + // A function that caches the passed query under the field "matches". See any + // of the "query" methods on dojo.stores. + // + // example: + // Define a store with a reference to this engine, and set up a query method. + // + // | var myStore = function(options){ + // | // ...more properties here + // | this.queryEngine = dojo.store.util.SimpleQueryEngine; + // | // define our query method + // | this.query = function(query, options){ + // | return dojo.store.util.QueryResults(this.queryEngine(query, options)(this.data)); + // | }; + // | }; + + // create our matching query function + switch(typeof query){ + default: + throw new Error("Can not query with a " + typeof query); + case "object": case "undefined": + var queryObject = query; + query = function(object){ + for(var key in queryObject){ + var required = queryObject[key]; + if(required && required.test){ + if(!required.test(object[key])){ + return false; + } + }else if(required != object[key]){ + return false; + } + } + return true; + }; + break; + case "string": + // named query + if(!this[query]){ + throw new Error("No filter function " + query + " was found in store"); + } + query = this[query]; + // fall through + case "function": + // fall through + } + function execute(array){ + // execute the whole query, first we filter + var results = arrayUtil.filter(array, query); + // next we sort + if(options && options.sort){ + results.sort(function(a, b){ + for(var sort, i=0; sort = options.sort[i]; i++){ + var aValue = a[sort.attribute]; + var bValue = b[sort.attribute]; + if (aValue != bValue) { + return !!sort.descending == aValue > bValue ? -1 : 1; + } + } + return 0; + }); + } + // now we paginate + if(options && (options.start || options.count)){ + var total = results.length; + results = results.slice(options.start || 0, (options.start || 0) + (options.count || Infinity)); + results.total = total; + } + return results; + } + execute.matches = query; + return execute; +}; +}); diff --git a/lib/dojo/string.js b/lib/dojo/string.js index 2e1cc501..0b8ce6f4 100644 --- a/lib/dojo/string.js +++ b/lib/dojo/string.js @@ -4,163 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.string"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.string"] = true; -dojo.provide("dojo.string"); - -dojo.getObject("string", true, dojo); - -/*===== -dojo.string = { - // summary: String utilities for Dojo -}; -=====*/ - -dojo.string.rep = function(/*String*/str, /*Integer*/num){ - // summary: - // Efficiently replicate a string `n` times. - // str: - // the string to replicate - // num: - // number of times to replicate the string - - if(num <= 0 || !str){ return ""; } - - var buf = []; - for(;;){ - if(num & 1){ - buf.push(str); - } - if(!(num >>= 1)){ break; } - str += str; - } - return buf.join(""); // String -}; - -dojo.string.pad = function(/*String*/text, /*Integer*/size, /*String?*/ch, /*Boolean?*/end){ - // summary: - // Pad a string to guarantee that it is at least `size` length by - // filling with the character `ch` at either the start or end of the - // string. Pads at the start, by default. - // text: - // the string to pad - // size: - // length to provide padding - // ch: - // character to pad, defaults to '0' - // end: - // adds padding at the end if true, otherwise pads at start - // example: - // | // Fill the string to length 10 with "+" characters on the right. Yields "Dojo++++++". - // | dojo.string.pad("Dojo", 10, "+", true); - - if(!ch){ - ch = '0'; - } - var out = String(text), - pad = dojo.string.rep(ch, Math.ceil((size - out.length) / ch.length)); - return end ? out + pad : pad + out; // String -}; - -dojo.string.substitute = function( /*String*/ template, - /*Object|Array*/map, - /*Function?*/ transform, - /*Object?*/ thisObject){ - // summary: - // Performs parameterized substitutions on a string. Throws an - // exception if any parameter is unmatched. - // template: - // a string with expressions in the form `${key}` to be replaced or - // `${key:format}` which specifies a format function. keys are case-sensitive. - // map: - // hash to search for substitutions - // transform: - // a function to process all parameters before substitution takes - // place, e.g. mylib.encodeXML - // thisObject: - // where to look for optional format function; default to the global - // namespace - // example: - // Substitutes two expressions in a string from an Array or Object - // | // returns "File 'foo.html' is not found in directory '/temp'." - // | // by providing substitution data in an Array - // | dojo.string.substitute( - // | "File '${0}' is not found in directory '${1}'.", - // | ["foo.html","/temp"] - // | ); - // | - // | // also returns "File 'foo.html' is not found in directory '/temp'." - // | // but provides substitution data in an Object structure. Dotted - // | // notation may be used to traverse the structure. - // | dojo.string.substitute( - // | "File '${name}' is not found in directory '${info.dir}'.", - // | { name: "foo.html", info: { dir: "/temp" } } - // | ); - // example: - // Use a transform function to modify the values: - // | // returns "file 'foo.html' is not found in directory '/temp'." - // | dojo.string.substitute( - // | "${0} is not found in ${1}.", - // | ["foo.html","/temp"], - // | function(str){ - // | // try to figure out the type - // | var prefix = (str.charAt(0) == "/") ? "directory": "file"; - // | return prefix + " '" + str + "'"; - // | } - // | ); - // example: - // Use a formatter - // | // returns "thinger -- howdy" - // | dojo.string.substitute( - // | "${0:postfix}", ["thinger"], null, { - // | postfix: function(value, key){ - // | return value + " -- howdy"; - // | } - // | } - // | ); - - thisObject = thisObject || dojo.global; - transform = transform ? - dojo.hitch(thisObject, transform) : function(v){ return v; }; - - return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g, - function(match, key, format){ - var value = dojo.getObject(key, false, map); - if(format){ - value = dojo.getObject(format, false, thisObject).call(thisObject, value, key); - } - return transform(value, key).toString(); - }); // String -}; - -/*===== -dojo.string.trim = function(str){ - // summary: - // Trims whitespace from both sides of the string - // str: String - // String to be trimmed - // returns: String - // Returns the trimmed string - // description: - // This version of trim() was taken from [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript). - // The short yet performant version of this function is dojo.trim(), - // which is part of Dojo base. Uses String.prototype.trim instead, if available. - return ""; // String -} -=====*/ - -dojo.string.trim = String.prototype.trim ? - dojo.trim : // aliasing to the native function - function(str){ - str = str.replace(/^\s+/, ''); - for(var i = str.length - 1; i >= 0; i--){ - if(/\S/.test(str.charAt(i))){ - str = str.substring(0, i + 1); - break; - } - } - return str; - }; - -} +//>>built +define("dojo/string",["./_base/kernel","./_base/lang"],function(_1,_2){_2.getObject("string",true,_1);_1.string.rep=function(_3,_4){if(_4<=0||!_3){return "";}var _5=[];for(;;){if(_4&1){_5.push(_3);}if(!(_4>>=1)){break;}_3+=_3;}return _5.join("");};_1.string.pad=function(_6,_7,ch,_8){if(!ch){ch="0";}var _9=String(_6),_a=_1.string.rep(ch,Math.ceil((_7-_9.length)/ch.length));return _8?_9+_a:_a+_9;};_1.string.substitute=function(_b,_c,_d,_e){_e=_e||_1.global;_d=_d?_2.hitch(_e,_d):function(v){return v;};return _b.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_f,key,_10){var _11=_2.getObject(key,false,_c);if(_10){_11=_2.getObject(_10,false,_e).call(_e,_11,key);}return _d(_11,key).toString();});};_1.string.trim=String.prototype.trim?_2.trim:function(str){str=str.replace(/^\s+/,"");for(var i=str.length-1;i>=0;i--){if(/\S/.test(str.charAt(i))){str=str.substring(0,i+1);break;}}return str;};return _1.string;}); \ No newline at end of file diff --git a/lib/dojo/string.js.uncompressed.js b/lib/dojo/string.js.uncompressed.js new file mode 100644 index 00000000..14aef6c9 --- /dev/null +++ b/lib/dojo/string.js.uncompressed.js @@ -0,0 +1,162 @@ +define("dojo/string", ["./_base/kernel", "./_base/lang"], function(dojo, lang) { + // module: + // dojo/string + // summary: + // TODOC + +lang.getObject("string", true, dojo); + +/*===== +dojo.string = { + // summary: String utilities for Dojo +}; +=====*/ + +dojo.string.rep = function(/*String*/str, /*Integer*/num){ + // summary: + // Efficiently replicate a string `n` times. + // str: + // the string to replicate + // num: + // number of times to replicate the string + + if(num <= 0 || !str){ return ""; } + + var buf = []; + for(;;){ + if(num & 1){ + buf.push(str); + } + if(!(num >>= 1)){ break; } + str += str; + } + return buf.join(""); // String +}; + +dojo.string.pad = function(/*String*/text, /*Integer*/size, /*String?*/ch, /*Boolean?*/end){ + // summary: + // Pad a string to guarantee that it is at least `size` length by + // filling with the character `ch` at either the start or end of the + // string. Pads at the start, by default. + // text: + // the string to pad + // size: + // length to provide padding + // ch: + // character to pad, defaults to '0' + // end: + // adds padding at the end if true, otherwise pads at start + // example: + // | // Fill the string to length 10 with "+" characters on the right. Yields "Dojo++++++". + // | dojo.string.pad("Dojo", 10, "+", true); + + if(!ch){ + ch = '0'; + } + var out = String(text), + pad = dojo.string.rep(ch, Math.ceil((size - out.length) / ch.length)); + return end ? out + pad : pad + out; // String +}; + +dojo.string.substitute = function( /*String*/ template, + /*Object|Array*/map, + /*Function?*/ transform, + /*Object?*/ thisObject){ + // summary: + // Performs parameterized substitutions on a string. Throws an + // exception if any parameter is unmatched. + // template: + // a string with expressions in the form `${key}` to be replaced or + // `${key:format}` which specifies a format function. keys are case-sensitive. + // map: + // hash to search for substitutions + // transform: + // a function to process all parameters before substitution takes + // place, e.g. mylib.encodeXML + // thisObject: + // where to look for optional format function; default to the global + // namespace + // example: + // Substitutes two expressions in a string from an Array or Object + // | // returns "File 'foo.html' is not found in directory '/temp'." + // | // by providing substitution data in an Array + // | dojo.string.substitute( + // | "File '${0}' is not found in directory '${1}'.", + // | ["foo.html","/temp"] + // | ); + // | + // | // also returns "File 'foo.html' is not found in directory '/temp'." + // | // but provides substitution data in an Object structure. Dotted + // | // notation may be used to traverse the structure. + // | dojo.string.substitute( + // | "File '${name}' is not found in directory '${info.dir}'.", + // | { name: "foo.html", info: { dir: "/temp" } } + // | ); + // example: + // Use a transform function to modify the values: + // | // returns "file 'foo.html' is not found in directory '/temp'." + // | dojo.string.substitute( + // | "${0} is not found in ${1}.", + // | ["foo.html","/temp"], + // | function(str){ + // | // try to figure out the type + // | var prefix = (str.charAt(0) == "/") ? "directory": "file"; + // | return prefix + " '" + str + "'"; + // | } + // | ); + // example: + // Use a formatter + // | // returns "thinger -- howdy" + // | dojo.string.substitute( + // | "${0:postfix}", ["thinger"], null, { + // | postfix: function(value, key){ + // | return value + " -- howdy"; + // | } + // | } + // | ); + + thisObject = thisObject || dojo.global; + transform = transform ? + lang.hitch(thisObject, transform) : function(v){ return v; }; + + return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g, + function(match, key, format){ + var value = lang.getObject(key, false, map); + if(format){ + value = lang.getObject(format, false, thisObject).call(thisObject, value, key); + } + return transform(value, key).toString(); + }); // String +}; + +/*===== +dojo.string.trim = function(str){ + // summary: + // Trims whitespace from both sides of the string + // str: String + // String to be trimmed + // returns: String + // Returns the trimmed string + // description: + // This version of trim() was taken from [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript). + // The short yet performant version of this function is dojo.trim(), + // which is part of Dojo base. Uses String.prototype.trim instead, if available. + return ""; // String +} +=====*/ + +dojo.string.trim = String.prototype.trim ? + lang.trim : // aliasing to the native function + function(str){ + str = str.replace(/^\s+/, ''); + for(var i = str.length - 1; i >= 0; i--){ + if(/\S/.test(str.charAt(i))){ + str = str.substring(0, i + 1); + break; + } + } + return str; + }; + +return dojo.string; +}); diff --git a/lib/dojo/text.js b/lib/dojo/text.js new file mode 100644 index 00000000..3d067ef5 --- /dev/null +++ b/lib/dojo/text.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/text",["./_base/kernel","require","./has","./_base/xhr"],function(_1,_2,_3,_4){var _5;if(1){_5=function(_6,_7,_8){_4("GET",{url:_6,sync:!!_7,load:_8});};}else{if(_2.getText){_5=_2.getText;}else{console.error("dojo/text plugin failed to load because loader does not support getText");}}var _9={},_a=function(_b){if(_b){_b=_b.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");var _c=_b.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_c){_b=_c[1];}}else{_b="";}return _b;},_d={},_e={},_f={dynamic:true,normalize:function(id,_10){var _11=id.split("!"),url=_11[0];return (/^\./.test(url)?_10(url):url)+(_11[1]?"!"+_11[1]:"");},load:function(id,_12,_13){var _14=id.split("!"),_15=_14.length>1,_16=_14[0],url=_12.toUrl(_14[0]),_17=_d,_18=function(_19){_13(_15?_a(_19):_19);};if(_16 in _9){_17=_9[_16];}else{if(url in _12.cache){_17=_12.cache[url];}else{if(url in _9){_17=_9[url];}}}if(_17===_d){if(_e[url]){_e[url].push(_18);}else{var _1a=_e[url]=[_18];_5(url,!_12.async,function(_1b){_9[_16]=_9[url]=_1b;for(var i=0;i<_1a.length;){_1a[i++](_1b);}delete _e[url];});}}else{_18(_17);}}};_1.cache=function(_1c,url,_1d){var key;if(typeof _1c=="string"){if(/\//.test(_1c)){key=_1c;_1d=url;}else{key=_2.toUrl(_1c.replace(/\./g,"/")+(url?("/"+url):""));}}else{key=_1c+"";_1d=url;}var val=(_1d!=undefined&&typeof _1d!="string")?_1d.value:_1d,_1e=_1d&&_1d.sanitize;if(typeof val=="string"){_9[key]=val;return _1e?_a(val):val;}else{if(val===null){delete _9[key];return null;}else{if(!(key in _9)){_5(key,true,function(_1f){_9[key]=_1f;});}return _1e?_a(_9[key]):_9[key];}}};return _f;}); \ No newline at end of file diff --git a/lib/dojo/text.js.uncompressed.js b/lib/dojo/text.js.uncompressed.js new file mode 100644 index 00000000..75d26766 --- /dev/null +++ b/lib/dojo/text.js.uncompressed.js @@ -0,0 +1,212 @@ +define("dojo/text", ["./_base/kernel", "require", "./has", "./_base/xhr"], function(dojo, require, has, xhr){ + // module: + // dojo/text + // summary: + // This module implements the !dojo/text plugin and the dojo.cache API. + // description: + // We choose to include our own plugin to leverage functionality already contained in dojo + // and thereby reduce the size of the plugin compared to various foreign loader implementations. + // Also, this allows foreign AMD loaders to be used without their plugins. + // + // CAUTION: this module is designed to optionally function synchronously to support the dojo v1.x synchronous + // loader. This feature is outside the scope of the CommonJS plugins specification. + + var getText; + if(1){ + getText= function(url, sync, load){ + xhr("GET", {url:url, sync:!!sync, load:load}); + }; + }else{ + // TODOC: only works for dojo AMD loader + if(require.getText){ + getText= require.getText; + }else{ + console.error("dojo/text plugin failed to load because loader does not support getText"); + } + } + + var + theCache= {}, + + strip= function(text){ + //Strips <?xml ...?> declarations so that external SVG and XML + //documents can be added to a document without worry. Also, if the string + //is an HTML document, only the part inside the body tag is returned. + if(text){ + text= text.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, ""); + var matches= text.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im); + if(matches){ + text= matches[1]; + } + }else{ + text = ""; + } + return text; + }, + + notFound = {}, + + pending = {}, + + result= { + dynamic: + // the dojo/text caches it's own resources because of dojo.cache + true, + + normalize:function(id, toAbsMid){ + // id is something like (path may be relative): + // + // "path/to/text.html" + // "path/to/text.html!strip" + var parts= id.split("!"), + url= parts[0]; + return (/^\./.test(url) ? toAbsMid(url) : url) + (parts[1] ? "!" + parts[1] : ""); + }, + + load:function(id, require, load){ + // id is something like (path is always absolute): + // + // "path/to/text.html" + // "path/to/text.html!strip" + var + parts= id.split("!"), + stripFlag= parts.length>1, + absMid= parts[0], + url = require.toUrl(parts[0]), + text = notFound, + finish = function(text){ + load(stripFlag ? strip(text) : text); + }; + if(absMid in theCache){ + text = theCache[absMid]; + }else if(url in require.cache){ + text = require.cache[url]; + }else if(url in theCache){ + text = theCache[url]; + } + if(text===notFound){ + if(pending[url]){ + pending[url].push(finish); + }else{ + var pendingList = pending[url] = [finish]; + getText(url, !require.async, function(text){ + theCache[absMid]= theCache[url]= text; + for(var i = 0; i<pendingList.length;){ + pendingList[i++](text); + } + delete pending[url]; + }); + } + }else{ + finish(text); + } + } + }; + + dojo.cache= function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){ + // * (string string [value]) => (module, url, value) + // * (object [value]) => (module, value), url defaults to "" + // + // * if module is an object, then it must be convertable to a string + // * (module, url) module + (url ? ("/" + url) : "") must be a legal argument to require.toUrl + // * value may be a string or an object; if an object then may have the properties "value" and/or "sanitize" + var key; + if(typeof module=="string"){ + if(/\//.test(module)){ + // module is a version 1.7+ resolved path + key = module; + value = url; + }else{ + // module is a version 1.6- argument to dojo.moduleUrl + key = require.toUrl(module.replace(/\./g, "/") + (url ? ("/" + url) : "")); + } + }else{ + key = module + ""; + value = url; + } + var + val = (value != undefined && typeof value != "string") ? value.value : value, + sanitize = value && value.sanitize; + + if(typeof val == "string"){ + //We have a string, set cache value + theCache[key] = val; + return sanitize ? strip(val) : val; + }else if(val === null){ + //Remove cached value + delete theCache[key]; + return null; + }else{ + //Allow cache values to be empty strings. If key property does + //not exist, fetch it. + if(!(key in theCache)){ + getText(key, true, function(text){ + theCache[key]= text; + }); + } + return sanitize ? strip(theCache[key]) : theCache[key]; + } + }; + + return result; + +/*===== +dojo.cache = function(module, url, value){ + // summary: + // A getter and setter for storing the string content associated with the + // module and url arguments. + // description: + // If module is a string that contains slashes, then it is interpretted as a fully + // resolved path (typically a result returned by require.toUrl), and url should not be + // provided. This is the preferred signature. If module is a string that does not + // contain slashes, then url must also be provided and module and url are used to + // call `dojo.moduleUrl()` to generate a module URL. This signature is deprecated. + // If value is specified, the cache value for the moduleUrl will be set to + // that value. Otherwise, dojo.cache will fetch the moduleUrl and store it + // in its internal cache and return that cached value for the URL. To clear + // a cache value pass null for value. Since XMLHttpRequest (XHR) is used to fetch the + // the URL contents, only modules on the same domain of the page can use this capability. + // The build system can inline the cache values though, to allow for xdomain hosting. + // module: String||Object + // If a String with slashes, a fully resolved path; if a String without slashes, the + // module name to use for the base part of the URL, similar to module argument + // to `dojo.moduleUrl`. If an Object, something that has a .toString() method that + // generates a valid path for the cache item. For example, a dojo._Url object. + // url: String + // The rest of the path to append to the path derived from the module argument. If + // module is an object, then this second argument should be the "value" argument instead. + // value: String||Object? + // If a String, the value to use in the cache for the module/url combination. + // If an Object, it can have two properties: value and sanitize. The value property + // should be the value to use in the cache, and sanitize can be set to true or false, + // to indicate if XML declarations should be removed from the value and if the HTML + // inside a body tag in the value should be extracted as the real value. The value argument + // or the value property on the value argument are usually only used by the build system + // as it inlines cache content. + // example: + // To ask dojo.cache to fetch content and store it in the cache (the dojo["cache"] style + // of call is used to avoid an issue with the build system erroneously trying to intern + // this example. To get the build system to intern your dojo.cache calls, use the + // "dojo.cache" style of call): + // | //If template.html contains "<h1>Hello</h1>" that will be + // | //the value for the text variable. + // | var text = dojo["cache"]("my.module", "template.html"); + // example: + // To ask dojo.cache to fetch content and store it in the cache, and sanitize the input + // (the dojo["cache"] style of call is used to avoid an issue with the build system + // erroneously trying to intern this example. To get the build system to intern your + // dojo.cache calls, use the "dojo.cache" style of call): + // | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the + // | //text variable will contain just "<h1>Hello</h1>". + // | var text = dojo["cache"]("my.module", "template.html", {sanitize: true}); + // example: + // Same example as previous, but demostrates how an object can be passed in as + // the first argument, then the value argument can then be the second argument. + // | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the + // | //text variable will contain just "<h1>Hello</h1>". + // | var text = dojo["cache"](new dojo._Url("my/module/template.html"), {sanitize: true}); + return val; //String +}; +=====*/ +}); + diff --git a/lib/dojo/topic.js b/lib/dojo/topic.js new file mode 100644 index 00000000..2a73d29b --- /dev/null +++ b/lib/dojo/topic.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/topic",["./Evented"],function(_1){var _2=new _1;return {publish:function(_3,_4){return _2.emit.apply(_2,arguments);},subscribe:function(_5,_6){return _2.on.apply(_2,arguments);}};}); \ No newline at end of file diff --git a/lib/dojo/topic.js.uncompressed.js b/lib/dojo/topic.js.uncompressed.js new file mode 100644 index 00000000..7fc63c7d --- /dev/null +++ b/lib/dojo/topic.js.uncompressed.js @@ -0,0 +1,33 @@ +define("dojo/topic", ["./Evented"], function(Evented){ + // summary: + // The export of this module is a pubsub hub + // You can also use listen function itself as a pub/sub hub: + // | topic.subscribe("some/topic", function(event){ + // | ... do something with event + // | }); + // | topic.publish("some/topic", {name:"some event", ...}); + + var hub = new Evented; + return { + publish: function(topic, event){ + // summary: + // Publishes a message to a topic on the pub/sub hub. All arguments after + // the first will be passed to the subscribers, so any number of arguments + // can be provided (not just event). + // topic: String + // The name of the topic to publish to + // event: Object + // An event to distribute to the topic listeners + return hub.emit.apply(hub, arguments); + }, + subscribe: function(topic, listener){ + // summary: + // Subcribes to a topic on the pub/sub hub + // topic: String + // The topic to subscribe to + // listener: Function + // A function to call when a message is published to the given topic + return hub.on.apply(hub, arguments); + } + } +}); diff --git a/lib/dojo/touch.js b/lib/dojo/touch.js new file mode 100644 index 00000000..db903de5 --- /dev/null +++ b/lib/dojo/touch.js @@ -0,0 +1,8 @@ +/* + Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. + Available via Academic Free License >= 2.1 OR the modified BSD license. + see: http://dojotoolkit.org/license for details +*/ + +//>>built +define("dojo/touch",["./_base/kernel","./on","./has","./mouse"],function(_1,on,_2,_3){function _4(_5){return function(_6,_7){return on(_6,_5,_7);};};var _8=_2("touch");_1.touch={press:_4(_8?"touchstart":"mousedown"),move:_4(_8?"touchmove":"mousemove"),release:_4(_8?"touchend":"mouseup"),cancel:_8?_4("touchcancel"):_3.leave};return _1.touch;}); \ No newline at end of file diff --git a/lib/dojo/touch.js.uncompressed.js b/lib/dojo/touch.js.uncompressed.js new file mode 100644 index 00000000..2b3cf5b1 --- /dev/null +++ b/lib/dojo/touch.js.uncompressed.js @@ -0,0 +1,89 @@ +define("dojo/touch", ["./_base/kernel", "./on", "./has", "./mouse"], function(dojo, on, has, mouse){ +// module: +// dojo/touch + +/*===== + dojo.touch = { + // summary: + // This module provides unified touch event handlers by exporting + // press, move, release and cancel which can also run well on desktop. + // Based on http://dvcs.w3.org/hg/webevents/raw-file/tip/touchevents.html + // + // example: + // 1. Used with dojo.connect() + // | dojo.connect(node, dojo.touch.press, function(e){}); + // | dojo.connect(node, dojo.touch.move, function(e){}); + // | dojo.connect(node, dojo.touch.release, function(e){}); + // | dojo.connect(node, dojo.touch.cancel, function(e){}); + // + // 2. Used with dojo.on + // | define(["dojo/on", "dojo/touch"], function(on, touch){ + // | on(node, touch.press, function(e){}); + // | on(node, touch.move, function(e){}); + // | on(node, touch.release, function(e){}); + // | on(node, touch.cancel, function(e){}); + // + // 3. Used with dojo.touch.* directly + // | dojo.touch.press(node, function(e){}); + // | dojo.touch.move(node, function(e){}); + // | dojo.touch.release(node, function(e){}); + // | dojo.touch.cancel(node, function(e){}); + + press: function(node, listener){ + // summary: + // Register a listener to 'touchstart'|'mousedown' for the given node + // node: Dom + // Target node to listen to + // listener: Function + // Callback function + // returns: + // A handle which will be used to remove the listener by handle.remove() + }, + move: function(node, listener){ + // summary: + // Register a listener to 'touchmove'|'mousemove' for the given node + // node: Dom + // Target node to listen to + // listener: Function + // Callback function + // returns: + // A handle which will be used to remove the listener by handle.remove() + }, + release: function(node, listener){ + // summary: + // Register a listener to 'touchend'|'mouseup' for the given node + // node: Dom + // Target node to listen to + // listener: Function + // Callback function + // returns: + // A handle which will be used to remove the listener by handle.remove() + }, + cancel: function(node, listener){ + // summary: + // Register a listener to 'touchcancel'|'mouseleave' for the given node + // node: Dom + // Target node to listen to + // listener: Function + // Callback function + // returns: + // A handle which will be used to remove the listener by handle.remove() + } + }; +=====*/ + + function _handle(/*String - press | move | release | cancel*/type){ + return function(node, listener){//called by on(), see dojo.on + return on(node, type, listener); + }; + } + var touch = has("touch"); + //device neutral events - dojo.touch.press|move|release|cancel + dojo.touch = { + press: _handle(touch ? "touchstart": "mousedown"), + move: _handle(touch ? "touchmove": "mousemove"), + release: _handle(touch ? "touchend": "mouseup"), + cancel: touch ? _handle("touchcancel") : mouse.leave + }; + return dojo.touch; +}); \ No newline at end of file diff --git a/lib/dojo/tt-rss-layer.js b/lib/dojo/tt-rss-layer.js index 2c0f3489..24a099d9 100644 --- a/lib/dojo/tt-rss-layer.js +++ b/lib/dojo/tt-rss-layer.js @@ -11,4 +11,5 @@ http://dojotoolkit.org */ -dojo.provide("tt-rss-layer");if(!dojo._hasResource["dojo.date.stamp"]){dojo._hasResource["dojo.date.stamp"]=true;dojo.provide("dojo.date.stamp");dojo.getObject("date.stamp",true,dojo);dojo.date.stamp.fromISOString=function(_1,_2){if(!dojo.date.stamp._isoRegExp){dojo.date.stamp._isoRegExp=/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;}var _3=dojo.date.stamp._isoRegExp.exec(_1),_4=null;if(_3){_3.shift();if(_3[1]){_3[1]--;}if(_3[6]){_3[6]*=1000;}if(_2){_2=new Date(_2);dojo.forEach(dojo.map(["FullYear","Month","Date","Hours","Minutes","Seconds","Milliseconds"],function(_5){return _2["get"+_5]();}),function(_6,_7){_3[_7]=_3[_7]||_6;});}_4=new Date(_3[0]||1970,_3[1]||0,_3[2]||1,_3[3]||0,_3[4]||0,_3[5]||0,_3[6]||0);if(_3[0]<100){_4.setFullYear(_3[0]||1970);}var _8=0,_9=_3[7]&&_3[7].charAt(0);if(_9!="Z"){_8=((_3[8]||0)*60)+(Number(_3[9])||0);if(_9!="-"){_8*=-1;}}if(_9){_8-=_4.getTimezoneOffset();}if(_8){_4.setTime(_4.getTime()+_8*60000);}}return _4;};dojo.date.stamp.toISOString=function(_a,_b){var _c=function(n){return (n<10)?"0"+n:n;};_b=_b||{};var _d=[],_e=_b.zulu?"getUTC":"get",_f="";if(_b.selector!="time"){var _10=_a[_e+"FullYear"]();_f=["0000".substr((_10+"").length)+_10,_c(_a[_e+"Month"]()+1),_c(_a[_e+"Date"]())].join("-");}_d.push(_f);if(_b.selector!="date"){var _11=[_c(_a[_e+"Hours"]()),_c(_a[_e+"Minutes"]()),_c(_a[_e+"Seconds"]())].join(":");var _12=_a[_e+"Milliseconds"]();if(_b.milliseconds){_11+="."+(_12<100?"0":"")+_c(_12);}if(_b.zulu){_11+="Z";}else{if(_b.selector!="time"){var _13=_a.getTimezoneOffset();var _14=Math.abs(_13);_11+=(_13>0?"-":"+")+_c(Math.floor(_14/60))+":"+_c(_14%60);}}_d.push(_11);}return _d.join("T");};}if(!dojo._hasResource["dojo.parser"]){dojo._hasResource["dojo.parser"]=true;dojo.provide("dojo.parser");new Date("X");dojo.parser=new function(){var d=dojo;function _15(_16){if(d.isString(_16)){return "string";}if(typeof _16=="number"){return "number";}if(typeof _16=="boolean"){return "boolean";}if(d.isFunction(_16)){return "function";}if(d.isArray(_16)){return "array";}if(_16 instanceof Date){return "date";}if(_16 instanceof d._Url){return "url";}return "object";};function _17(_18,_19){switch(_19){case "string":return _18;case "number":return _18.length?Number(_18):NaN;case "boolean":return typeof _18=="boolean"?_18:!(_18.toLowerCase()=="false");case "function":if(d.isFunction(_18)){_18=_18.toString();_18=d.trim(_18.substring(_18.indexOf("{")+1,_18.length-1));}try{if(_18===""||_18.search(/[^\w\.]+/i)!=-1){return new Function(_18);}else{return d.getObject(_18,false)||new Function(_18);}}catch(e){return new Function();}case "array":return _18?_18.split(/\s*,\s*/):[];case "date":switch(_18){case "":return new Date("");case "now":return new Date();default:return d.date.stamp.fromISOString(_18);}case "url":return d.baseUrl+_18;default:return d.fromJson(_18);}};var _1a={},_1b={};d.connect(d,"extend",function(){_1b={};});function _1c(cls,_1d){for(var _1e in cls){if(_1e.charAt(0)=="_"){continue;}if(_1e in _1a){continue;}_1d[_1e]=_15(cls[_1e]);}return _1d;};function _1f(_20,_21){var c=_1b[_20];if(!c){var cls=d.getObject(_20),_22=null;if(!cls){return null;}if(!_21){_22=_1c(cls.prototype,{});}c={cls:cls,params:_22};}else{if(!_21&&!c.params){c.params=_1c(c.cls.prototype,{});}}return c;};this._functionFromScript=function(_23,_24){var _25="";var _26="";var _27=(_23.getAttribute(_24+"args")||_23.getAttribute("args"));if(_27){d.forEach(_27.split(/\s*,\s*/),function(_28,idx){_25+="var "+_28+" = arguments["+idx+"]; ";});}var _29=_23.getAttribute("with");if(_29&&_29.length){d.forEach(_29.split(/\s*,\s*/),function(_2a){_25+="with("+_2a+"){";_26+="}";});}return new Function(_25+_23.innerHTML+_26);};this.instantiate=function(_2b,_2c,_2d){var _2e=[],_2c=_2c||{};_2d=_2d||{};var _2f=(_2d.scope||d._scopeName)+"Type",_30="data-"+(_2d.scope||d._scopeName)+"-";d.forEach(_2b,function(obj){if(!obj){return;}var _31,_32,_33,_34,_35,_36;if(obj.node){_31=obj.node;_32=obj.type;_36=obj.fastpath;_33=obj.clsInfo||(_32&&_1f(_32,_36));_34=_33&&_33.cls;_35=obj.scripts;}else{_31=obj;_32=_2f in _2c?_2c[_2f]:_31.getAttribute(_2f);_33=_32&&_1f(_32);_34=_33&&_33.cls;_35=(_34&&(_34._noScript||_34.prototype._noScript)?[]:d.query("> script[type^='dojo/']",_31));}if(!_33){throw new Error("Could not load class '"+_32);}var _37={};if(_2d.defaults){d._mixin(_37,_2d.defaults);}if(obj.inherited){d._mixin(_37,obj.inherited);}if(_36){var _38=_31.getAttribute(_30+"props");if(_38&&_38.length){try{_38=d.fromJson.call(_2d.propsThis,"{"+_38+"}");d._mixin(_37,_38);}catch(e){throw new Error(e.toString()+" in data-dojo-props='"+_38+"'");}}var _39=_31.getAttribute(_30+"attach-point");if(_39){_37.dojoAttachPoint=_39;}var _3a=_31.getAttribute(_30+"attach-event");if(_3a){_37.dojoAttachEvent=_3a;}dojo.mixin(_37,_2c);}else{var _3b=_31.attributes;for(var _3c in _33.params){var _3d=_3c in _2c?{value:_2c[_3c],specified:true}:_3b.getNamedItem(_3c);if(!_3d||(!_3d.specified&&(!dojo.isIE||_3c.toLowerCase()!="value"))){continue;}var _3e=_3d.value;switch(_3c){case "class":_3e="className" in _2c?_2c.className:_31.className;break;case "style":_3e="style" in _2c?_2c.style:(_31.style&&_31.style.cssText);}var _3f=_33.params[_3c];if(typeof _3e=="string"){_37[_3c]=_17(_3e,_3f);}else{_37[_3c]=_3e;}}}var _40=[],_41=[];d.forEach(_35,function(_42){_31.removeChild(_42);var _43=(_42.getAttribute(_30+"event")||_42.getAttribute("event")),_32=_42.getAttribute("type"),nf=d.parser._functionFromScript(_42,_30);if(_43){if(_32=="dojo/connect"){_40.push({event:_43,func:nf});}else{_37[_43]=nf;}}else{_41.push(nf);}});var _44=_34.markupFactory||_34.prototype&&_34.prototype.markupFactory;var _45=_44?_44(_37,_31,_34):new _34(_37,_31);_2e.push(_45);var _46=(_31.getAttribute(_30+"id")||_31.getAttribute("jsId"));if(_46){d.setObject(_46,_45);}d.forEach(_40,function(_47){d.connect(_45,_47.event,null,_47.func);});d.forEach(_41,function(_48){_48.call(_45);});});if(!_2c._started){d.forEach(_2e,function(_49){if(!_2d.noStart&&_49&&dojo.isFunction(_49.startup)&&!_49._started&&(!_49.getParent||!_49.getParent())){_49.startup();}});}return _2e;};this.parse=function(_4a,_4b){var _4c;if(!_4b&&_4a&&_4a.rootNode){_4b=_4a;_4c=_4b.rootNode;}else{_4c=_4a;}_4c=_4c?dojo.byId(_4c):dojo.body();_4b=_4b||{};var _4d=(_4b.scope||d._scopeName)+"Type",_4e="data-"+(_4b.scope||d._scopeName)+"-";function _4f(_50,_51){var _52=dojo.clone(_50.inherited);dojo.forEach(["dir","lang"],function(_53){var val=_50.node.getAttribute(_53);if(val){_52[_53]=val;}});var _54=_50.clsInfo&&!_50.clsInfo.cls.prototype._noScript?_50.scripts:null;var _55=(!_50.clsInfo||!_50.clsInfo.cls.prototype.stopParser)||(_4b&&_4b.template);for(var _56=_50.node.firstChild;_56;_56=_56.nextSibling){if(_56.nodeType==1){var _57,_58=_55&&_56.getAttribute(_4e+"type");if(_58){_57=_58;}else{_57=_55&&_56.getAttribute(_4d);}var _59=_58==_57;if(_57){var _5a={"type":_57,fastpath:_59,clsInfo:_1f(_57,_59),node:_56,scripts:[],inherited:_52};_51.push(_5a);_4f(_5a,_51);}else{if(_54&&_56.nodeName.toLowerCase()=="script"){_57=_56.getAttribute("type");if(_57&&/^dojo\/\w/i.test(_57)){_54.push(_56);}}else{if(_55){_4f({node:_56,inherited:_52},_51);}}}}}};var _5b={};if(_4b&&_4b.inherited){for(var key in _4b.inherited){if(_4b.inherited[key]){_5b[key]=_4b.inherited[key];}}}var _5c=[];_4f({node:_4c,inherited:_5b},_5c);var _5d=_4b&&_4b.template?{template:true}:null;return this.instantiate(_5c,_5d,_4b);};}();(function(){var _5e=function(){if(dojo.config.parseOnLoad){dojo.parser.parse();}};if(dojo.getObject("dijit.wai.onload")===dojo._loaders[0]){dojo._loaders.splice(1,0,_5e);}else{dojo._loaders.unshift(_5e);}})();}if(!dojo._hasResource["dojo.window"]){dojo._hasResource["dojo.window"]=true;dojo.provide("dojo.window");dojo.getObject("window",true,dojo);dojo.window.getBox=function(){var _5f=(dojo.doc.compatMode=="BackCompat")?dojo.body():dojo.doc.documentElement;var _60=dojo._docScroll();return {w:_5f.clientWidth,h:_5f.clientHeight,l:_60.x,t:_60.y};};dojo.window.get=function(doc){if(dojo.isIE&&window!==document.parentWindow){doc.parentWindow.execScript("document._parentWindow = window;","Javascript");var win=doc._parentWindow;doc._parentWindow=null;return win;}return doc.parentWindow||doc.defaultView;};dojo.window.scrollIntoView=function(_61,pos){try{_61=dojo.byId(_61);var doc=_61.ownerDocument||dojo.doc,_62=doc.body||dojo.body(),_63=doc.documentElement||_62.parentNode,_64=dojo.isIE,_65=dojo.isWebKit;if((!(dojo.isMoz||_64||_65||dojo.isOpera)||_61==_62||_61==_63)&&(typeof _61.scrollIntoView!="undefined")){_61.scrollIntoView(false);return;}var _66=doc.compatMode=="BackCompat",_67=(_64>=9&&_61.ownerDocument.parentWindow.frameElement)?((_63.clientHeight>0&&_63.clientWidth>0&&(_62.clientHeight==0||_62.clientWidth==0||_62.clientHeight>_63.clientHeight||_62.clientWidth>_63.clientWidth))?_63:_62):(_66?_62:_63),_68=_65?_62:_67,_69=_67.clientWidth,_6a=_67.clientHeight,rtl=!dojo._isBodyLtr(),_6b=pos||dojo.position(_61),el=_61.parentNode,_6c=function(el){return ((_64<=6||(_64&&_66))?false:(dojo.style(el,"position").toLowerCase()=="fixed"));};if(_6c(_61)){return;}while(el){if(el==_62){el=_68;}var _6d=dojo.position(el),_6e=_6c(el);if(el==_68){_6d.w=_69;_6d.h=_6a;if(_68==_63&&_64&&rtl){_6d.x+=_68.offsetWidth-_6d.w;}if(_6d.x<0||!_64){_6d.x=0;}if(_6d.y<0||!_64){_6d.y=0;}}else{var pb=dojo._getPadBorderExtents(el);_6d.w-=pb.w;_6d.h-=pb.h;_6d.x+=pb.l;_6d.y+=pb.t;var _6f=el.clientWidth,_70=_6d.w-_6f;if(_6f>0&&_70>0){_6d.w=_6f;_6d.x+=(rtl&&(_64||el.clientLeft>pb.l))?_70:0;}_6f=el.clientHeight;_70=_6d.h-_6f;if(_6f>0&&_70>0){_6d.h=_6f;}}if(_6e){if(_6d.y<0){_6d.h+=_6d.y;_6d.y=0;}if(_6d.x<0){_6d.w+=_6d.x;_6d.x=0;}if(_6d.y+_6d.h>_6a){_6d.h=_6a-_6d.y;}if(_6d.x+_6d.w>_69){_6d.w=_69-_6d.x;}}var l=_6b.x-_6d.x,t=_6b.y-Math.max(_6d.y,0),r=l+_6b.w-_6d.w,bot=t+_6b.h-_6d.h;if(r*l>0){var s=Math[l<0?"max":"min"](l,r);if(rtl&&((_64==8&&!_66)||_64>=9)){s=-s;}_6b.x+=el.scrollLeft;el.scrollLeft+=s;_6b.x-=el.scrollLeft;}if(bot*t>0){_6b.y+=el.scrollTop;el.scrollTop+=Math[t<0?"max":"min"](t,bot);_6b.y-=el.scrollTop;}el=(el!=_68)&&!_6e&&el.parentNode;}}catch(error){console.error("scrollIntoView: "+error);_61.scrollIntoView(false);}};}if(!dojo._hasResource["dijit._base.manager"]){dojo._hasResource["dijit._base.manager"]=true;dojo.provide("dijit._base.manager");dojo.declare("dijit.WidgetSet",null,{constructor:function(){this._hash={};this.length=0;},add:function(_71){if(this._hash[_71.id]){throw new Error("Tried to register widget with id=="+_71.id+" but that id is already registered");}this._hash[_71.id]=_71;this.length++;},remove:function(id){if(this._hash[id]){delete this._hash[id];this.length--;}},forEach:function(_72,_73){_73=_73||dojo.global;var i=0,id;for(id in this._hash){_72.call(_73,this._hash[id],i++,this._hash);}return this;},filter:function(_74,_75){_75=_75||dojo.global;var res=new dijit.WidgetSet(),i=0,id;for(id in this._hash){var w=this._hash[id];if(_74.call(_75,w,i++,this._hash)){res.add(w);}}return res;},byId:function(id){return this._hash[id];},byClass:function(cls){var res=new dijit.WidgetSet(),id,_76;for(id in this._hash){_76=this._hash[id];if(_76.declaredClass==cls){res.add(_76);}}return res;},toArray:function(){var ar=[];for(var id in this._hash){ar.push(this._hash[id]);}return ar;},map:function(_77,_78){return dojo.map(this.toArray(),_77,_78);},every:function(_79,_7a){_7a=_7a||dojo.global;var x=0,i;for(i in this._hash){if(!_79.call(_7a,this._hash[i],x++,this._hash)){return false;}}return true;},some:function(_7b,_7c){_7c=_7c||dojo.global;var x=0,i;for(i in this._hash){if(_7b.call(_7c,this._hash[i],x++,this._hash)){return true;}}return false;}});(function(){dijit.registry=new dijit.WidgetSet();var _7d=dijit.registry._hash,_7e=dojo.attr,_7f=dojo.hasAttr,_80=dojo.style;dijit.byId=function(id){return typeof id=="string"?_7d[id]:id;};var _81={};dijit.getUniqueId=function(_82){var id;do{id=_82+"_"+(_82 in _81?++_81[_82]:_81[_82]=0);}while(_7d[id]);return dijit._scopeName=="dijit"?id:dijit._scopeName+"_"+id;};dijit.findWidgets=function(_83){var _84=[];function _85(_86){for(var _87=_86.firstChild;_87;_87=_87.nextSibling){if(_87.nodeType==1){var _88=_87.getAttribute("widgetId");if(_88){var _89=_7d[_88];if(_89){_84.push(_89);}}else{_85(_87);}}}};_85(_83);return _84;};dijit._destroyAll=function(){dijit._curFocus=null;dijit._prevFocus=null;dijit._activeStack=[];dojo.forEach(dijit.findWidgets(dojo.body()),function(_8a){if(!_8a._destroyed){if(_8a.destroyRecursive){_8a.destroyRecursive();}else{if(_8a.destroy){_8a.destroy();}}}});};if(dojo.isIE){dojo.addOnWindowUnload(function(){dijit._destroyAll();});}dijit.byNode=function(_8b){return _7d[_8b.getAttribute("widgetId")];};dijit.getEnclosingWidget=function(_8c){while(_8c){var id=_8c.getAttribute&&_8c.getAttribute("widgetId");if(id){return _7d[id];}_8c=_8c.parentNode;}return null;};var _8d=(dijit._isElementShown=function(_8e){var s=_80(_8e);return (s.visibility!="hidden")&&(s.visibility!="collapsed")&&(s.display!="none")&&(_7e(_8e,"type")!="hidden");});dijit.hasDefaultTabStop=function(_8f){switch(_8f.nodeName.toLowerCase()){case "a":return _7f(_8f,"href");case "area":case "button":case "input":case "object":case "select":case "textarea":return true;case "iframe":var _90;try{var _91=_8f.contentDocument;if("designMode" in _91&&_91.designMode=="on"){return true;}_90=_91.body;}catch(e1){try{_90=_8f.contentWindow.document.body;}catch(e2){return false;}}return _90.contentEditable=="true"||(_90.firstChild&&_90.firstChild.contentEditable=="true");default:return _8f.contentEditable=="true";}};var _92=(dijit.isTabNavigable=function(_93){if(_7e(_93,"disabled")){return false;}else{if(_7f(_93,"tabIndex")){return _7e(_93,"tabIndex")>=0;}else{return dijit.hasDefaultTabStop(_93);}}});dijit._getTabNavigable=function(_94){var _95,_96,_97,_98,_99,_9a,_9b={};function _9c(_9d){return _9d&&_9d.tagName.toLowerCase()=="input"&&_9d.type&&_9d.type.toLowerCase()=="radio"&&_9d.name&&_9d.name.toLowerCase();};var _9e=function(_9f){dojo.query("> *",_9f).forEach(function(_a0){if((dojo.isIE&&_a0.scopeName!=="HTML")||!_8d(_a0)){return;}if(_92(_a0)){var _a1=_7e(_a0,"tabIndex");if(!_7f(_a0,"tabIndex")||_a1==0){if(!_95){_95=_a0;}_96=_a0;}else{if(_a1>0){if(!_97||_a1<_98){_98=_a1;_97=_a0;}if(!_99||_a1>=_9a){_9a=_a1;_99=_a0;}}}var rn=_9c(_a0);if(dojo.attr(_a0,"checked")&&rn){_9b[rn]=_a0;}}if(_a0.nodeName.toUpperCase()!="SELECT"){_9e(_a0);}});};if(_8d(_94)){_9e(_94);}function rs(_a2){return _9b[_9c(_a2)]||_a2;};return {first:rs(_95),last:rs(_96),lowest:rs(_97),highest:rs(_99)};};dijit.getFirstInTabbingOrder=function(_a3){var _a4=dijit._getTabNavigable(dojo.byId(_a3));return _a4.lowest?_a4.lowest:_a4.first;};dijit.getLastInTabbingOrder=function(_a5){var _a6=dijit._getTabNavigable(dojo.byId(_a5));return _a6.last?_a6.last:_a6.highest;};dijit.defaultDuration=dojo.config["defaultDuration"]||200;})();}if(!dojo._hasResource["dijit._base.focus"]){dojo._hasResource["dijit._base.focus"]=true;dojo.provide("dijit._base.focus");dojo.mixin(dijit,{_curFocus:null,_prevFocus:null,isCollapsed:function(){return dijit.getBookmark().isCollapsed;},getBookmark:function(){var bm,rg,tg,sel=dojo.doc.selection,cf=dijit._curFocus;if(dojo.global.getSelection){sel=dojo.global.getSelection();if(sel){if(sel.isCollapsed){tg=cf?cf.tagName:"";if(tg){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};}}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){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={};try{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;},moveToBookmark:function(_a7){var _a8=dojo.doc,_a9=_a7.mark;if(_a9){if(dojo.global.getSelection){var sel=dojo.global.getSelection();if(sel&&sel.removeAllRanges){if(_a9.pRange){var r=_a9;var n=r.node;n.selectionStart=r.start;n.selectionEnd=r.end;}else{sel.removeAllRanges();sel.addRange(_a9);}}else{console.warn("No idea how to restore selection for this browser!");}}else{if(_a8.selection&&_a9){var rg;if(_a9.pRange){rg=_a9.range;}else{if(dojo.isArray(_a9)){rg=_a8.body.createControlRange();dojo.forEach(_a9,function(n){rg.addElement(n);});}else{rg=_a8.body.createTextRange();rg.moveToBookmark(_a9);}}rg.select();}}}},getFocus:function(_aa,_ab){var _ac=!dijit._curFocus||(_aa&&dojo.isDescendant(dijit._curFocus,_aa.domNode))?dijit._prevFocus:dijit._curFocus;return {node:_ac,bookmark:(_ac==dijit._curFocus)&&dojo.withGlobal(_ab||dojo.global,dijit.getBookmark),openedForWindow:_ab};},focus:function(_ad){if(!_ad){return;}var _ae="node" in _ad?_ad.node:_ad,_af=_ad.bookmark,_b0=_ad.openedForWindow,_b1=_af?_af.isCollapsed:false;if(_ae){var _b2=(_ae.tagName.toLowerCase()=="iframe")?_ae.contentWindow:_ae;if(_b2&&_b2.focus){try{_b2.focus();}catch(e){}}dijit._onFocusNode(_ae);}if(_af&&dojo.withGlobal(_b0||dojo.global,dijit.isCollapsed)&&!_b1){if(_b0){_b0.focus();}try{dojo.withGlobal(_b0||dojo.global,dijit.moveToBookmark,null,[_af]);}catch(e2){}}},_activeStack:[],registerIframe:function(_b3){return dijit.registerWin(_b3.contentWindow,_b3);},unregisterIframe:function(_b4){dijit.unregisterWin(_b4);},registerWin:function(_b5,_b6){var _b7=function(evt){dijit._justMouseDowned=true;setTimeout(function(){dijit._justMouseDowned=false;},0);if(dojo.isIE&&evt&&evt.srcElement&&evt.srcElement.parentNode==null){return;}dijit._onTouchNode(_b6||evt.target||evt.srcElement,"mouse");};var doc=dojo.isIE?_b5.document.documentElement:_b5.document;if(doc){if(dojo.isIE){_b5.document.body.attachEvent("onmousedown",_b7);var _b8=function(evt){if(evt.srcElement.tagName.toLowerCase()!="#document"&&dijit.isTabNavigable(evt.srcElement)){dijit._onFocusNode(_b6||evt.srcElement);}else{dijit._onTouchNode(_b6||evt.srcElement);}};doc.attachEvent("onactivate",_b8);var _b9=function(evt){dijit._onBlurNode(_b6||evt.srcElement);};doc.attachEvent("ondeactivate",_b9);return function(){_b5.document.detachEvent("onmousedown",_b7);doc.detachEvent("onactivate",_b8);doc.detachEvent("ondeactivate",_b9);doc=null;};}else{doc.body.addEventListener("mousedown",_b7,true);var _ba=function(evt){dijit._onFocusNode(_b6||evt.target);};doc.addEventListener("focus",_ba,true);var _bb=function(evt){dijit._onBlurNode(_b6||evt.target);};doc.addEventListener("blur",_bb,true);return function(){doc.body.removeEventListener("mousedown",_b7,true);doc.removeEventListener("focus",_ba,true);doc.removeEventListener("blur",_bb,true);doc=null;};}}},unregisterWin:function(_bc){_bc&&_bc();},_onBlurNode:function(_bd){dijit._prevFocus=dijit._curFocus;dijit._curFocus=null;if(dijit._justMouseDowned){return;}if(dijit._clearActiveWidgetsTimer){clearTimeout(dijit._clearActiveWidgetsTimer);}dijit._clearActiveWidgetsTimer=setTimeout(function(){delete dijit._clearActiveWidgetsTimer;dijit._setStack([]);dijit._prevFocus=null;},100);},_onTouchNode:function(_be,by){if(dijit._clearActiveWidgetsTimer){clearTimeout(dijit._clearActiveWidgetsTimer);delete dijit._clearActiveWidgetsTimer;}var _bf=[];try{while(_be){var _c0=dojo.attr(_be,"dijitPopupParent");if(_c0){_be=dijit.byId(_c0).domNode;}else{if(_be.tagName&&_be.tagName.toLowerCase()=="body"){if(_be===dojo.body()){break;}_be=dojo.window.get(_be.ownerDocument).frameElement;}else{var id=_be.getAttribute&&_be.getAttribute("widgetId"),_c1=id&&dijit.byId(id);if(_c1&&!(by=="mouse"&&_c1.get("disabled"))){_bf.unshift(id);}_be=_be.parentNode;}}}}catch(e){}dijit._setStack(_bf,by);},_onFocusNode:function(_c2){if(!_c2){return;}if(_c2.nodeType==9){return;}dijit._onTouchNode(_c2);if(_c2==dijit._curFocus){return;}if(dijit._curFocus){dijit._prevFocus=dijit._curFocus;}dijit._curFocus=_c2;dojo.publish("focusNode",[_c2]);},_setStack:function(_c3,by){var _c4=dijit._activeStack;dijit._activeStack=_c3;for(var _c5=0;_c5<Math.min(_c4.length,_c3.length);_c5++){if(_c4[_c5]!=_c3[_c5]){break;}}var _c6;for(var i=_c4.length-1;i>=_c5;i--){_c6=dijit.byId(_c4[i]);if(_c6){_c6._focused=false;_c6.set("focused",false);_c6._hasBeenBlurred=true;if(_c6._onBlur){_c6._onBlur(by);}dojo.publish("widgetBlur",[_c6,by]);}}for(i=_c5;i<_c3.length;i++){_c6=dijit.byId(_c3[i]);if(_c6){_c6._focused=true;_c6.set("focused",true);if(_c6._onFocus){_c6._onFocus(by);}dojo.publish("widgetFocus",[_c6,by]);}}}});dojo.addOnLoad(function(){var _c7=dijit.registerWin(window);if(dojo.isIE){dojo.addOnWindowUnload(function(){dijit.unregisterWin(_c7);_c7=null;});}});}if(!dojo._hasResource["dojo.AdapterRegistry"]){dojo._hasResource["dojo.AdapterRegistry"]=true;dojo.provide("dojo.AdapterRegistry");dojo.AdapterRegistry=function(_c8){this.pairs=[];this.returnWrappers=_c8||false;};dojo.extend(dojo.AdapterRegistry,{register:function(_c9,_ca,_cb,_cc,_cd){this.pairs[((_cd)?"unshift":"push")]([_c9,_ca,_cb,_cc]);},match:function(){for(var i=0;i<this.pairs.length;i++){var _ce=this.pairs[i];if(_ce[1].apply(this,arguments)){if((_ce[3])||(this.returnWrappers)){return _ce[2];}else{return _ce[2].apply(this,arguments);}}}throw new Error("No match found");},unregister:function(_cf){for(var i=0;i<this.pairs.length;i++){var _d0=this.pairs[i];if(_d0[0]==_cf){this.pairs.splice(i,1);return true;}}return false;}});}if(!dojo._hasResource["dijit._base.place"]){dojo._hasResource["dijit._base.place"]=true;dojo.provide("dijit._base.place");dijit.getViewport=function(){return dojo.window.getBox();};dijit.placeOnScreen=function(_d1,pos,_d2,_d3){var _d4=dojo.map(_d2,function(_d5){var c={corner:_d5,pos:{x:pos.x,y:pos.y}};if(_d3){c.pos.x+=_d5.charAt(1)=="L"?_d3.x:-_d3.x;c.pos.y+=_d5.charAt(0)=="T"?_d3.y:-_d3.y;}return c;});return dijit._place(_d1,_d4);};dijit._place=function(_d6,_d7,_d8,_d9){var _da=dojo.window.getBox();if(!_d6.parentNode||String(_d6.parentNode.tagName).toLowerCase()!="body"){dojo.body().appendChild(_d6);}var _db=null;dojo.some(_d7,function(_dc){var _dd=_dc.corner;var pos=_dc.pos;var _de=0;var _df={w:_dd.charAt(1)=="L"?(_da.l+_da.w)-pos.x:pos.x-_da.l,h:_dd.charAt(1)=="T"?(_da.t+_da.h)-pos.y:pos.y-_da.t};if(_d8){var res=_d8(_d6,_dc.aroundCorner,_dd,_df,_d9);_de=typeof res=="undefined"?0:res;}var _e0=_d6.style;var _e1=_e0.display;var _e2=_e0.visibility;_e0.visibility="hidden";_e0.display="";var mb=dojo.marginBox(_d6);_e0.display=_e1;_e0.visibility=_e2;var _e3=Math.max(_da.l,_dd.charAt(1)=="L"?pos.x:(pos.x-mb.w)),_e4=Math.max(_da.t,_dd.charAt(0)=="T"?pos.y:(pos.y-mb.h)),_e5=Math.min(_da.l+_da.w,_dd.charAt(1)=="L"?(_e3+mb.w):pos.x),_e6=Math.min(_da.t+_da.h,_dd.charAt(0)=="T"?(_e4+mb.h):pos.y),_e7=_e5-_e3,_e8=_e6-_e4;_de+=(mb.w-_e7)+(mb.h-_e8);if(_db==null||_de<_db.overflow){_db={corner:_dd,aroundCorner:_dc.aroundCorner,x:_e3,y:_e4,w:_e7,h:_e8,overflow:_de,spaceAvailable:_df};}return !_de;});if(_db.overflow&&_d8){_d8(_d6,_db.aroundCorner,_db.corner,_db.spaceAvailable,_d9);}var l=dojo._isBodyLtr(),s=_d6.style;s.top=_db.y+"px";s[l?"left":"right"]=(l?_db.x:_da.w-_db.x-_db.w)+"px";return _db;};dijit.placeOnScreenAroundNode=function(_e9,_ea,_eb,_ec){_ea=dojo.byId(_ea);var _ed=dojo.position(_ea,true);return dijit._placeOnScreenAroundRect(_e9,_ed.x,_ed.y,_ed.w,_ed.h,_eb,_ec);};dijit.placeOnScreenAroundRectangle=function(_ee,_ef,_f0,_f1){return dijit._placeOnScreenAroundRect(_ee,_ef.x,_ef.y,_ef.width,_ef.height,_f0,_f1);};dijit._placeOnScreenAroundRect=function(_f2,x,y,_f3,_f4,_f5,_f6){var _f7=[];for(var _f8 in _f5){_f7.push({aroundCorner:_f8,corner:_f5[_f8],pos:{x:x+(_f8.charAt(1)=="L"?0:_f3),y:y+(_f8.charAt(0)=="T"?0:_f4)}});}return dijit._place(_f2,_f7,_f6,{w:_f3,h:_f4});};dijit.placementRegistry=new dojo.AdapterRegistry();dijit.placementRegistry.register("node",function(n,x){return typeof x=="object"&&typeof x.offsetWidth!="undefined"&&typeof x.offsetHeight!="undefined";},dijit.placeOnScreenAroundNode);dijit.placementRegistry.register("rect",function(n,x){return typeof x=="object"&&"x" in x&&"y" in x&&"width" in x&&"height" in x;},dijit.placeOnScreenAroundRectangle);dijit.placeOnScreenAroundElement=function(_f9,_fa,_fb,_fc){return dijit.placementRegistry.match.apply(dijit.placementRegistry,arguments);};dijit.getPopupAroundAlignment=function(_fd,_fe){var _ff={};dojo.forEach(_fd,function(pos){switch(pos){case "after":_ff[_fe?"BR":"BL"]=_fe?"BL":"BR";break;case "before":_ff[_fe?"BL":"BR"]=_fe?"BR":"BL";break;case "below-alt":_fe=!_fe;case "below":_ff[_fe?"BL":"BR"]=_fe?"TL":"TR";_ff[_fe?"BR":"BL"]=_fe?"TR":"TL";break;case "above-alt":_fe=!_fe;case "above":default:_ff[_fe?"TL":"TR"]=_fe?"BL":"BR";_ff[_fe?"TR":"TL"]=_fe?"BR":"BL";break;}});return _ff;};}if(!dojo._hasResource["dijit._base.window"]){dojo._hasResource["dijit._base.window"]=true;dojo.provide("dijit._base.window");dijit.getDocumentWindow=function(doc){return dojo.window.get(doc);};}if(!dojo._hasResource["dijit._base.popup"]){dojo._hasResource["dijit._base.popup"]=true;dojo.provide("dijit._base.popup");dijit.popup={_stack:[],_beginZIndex:1000,_idGen:1,_createWrapper:function(_100){var _101=_100.declaredClass?_100._popupWrapper:(_100.parentNode&&dojo.hasClass(_100.parentNode,"dijitPopup")),node=_100.domNode||_100;if(!_101){_101=dojo.create("div",{"class":"dijitPopup",style:{display:"none"},role:"presentation"},dojo.body());_101.appendChild(node);var s=node.style;s.display="";s.visibility="";s.position="";s.top="0px";if(_100.declaredClass){_100._popupWrapper=_101;dojo.connect(_100,"destroy",function(){dojo.destroy(_101);delete _100._popupWrapper;});}}return _101;},moveOffScreen:function(_102){var _103=this._createWrapper(_102);dojo.style(_103,{visibility:"hidden",top:"-9999px",display:""});},hide:function(_104){var _105=this._createWrapper(_104);dojo.style(_105,"display","none");},getTopPopup:function(){var _106=this._stack;for(var pi=_106.length-1;pi>0&&_106[pi].parent===_106[pi-1].widget;pi--){}return _106[pi];},open:function(args){var _107=this._stack,_108=args.popup,_109=args.orient||((args.parent?args.parent.isLeftToRight():dojo._isBodyLtr())?{"BL":"TL","BR":"TR","TL":"BL","TR":"BR"}:{"BR":"TR","BL":"TL","TR":"BR","TL":"BL"}),_10a=args.around,id=(args.around&&args.around.id)?(args.around.id+"_dropdown"):("popup_"+this._idGen++);while(_107.length&&(!args.parent||!dojo.isDescendant(args.parent.domNode,_107[_107.length-1].widget.domNode))){dijit.popup.close(_107[_107.length-1].widget);}var _10b=this._createWrapper(_108);dojo.attr(_10b,{id:id,style:{zIndex:this._beginZIndex+_107.length},"class":"dijitPopup "+(_108.baseClass||_108["class"]||"").split(" ")[0]+"Popup",dijitPopupParent:args.parent?args.parent.id:""});if(dojo.isIE||dojo.isMoz){if(!_108.bgIframe){_108.bgIframe=new dijit.BackgroundIframe(_10b);}}var best=_10a?dijit.placeOnScreenAroundElement(_10b,_10a,_109,_108.orient?dojo.hitch(_108,"orient"):null):dijit.placeOnScreen(_10b,args,_109=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"],args.padding);_10b.style.display="";_10b.style.visibility="visible";_108.domNode.style.visibility="visible";var _10c=[];_10c.push(dojo.connect(_10b,"onkeypress",this,function(evt){if(evt.charOrCode==dojo.keys.ESCAPE&&args.onCancel){dojo.stopEvent(evt);args.onCancel();}else{if(evt.charOrCode===dojo.keys.TAB){dojo.stopEvent(evt);var _10d=this.getTopPopup();if(_10d&&_10d.onCancel){_10d.onCancel();}}}}));if(_108.onCancel){_10c.push(dojo.connect(_108,"onCancel",args.onCancel));}_10c.push(dojo.connect(_108,_108.onExecute?"onExecute":"onChange",this,function(){var _10e=this.getTopPopup();if(_10e&&_10e.onExecute){_10e.onExecute();}}));_107.push({widget:_108,parent:args.parent,onExecute:args.onExecute,onCancel:args.onCancel,onClose:args.onClose,handlers:_10c});if(_108.onOpen){_108.onOpen(best);}return best;},close:function(_10f){var _110=this._stack;while((_10f&&dojo.some(_110,function(elem){return elem.widget==_10f;}))||(!_10f&&_110.length)){var top=_110.pop(),_111=top.widget,_112=top.onClose;if(_111.onClose){_111.onClose();}dojo.forEach(top.handlers,dojo.disconnect);if(_111&&_111.domNode){this.hide(_111);}if(_112){_112();}}}};dijit._frames=new function(){var _113=[];this.pop=function(){var _114;if(_113.length){_114=_113.pop();_114.style.display="";}else{if(dojo.isIE<9){var burl=dojo.config["dojoBlankHtmlUrl"]||(dojo.moduleUrl("dojo","resources/blank.html")+"")||"javascript:\"\"";var html="<iframe src='"+burl+"'"+" style='position: absolute; left: 0px; top: 0px;"+"z-index: -1; filter:Alpha(Opacity=\"0\");'>";_114=dojo.doc.createElement(html);}else{_114=dojo.create("iframe");_114.src="javascript:\"\"";_114.className="dijitBackgroundIframe";dojo.style(_114,"opacity",0.1);}_114.tabIndex=-1;dijit.setWaiRole(_114,"presentation");}return _114;};this.push=function(_115){_115.style.display="none";_113.push(_115);};}();dijit.BackgroundIframe=function(node){if(!node.id){throw new Error("no id");}if(dojo.isIE||dojo.isMoz){var _116=(this.iframe=dijit._frames.pop());node.appendChild(_116);if(dojo.isIE<7||dojo.isQuirks){this.resize(node);this._conn=dojo.connect(node,"onresize",this,function(){this.resize(node);});}else{dojo.style(_116,{width:"100%",height:"100%"});}}};dojo.extend(dijit.BackgroundIframe,{resize:function(node){if(this.iframe){dojo.style(this.iframe,{width:node.offsetWidth+"px",height:node.offsetHeight+"px"});}},destroy:function(){if(this._conn){dojo.disconnect(this._conn);this._conn=null;}if(this.iframe){dijit._frames.push(this.iframe);delete this.iframe;}}});}if(!dojo._hasResource["dijit._base.scroll"]){dojo._hasResource["dijit._base.scroll"]=true;dojo.provide("dijit._base.scroll");dijit.scrollIntoView=function(node,pos){dojo.window.scrollIntoView(node,pos);};}if(!dojo._hasResource["dojo.uacss"]){dojo._hasResource["dojo.uacss"]=true;dojo.provide("dojo.uacss");(function(){var d=dojo,html=d.doc.documentElement,ie=d.isIE,_117=d.isOpera,maj=Math.floor,ff=d.isFF,_118=d.boxModel.replace(/-/,""),_119={dj_ie:ie,dj_ie6:maj(ie)==6,dj_ie7:maj(ie)==7,dj_ie8:maj(ie)==8,dj_ie9:maj(ie)==9,dj_quirks:d.isQuirks,dj_iequirks:ie&&d.isQuirks,dj_opera:_117,dj_khtml:d.isKhtml,dj_webkit:d.isWebKit,dj_safari:d.isSafari,dj_chrome:d.isChrome,dj_gecko:d.isMozilla,dj_ff3:maj(ff)==3};_119["dj_"+_118]=true;var _11a="";for(var clz in _119){if(_119[clz]){_11a+=clz+" ";}}html.className=d.trim(html.className+" "+_11a);dojo._loaders.unshift(function(){if(!dojo._isBodyLtr()){var _11b="dj_rtl dijitRtl "+_11a.replace(/ /g,"-rtl ");html.className=d.trim(html.className+" "+_11b);}});})();}if(!dojo._hasResource["dijit._base.sniff"]){dojo._hasResource["dijit._base.sniff"]=true;dojo.provide("dijit._base.sniff");}if(!dojo._hasResource["dijit._base.typematic"]){dojo._hasResource["dijit._base.typematic"]=true;dojo.provide("dijit._base.typematic");dijit.typematic={_fireEventAndReload:function(){this._timer=null;this._callback(++this._count,this._node,this._evt);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(dojo.hitch(this,"_fireEventAndReload"),this._currentTimeout);},trigger:function(evt,_11c,node,_11d,obj,_11e,_11f,_120){if(obj!=this._obj){this.stop();this._initialDelay=_11f||500;this._subsequentDelay=_11e||0.9;this._minDelay=_120||10;this._obj=obj;this._evt=evt;this._node=node;this._currentTimeout=-1;this._count=-1;this._callback=dojo.hitch(_11c,_11d);this._fireEventAndReload();this._evt=dojo.mixin({faux:true},evt);}},stop:function(){if(this._timer){clearTimeout(this._timer);this._timer=null;}if(this._obj){this._callback(-1,this._node,this._evt);this._obj=null;}},addKeyListener:function(node,_121,_122,_123,_124,_125,_126){if(_121.keyCode){_121.charOrCode=_121.keyCode;dojo.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}else{if(_121.charCode){_121.charOrCode=String.fromCharCode(_121.charCode);dojo.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}}return [dojo.connect(node,"onkeypress",this,function(evt){if(evt.charOrCode==_121.charOrCode&&(_121.ctrlKey===undefined||_121.ctrlKey==evt.ctrlKey)&&(_121.altKey===undefined||_121.altKey==evt.altKey)&&(_121.metaKey===undefined||_121.metaKey==(evt.metaKey||false))&&(_121.shiftKey===undefined||_121.shiftKey==evt.shiftKey)){dojo.stopEvent(evt);dijit.typematic.trigger(evt,_122,node,_123,_121,_124,_125,_126);}else{if(dijit.typematic._obj==_121){dijit.typematic.stop();}}}),dojo.connect(node,"onkeyup",this,function(evt){if(dijit.typematic._obj==_121){dijit.typematic.stop();}})];},addMouseListener:function(node,_127,_128,_129,_12a,_12b){var dc=dojo.connect;return [dc(node,"mousedown",this,function(evt){dojo.stopEvent(evt);dijit.typematic.trigger(evt,_127,node,_128,node,_129,_12a,_12b);}),dc(node,"mouseup",this,function(evt){dojo.stopEvent(evt);dijit.typematic.stop();}),dc(node,"mouseout",this,function(evt){dojo.stopEvent(evt);dijit.typematic.stop();}),dc(node,"mousemove",this,function(evt){evt.preventDefault();}),dc(node,"dblclick",this,function(evt){dojo.stopEvent(evt);if(dojo.isIE){dijit.typematic.trigger(evt,_127,node,_128,node,_129,_12a,_12b);setTimeout(dojo.hitch(this,dijit.typematic.stop),50);}})];},addListener:function(_12c,_12d,_12e,_12f,_130,_131,_132,_133){return this.addKeyListener(_12d,_12e,_12f,_130,_131,_132,_133).concat(this.addMouseListener(_12c,_12f,_130,_131,_132,_133));}};}if(!dojo._hasResource["dijit._base.wai"]){dojo._hasResource["dijit._base.wai"]=true;dojo.provide("dijit._base.wai");dijit.wai={onload:function(){var div=dojo.create("div",{id:"a11yTestNode",style:{cssText:"border: 1px solid;"+"border-color:red green;"+"position: absolute;"+"height: 5px;"+"top: -999px;"+"background-image: url(\""+(dojo.config.blankGif||dojo.moduleUrl("dojo","resources/blank.gif"))+"\");"}},dojo.body());var cs=dojo.getComputedStyle(div);if(cs){var _134=cs.backgroundImage;var _135=(cs.borderTopColor==cs.borderRightColor)||(_134!=null&&(_134=="none"||_134=="url(invalid-url:)"));dojo[_135?"addClass":"removeClass"](dojo.body(),"dijit_a11y");if(dojo.isIE){div.outerHTML="";}else{dojo.body().removeChild(div);}}}};if(dojo.isIE||dojo.isMoz){dojo._loaders.unshift(dijit.wai.onload);}dojo.mixin(dijit,{hasWaiRole:function(elem,role){var _136=this.getWaiRole(elem);return role?(_136.indexOf(role)>-1):(_136.length>0);},getWaiRole:function(elem){return dojo.trim((dojo.attr(elem,"role")||"").replace("wairole:",""));},setWaiRole:function(elem,role){dojo.attr(elem,"role",role);},removeWaiRole:function(elem,role){var _137=dojo.attr(elem,"role");if(!_137){return;}if(role){var t=dojo.trim((" "+_137+" ").replace(" "+role+" "," "));dojo.attr(elem,"role",t);}else{elem.removeAttribute("role");}},hasWaiState:function(elem,_138){return elem.hasAttribute?elem.hasAttribute("aria-"+_138):!!elem.getAttribute("aria-"+_138);},getWaiState:function(elem,_139){return elem.getAttribute("aria-"+_139)||"";},setWaiState:function(elem,_13a,_13b){elem.setAttribute("aria-"+_13a,_13b);},removeWaiState:function(elem,_13c){elem.removeAttribute("aria-"+_13c);}});}if(!dojo._hasResource["dijit._base"]){dojo._hasResource["dijit._base"]=true;dojo.provide("dijit._base");}if(!dojo._hasResource["dojo.Stateful"]){dojo._hasResource["dojo.Stateful"]=true;dojo.provide("dojo.Stateful");dojo.declare("dojo.Stateful",null,{postscript:function(_13d){if(_13d){dojo.mixin(this,_13d);}},get:function(name){return this[name];},set:function(name,_13e){if(typeof name==="object"){for(var x in name){this.set(x,name[x]);}return this;}var _13f=this[name];this[name]=_13e;if(this._watchCallbacks){this._watchCallbacks(name,_13f,_13e);}return this;},watch:function(name,_140){var _141=this._watchCallbacks;if(!_141){var self=this;_141=this._watchCallbacks=function(name,_142,_143,_144){var _145=function(_146){if(_146){_146=_146.slice();for(var i=0,l=_146.length;i<l;i++){try{_146[i].call(self,name,_142,_143);}catch(e){console.error(e);}}}};_145(_141["_"+name]);if(!_144){_145(_141["*"]);}};}if(!_140&&typeof name==="function"){_140=name;name="*";}else{name="_"+name;}var _147=_141[name];if(typeof _147!=="object"){_147=_141[name]=[];}_147.push(_140);return {unwatch:function(){_147.splice(dojo.indexOf(_147,_140),1);}};}});}if(!dojo._hasResource["dijit._WidgetBase"]){dojo._hasResource["dijit._WidgetBase"]=true;dojo.provide("dijit._WidgetBase");(function(){dojo.declare("dijit._WidgetBase",dojo.Stateful,{id:"",lang:"",dir:"","class":"",style:"",title:"",tooltip:"",baseClass:"",srcNodeRef:null,domNode:null,containerNode:null,attributeMap:{id:"",dir:"",lang:"","class":"",style:"",title:""},_blankGif:(dojo.config.blankGif||dojo.moduleUrl("dojo","resources/blank.gif")).toString(),postscript:function(_148,_149){this.create(_148,_149);},create:function(_14a,_14b){this.srcNodeRef=dojo.byId(_14b);this._connects=[];this._subscribes=[];if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){this.id=this.srcNodeRef.id;}if(_14a){this.params=_14a;dojo._mixin(this,_14a);}this.postMixInProperties();if(!this.id){this.id=dijit.getUniqueId(this.declaredClass.replace(/\./g,"_"));}dijit.registry.add(this);this.buildRendering();if(this.domNode){this._applyAttributes();var _14c=this.srcNodeRef;if(_14c&&_14c.parentNode&&this.domNode!==_14c){_14c.parentNode.replaceChild(this.domNode,_14c);}}if(this.domNode){this.domNode.setAttribute("widgetId",this.id);}this.postCreate();if(this.srcNodeRef&&!this.srcNodeRef.parentNode){delete this.srcNodeRef;}this._created=true;},_applyAttributes:function(){var _14d=function(attr,_14e){if((_14e.params&&attr in _14e.params)||_14e[attr]){_14e.set(attr,_14e[attr]);}};for(var attr in this.attributeMap){_14d(attr,this);}dojo.forEach(this._getSetterAttributes(),function(a){if(!(a in this.attributeMap)){_14d(a,this);}},this);},_getSetterAttributes:function(){var ctor=this.constructor;if(!ctor._setterAttrs){var r=(ctor._setterAttrs=[]),_14f,_150=ctor.prototype;for(var _151 in _150){if(dojo.isFunction(_150[_151])&&(_14f=_151.match(/^_set([a-zA-Z]*)Attr$/))&&_14f[1]){r.push(_14f[1].charAt(0).toLowerCase()+_14f[1].substr(1));}}}return ctor._setterAttrs;},postMixInProperties:function(){},buildRendering:function(){if(!this.domNode){this.domNode=this.srcNodeRef||dojo.create("div");}if(this.baseClass){var _152=this.baseClass.split(" ");if(!this.isLeftToRight()){_152=_152.concat(dojo.map(_152,function(name){return name+"Rtl";}));}dojo.addClass(this.domNode,_152);}},postCreate:function(){},startup:function(){this._started=true;},destroyRecursive:function(_153){this._beingDestroyed=true;this.destroyDescendants(_153);this.destroy(_153);},destroy:function(_154){this._beingDestroyed=true;this.uninitialize();var d=dojo,dfe=d.forEach,dun=d.unsubscribe;dfe(this._connects,function(_155){dfe(_155,d.disconnect);});dfe(this._subscribes,function(_156){dun(_156);});dfe(this._supportingWidgets||[],function(w){if(w.destroyRecursive){w.destroyRecursive();}else{if(w.destroy){w.destroy();}}});this.destroyRendering(_154);dijit.registry.remove(this.id);this._destroyed=true;},destroyRendering:function(_157){if(this.bgIframe){this.bgIframe.destroy(_157);delete this.bgIframe;}if(this.domNode){if(_157){dojo.removeAttr(this.domNode,"widgetId");}else{dojo.destroy(this.domNode);}delete this.domNode;}if(this.srcNodeRef){if(!_157){dojo.destroy(this.srcNodeRef);}delete this.srcNodeRef;}},destroyDescendants:function(_158){dojo.forEach(this.getChildren(),function(_159){if(_159.destroyRecursive){_159.destroyRecursive(_158);}});},uninitialize:function(){return false;},_setClassAttr:function(_15a){var _15b=this[this.attributeMap["class"]||"domNode"];dojo.replaceClass(_15b,_15a,this["class"]);this._set("class",_15a);},_setStyleAttr:function(_15c){var _15d=this[this.attributeMap.style||"domNode"];if(dojo.isObject(_15c)){dojo.style(_15d,_15c);}else{if(_15d.style.cssText){_15d.style.cssText+="; "+_15c;}else{_15d.style.cssText=_15c;}}this._set("style",_15c);},_attrToDom:function(attr,_15e){var _15f=this.attributeMap[attr];dojo.forEach(dojo.isArray(_15f)?_15f:[_15f],function(_160){var _161=this[_160.node||_160||"domNode"];var type=_160.type||"attribute";switch(type){case "attribute":if(dojo.isFunction(_15e)){_15e=dojo.hitch(this,_15e);}var _162=_160.attribute?_160.attribute:(/^on[A-Z][a-zA-Z]*$/.test(attr)?attr.toLowerCase():attr);dojo.attr(_161,_162,_15e);break;case "innerText":_161.innerHTML="";_161.appendChild(dojo.doc.createTextNode(_15e));break;case "innerHTML":_161.innerHTML=_15e;break;case "class":dojo.replaceClass(_161,_15e,this[attr]);break;}},this);},get:function(name){var _163=this._getAttrNames(name);return this[_163.g]?this[_163.g]():this[name];},set:function(name,_164){if(typeof name==="object"){for(var x in name){this.set(x,name[x]);}return this;}var _165=this._getAttrNames(name);if(this[_165.s]){var _166=this[_165.s].apply(this,Array.prototype.slice.call(arguments,1));}else{if(name in this.attributeMap){this._attrToDom(name,_164);}this._set(name,_164);}return _166||this;},_attrPairNames:{},_getAttrNames:function(name){var apn=this._attrPairNames;if(apn[name]){return apn[name];}var uc=name.charAt(0).toUpperCase()+name.substr(1);return (apn[name]={n:name+"Node",s:"_set"+uc+"Attr",g:"_get"+uc+"Attr"});},_set:function(name,_167){var _168=this[name];this[name]=_167;if(this._watchCallbacks&&this._created&&_167!==_168){this._watchCallbacks(name,_168,_167);}},toString:function(){return "[Widget "+this.declaredClass+", "+(this.id||"NO ID")+"]";},getDescendants:function(){return this.containerNode?dojo.query("[widgetId]",this.containerNode).map(dijit.byNode):[];},getChildren:function(){return this.containerNode?dijit.findWidgets(this.containerNode):[];},connect:function(obj,_169,_16a){var _16b=[dojo._connect(obj,_169,this,_16a)];this._connects.push(_16b);return _16b;},disconnect:function(_16c){for(var i=0;i<this._connects.length;i++){if(this._connects[i]==_16c){dojo.forEach(_16c,dojo.disconnect);this._connects.splice(i,1);return;}}},subscribe:function(_16d,_16e){var _16f=dojo.subscribe(_16d,this,_16e);this._subscribes.push(_16f);return _16f;},unsubscribe:function(_170){for(var i=0;i<this._subscribes.length;i++){if(this._subscribes[i]==_170){dojo.unsubscribe(_170);this._subscribes.splice(i,1);return;}}},isLeftToRight:function(){return this.dir?(this.dir=="ltr"):dojo._isBodyLtr();},placeAt:function(_171,_172){if(_171.declaredClass&&_171.addChild){_171.addChild(this,_172);}else{dojo.place(this.domNode,_171,_172);}return this;}});})();}if(!dojo._hasResource["dijit._Widget"]){dojo._hasResource["dijit._Widget"]=true;dojo.provide("dijit._Widget");dojo.connect(dojo,"_connect",function(_173,_174){if(_173&&dojo.isFunction(_173._onConnect)){_173._onConnect(_174);}});dijit._connectOnUseEventHandler=function(_175){};dijit._lastKeyDownNode=null;if(dojo.isIE){(function(){var _176=function(evt){dijit._lastKeyDownNode=evt.srcElement;};dojo.doc.attachEvent("onkeydown",_176);dojo.addOnWindowUnload(function(){dojo.doc.detachEvent("onkeydown",_176);});})();}else{dojo.doc.addEventListener("keydown",function(evt){dijit._lastKeyDownNode=evt.target;},true);}(function(){dojo.declare("dijit._Widget",dijit._WidgetBase,{_deferredConnects:{onClick:"",onDblClick:"",onKeyDown:"",onKeyPress:"",onKeyUp:"",onMouseMove:"",onMouseDown:"",onMouseOut:"",onMouseOver:"",onMouseLeave:"",onMouseEnter:"",onMouseUp:""},onClick:dijit._connectOnUseEventHandler,onDblClick:dijit._connectOnUseEventHandler,onKeyDown:dijit._connectOnUseEventHandler,onKeyPress:dijit._connectOnUseEventHandler,onKeyUp:dijit._connectOnUseEventHandler,onMouseDown:dijit._connectOnUseEventHandler,onMouseMove:dijit._connectOnUseEventHandler,onMouseOut:dijit._connectOnUseEventHandler,onMouseOver:dijit._connectOnUseEventHandler,onMouseLeave:dijit._connectOnUseEventHandler,onMouseEnter:dijit._connectOnUseEventHandler,onMouseUp:dijit._connectOnUseEventHandler,create:function(_177,_178){this._deferredConnects=dojo.clone(this._deferredConnects);for(var attr in this.attributeMap){delete this._deferredConnects[attr];}for(attr in this._deferredConnects){if(this[attr]!==dijit._connectOnUseEventHandler){delete this._deferredConnects[attr];}}this.inherited(arguments);if(this.domNode){for(attr in this.params){this._onConnect(attr);}}},_onConnect:function(_179){if(_179 in this._deferredConnects){var _17a=this[this._deferredConnects[_179]||"domNode"];this.connect(_17a,_179.toLowerCase(),_179);delete this._deferredConnects[_179];}},focused:false,isFocusable:function(){return this.focus&&(dojo.style(this.domNode,"display")!="none");},onFocus:function(){},onBlur:function(){},_onFocus:function(e){this.onFocus();},_onBlur:function(){this.onBlur();},setAttribute:function(attr,_17b){dojo.deprecated(this.declaredClass+"::setAttribute(attr, value) is deprecated. Use set() instead.","","2.0");this.set(attr,_17b);},attr:function(name,_17c){if(dojo.config.isDebug){var _17d=arguments.callee._ach||(arguments.callee._ach={}),_17e=(arguments.callee.caller||"unknown caller").toString();if(!_17d[_17e]){dojo.deprecated(this.declaredClass+"::attr() is deprecated. Use get() or set() instead, called from "+_17e,"","2.0");_17d[_17e]=true;}}var args=arguments.length;if(args>=2||typeof name==="object"){return this.set.apply(this,arguments);}else{return this.get(name);}},nodesWithKeyClick:["input","button"],connect:function(obj,_17f,_180){var d=dojo,dc=d._connect,_181=this.inherited(arguments,[obj,_17f=="ondijitclick"?"onclick":_17f,_180]);if(_17f=="ondijitclick"){if(d.indexOf(this.nodesWithKeyClick,obj.nodeName.toLowerCase())==-1){var m=d.hitch(this,_180);_181.push(dc(obj,"onkeydown",this,function(e){if((e.keyCode==d.keys.ENTER||e.keyCode==d.keys.SPACE)&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){dijit._lastKeyDownNode=e.target;if(!("openDropDown" in this&&obj==this._buttonNode)){e.preventDefault();}}}),dc(obj,"onkeyup",this,function(e){if((e.keyCode==d.keys.ENTER||e.keyCode==d.keys.SPACE)&&e.target==dijit._lastKeyDownNode&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey){dijit._lastKeyDownNode=null;return m(e);}}));}}return _181;},_onShow:function(){this.onShow();},onShow:function(){},onHide:function(){},onClose:function(){return true;}});})();}if(!dojo._hasResource["dojo.string"]){dojo._hasResource["dojo.string"]=true;dojo.provide("dojo.string");dojo.getObject("string",true,dojo);dojo.string.rep=function(str,num){if(num<=0||!str){return "";}var buf=[];for(;;){if(num&1){buf.push(str);}if(!(num>>=1)){break;}str+=str;}return buf.join("");};dojo.string.pad=function(text,size,ch,end){if(!ch){ch="0";}var out=String(text),pad=dojo.string.rep(ch,Math.ceil((size-out.length)/ch.length));return end?out+pad:pad+out;};dojo.string.substitute=function(_182,map,_183,_184){_184=_184||dojo.global;_183=_183?dojo.hitch(_184,_183):function(v){return v;};return _182.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_185,key,_186){var _187=dojo.getObject(key,false,map);if(_186){_187=dojo.getObject(_186,false,_184).call(_184,_187,key);}return _183(_187,key).toString();});};dojo.string.trim=String.prototype.trim?dojo.trim:function(str){str=str.replace(/^\s+/,"");for(var i=str.length-1;i>=0;i--){if(/\S/.test(str.charAt(i))){str=str.substring(0,i+1);break;}}return str;};}if(!dojo._hasResource["dojo.cache"]){dojo._hasResource["dojo.cache"]=true;dojo.provide("dojo.cache");var cache={};dojo.cache=function(_188,url,_189){if(typeof _188=="string"){var _18a=dojo.moduleUrl(_188,url);}else{_18a=_188;_189=url;}var key=_18a.toString();var val=_189;if(_189!=undefined&&!dojo.isString(_189)){val=("value" in _189?_189.value:undefined);}var _18b=_189&&_189.sanitize?true:false;if(typeof val=="string"){val=cache[key]=_18b?dojo.cache._sanitize(val):val;}else{if(val===null){delete cache[key];}else{if(!(key in cache)){val=dojo._getText(key);cache[key]=_18b?dojo.cache._sanitize(val):val;}val=cache[key];}}return val;};dojo.cache._sanitize=function(val){if(val){val=val.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");var _18c=val.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_18c){val=_18c[1];}}else{val="";}return val;};}if(!dojo._hasResource["dijit._Templated"]){dojo._hasResource["dijit._Templated"]=true;dojo.provide("dijit._Templated");dojo.declare("dijit._Templated",null,{templateString:null,templatePath:null,widgetsInTemplate:false,_skipNodeCache:false,_earlyTemplatedStartup:false,constructor:function(){this._attachPoints=[];this._attachEvents=[];},_stringRepl:function(tmpl){var _18d=this.declaredClass,_18e=this;return dojo.string.substitute(tmpl,this,function(_18f,key){if(key.charAt(0)=="!"){_18f=dojo.getObject(key.substr(1),false,_18e);}if(typeof _18f=="undefined"){throw new Error(_18d+" template:"+key);}if(_18f==null){return "";}return key.charAt(0)=="!"?_18f:_18f.toString().replace(/"/g,""");},this);},buildRendering:function(){var _190=dijit._Templated.getCachedTemplate(this.templatePath,this.templateString,this._skipNodeCache);var node;if(dojo.isString(_190)){node=dojo._toDom(this._stringRepl(_190));if(node.nodeType!=1){throw new Error("Invalid template: "+_190);}}else{node=_190.cloneNode(true);}this.domNode=node;this.inherited(arguments);this._attachTemplateNodes(node);if(this.widgetsInTemplate){var cw=(this._startupWidgets=dojo.parser.parse(node,{noStart:!this._earlyTemplatedStartup,template:true,inherited:{dir:this.dir,lang:this.lang},propsThis:this,scope:"dojo"}));this._supportingWidgets=dijit.findWidgets(node);this._attachTemplateNodes(cw,function(n,p){return n[p];});}this._fillContent(this.srcNodeRef);},_fillContent:function(_191){var dest=this.containerNode;if(_191&&dest){while(_191.hasChildNodes()){dest.appendChild(_191.firstChild);}}},_attachTemplateNodes:function(_192,_193){_193=_193||function(n,p){return n.getAttribute(p);};var _194=dojo.isArray(_192)?_192:(_192.all||_192.getElementsByTagName("*"));var x=dojo.isArray(_192)?0:-1;for(;x<_194.length;x++){var _195=(x==-1)?_192:_194[x];if(this.widgetsInTemplate&&(_193(_195,"dojoType")||_193(_195,"data-dojo-type"))){continue;}var _196=_193(_195,"dojoAttachPoint")||_193(_195,"data-dojo-attach-point");if(_196){var _197,_198=_196.split(/\s*,\s*/);while((_197=_198.shift())){if(dojo.isArray(this[_197])){this[_197].push(_195);}else{this[_197]=_195;}this._attachPoints.push(_197);}}var _199=_193(_195,"dojoAttachEvent")||_193(_195,"data-dojo-attach-event");if(_199){var _19a,_19b=_199.split(/\s*,\s*/);var trim=dojo.trim;while((_19a=_19b.shift())){if(_19a){var _19c=null;if(_19a.indexOf(":")!=-1){var _19d=_19a.split(":");_19a=trim(_19d[0]);_19c=trim(_19d[1]);}else{_19a=trim(_19a);}if(!_19c){_19c=_19a;}this._attachEvents.push(this.connect(_195,_19a,_19c));}}}var role=_193(_195,"waiRole");if(role){dijit.setWaiRole(_195,role);}var _19e=_193(_195,"waiState");if(_19e){dojo.forEach(_19e.split(/\s*,\s*/),function(_19f){if(_19f.indexOf("-")!=-1){var pair=_19f.split("-");dijit.setWaiState(_195,pair[0],pair[1]);}});}}},startup:function(){dojo.forEach(this._startupWidgets,function(w){if(w&&!w._started&&w.startup){w.startup();}});this.inherited(arguments);},destroyRendering:function(){dojo.forEach(this._attachPoints,function(_1a0){delete this[_1a0];},this);this._attachPoints=[];dojo.forEach(this._attachEvents,this.disconnect,this);this._attachEvents=[];this.inherited(arguments);}});dijit._Templated._templateCache={};dijit._Templated.getCachedTemplate=function(_1a1,_1a2,_1a3){var _1a4=dijit._Templated._templateCache;var key=_1a2||_1a1;var _1a5=_1a4[key];if(_1a5){try{if(!_1a5.ownerDocument||_1a5.ownerDocument==dojo.doc){return _1a5;}}catch(e){}dojo.destroy(_1a5);}if(!_1a2){_1a2=dojo.cache(_1a1,{sanitize:true});}_1a2=dojo.string.trim(_1a2);if(_1a3||_1a2.match(/\$\{([^\}]+)\}/g)){return (_1a4[key]=_1a2);}else{var node=dojo._toDom(_1a2);if(node.nodeType!=1){throw new Error("Invalid template: "+_1a2);}return (_1a4[key]=node);}};if(dojo.isIE){dojo.addOnWindowUnload(function(){var _1a6=dijit._Templated._templateCache;for(var key in _1a6){var _1a7=_1a6[key];if(typeof _1a7=="object"){dojo.destroy(_1a7);}delete _1a6[key];}});}dojo.extend(dijit._Widget,{dojoAttachEvent:"",dojoAttachPoint:"",waiRole:"",waiState:""});}if(!dojo._hasResource["dijit._Container"]){dojo._hasResource["dijit._Container"]=true;dojo.provide("dijit._Container");dojo.declare("dijit._Container",null,{isContainer:true,buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}},addChild:function(_1a8,_1a9){var _1aa=this.containerNode;if(_1a9&&typeof _1a9=="number"){var _1ab=this.getChildren();if(_1ab&&_1ab.length>=_1a9){_1aa=_1ab[_1a9-1].domNode;_1a9="after";}}dojo.place(_1a8.domNode,_1aa,_1a9);if(this._started&&!_1a8._started){_1a8.startup();}},removeChild:function(_1ac){if(typeof _1ac=="number"){_1ac=this.getChildren()[_1ac];}if(_1ac){var node=_1ac.domNode;if(node&&node.parentNode){node.parentNode.removeChild(node);}}},hasChildren:function(){return this.getChildren().length>0;},destroyDescendants:function(_1ad){dojo.forEach(this.getChildren(),function(_1ae){_1ae.destroyRecursive(_1ad);});},_getSiblingOfChild:function(_1af,dir){var node=_1af.domNode,_1b0=(dir>0?"nextSibling":"previousSibling");do{node=node[_1b0];}while(node&&(node.nodeType!=1||!dijit.byNode(node)));return node&&dijit.byNode(node);},getIndexOfChild:function(_1b1){return dojo.indexOf(this.getChildren(),_1b1);},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_1b2){_1b2.startup();});this.inherited(arguments);}});}if(!dojo._hasResource["dijit._Contained"]){dojo._hasResource["dijit._Contained"]=true;dojo.provide("dijit._Contained");dojo.declare("dijit._Contained",null,{getParent:function(){var _1b3=dijit.getEnclosingWidget(this.domNode.parentNode);return _1b3&&_1b3.isContainer?_1b3:null;},_getSibling:function(_1b4){var node=this.domNode;do{node=node[_1b4+"Sibling"];}while(node&&node.nodeType!=1);return node&&dijit.byNode(node);},getPreviousSibling:function(){return this._getSibling("previous");},getNextSibling:function(){return this._getSibling("next");},getIndexInParent:function(){var p=this.getParent();if(!p||!p.getIndexOfChild){return -1;}return p.getIndexOfChild(this);}});}if(!dojo._hasResource["dijit.layout._LayoutWidget"]){dojo._hasResource["dijit.layout._LayoutWidget"]=true;dojo.provide("dijit.layout._LayoutWidget");dojo.declare("dijit.layout._LayoutWidget",[dijit._Widget,dijit._Container,dijit._Contained],{baseClass:"dijitLayoutContainer",isLayoutContainer:true,buildRendering:function(){this.inherited(arguments);dojo.addClass(this.domNode,"dijitContainer");},startup:function(){if(this._started){return;}this.inherited(arguments);var _1b5=this.getParent&&this.getParent();if(!(_1b5&&_1b5.isLayoutContainer)){this.resize();this.connect(dojo.isIE?this.domNode:dojo.global,"onresize",function(){this.resize();});}},resize:function(_1b6,_1b7){var node=this.domNode;if(_1b6){dojo.marginBox(node,_1b6);if(_1b6.t){node.style.top=_1b6.t+"px";}if(_1b6.l){node.style.left=_1b6.l+"px";}}var mb=_1b7||{};dojo.mixin(mb,_1b6||{});if(!("h" in mb)||!("w" in mb)){mb=dojo.mixin(dojo.marginBox(node),mb);}var cs=dojo.getComputedStyle(node);var me=dojo._getMarginExtents(node,cs);var be=dojo._getBorderExtents(node,cs);var bb=(this._borderBox={w:mb.w-(me.w+be.w),h:mb.h-(me.h+be.h)});var pe=dojo._getPadExtents(node,cs);this._contentBox={l:dojo._toPixelValue(node,cs.paddingLeft),t:dojo._toPixelValue(node,cs.paddingTop),w:bb.w-pe.w,h:bb.h-pe.h};this.layout();},layout:function(){},_setupChild:function(_1b8){var cls=this.baseClass+"-child "+(_1b8.baseClass?this.baseClass+"-"+_1b8.baseClass:"");dojo.addClass(_1b8.domNode,cls);},addChild:function(_1b9,_1ba){this.inherited(arguments);if(this._started){this._setupChild(_1b9);}},removeChild:function(_1bb){var cls=this.baseClass+"-child"+(_1bb.baseClass?" "+this.baseClass+"-"+_1bb.baseClass:"");dojo.removeClass(_1bb.domNode,cls);this.inherited(arguments);}});dijit.layout.marginBox2contentBox=function(node,mb){var cs=dojo.getComputedStyle(node);var me=dojo._getMarginExtents(node,cs);var pb=dojo._getPadBorderExtents(node,cs);return {l:dojo._toPixelValue(node,cs.paddingLeft),t:dojo._toPixelValue(node,cs.paddingTop),w:mb.w-(me.w+pb.w),h:mb.h-(me.h+pb.h)};};(function(){var _1bc=function(word){return word.substring(0,1).toUpperCase()+word.substring(1);};var size=function(_1bd,dim){var _1be=_1bd.resize?_1bd.resize(dim):dojo.marginBox(_1bd.domNode,dim);if(_1be){dojo.mixin(_1bd,_1be);}else{dojo.mixin(_1bd,dojo.marginBox(_1bd.domNode));dojo.mixin(_1bd,dim);}};dijit.layout.layoutChildren=function(_1bf,dim,_1c0,_1c1,_1c2){dim=dojo.mixin({},dim);dojo.addClass(_1bf,"dijitLayoutContainer");_1c0=dojo.filter(_1c0,function(item){return item.region!="center"&&item.layoutAlign!="client";}).concat(dojo.filter(_1c0,function(item){return item.region=="center"||item.layoutAlign=="client";}));dojo.forEach(_1c0,function(_1c3){var elm=_1c3.domNode,pos=(_1c3.region||_1c3.layoutAlign);var _1c4=elm.style;_1c4.left=dim.l+"px";_1c4.top=dim.t+"px";_1c4.position="absolute";dojo.addClass(elm,"dijitAlign"+_1bc(pos));var _1c5={};if(_1c1&&_1c1==_1c3.id){_1c5[_1c3.region=="top"||_1c3.region=="bottom"?"h":"w"]=_1c2;}if(pos=="top"||pos=="bottom"){_1c5.w=dim.w;size(_1c3,_1c5);dim.h-=_1c3.h;if(pos=="top"){dim.t+=_1c3.h;}else{_1c4.top=dim.t+dim.h+"px";}}else{if(pos=="left"||pos=="right"){_1c5.h=dim.h;size(_1c3,_1c5);dim.w-=_1c3.w;if(pos=="left"){dim.l+=_1c3.w;}else{_1c4.left=dim.l+dim.w+"px";}}else{if(pos=="client"||pos=="center"){size(_1c3,dim);}}}});};})();}if(!dojo._hasResource["dijit._CssStateMixin"]){dojo._hasResource["dijit._CssStateMixin"]=true;dojo.provide("dijit._CssStateMixin");dojo.declare("dijit._CssStateMixin",[],{cssStateNodes:{},hovering:false,active:false,_applyAttributes:function(){this.inherited(arguments);dojo.forEach(["onmouseenter","onmouseleave","onmousedown"],function(e){this.connect(this.domNode,e,"_cssMouseEvent");},this);dojo.forEach(["disabled","readOnly","checked","selected","focused","state","hovering","active"],function(attr){this.watch(attr,dojo.hitch(this,"_setStateClass"));},this);for(var ap in this.cssStateNodes){this._trackMouseState(this[ap],this.cssStateNodes[ap]);}this._setStateClass();},_cssMouseEvent:function(_1c6){if(!this.disabled){switch(_1c6.type){case "mouseenter":case "mouseover":this._set("hovering",true);this._set("active",this._mouseDown);break;case "mouseleave":case "mouseout":this._set("hovering",false);this._set("active",false);break;case "mousedown":this._set("active",true);this._mouseDown=true;var _1c7=this.connect(dojo.body(),"onmouseup",function(){this._mouseDown=false;this._set("active",false);this.disconnect(_1c7);});break;}}},_setStateClass:function(){var _1c8=this.baseClass.split(" ");function _1c9(_1ca){_1c8=_1c8.concat(dojo.map(_1c8,function(c){return c+_1ca;}),"dijit"+_1ca);};if(!this.isLeftToRight()){_1c9("Rtl");}if(this.checked){_1c9("Checked");}if(this.state){_1c9(this.state);}if(this.selected){_1c9("Selected");}if(this.disabled){_1c9("Disabled");}else{if(this.readOnly){_1c9("ReadOnly");}else{if(this.active){_1c9("Active");}else{if(this.hovering){_1c9("Hover");}}}}if(this._focused){_1c9("Focused");}var tn=this.stateNode||this.domNode,_1cb={};dojo.forEach(tn.className.split(" "),function(c){_1cb[c]=true;});if("_stateClasses" in this){dojo.forEach(this._stateClasses,function(c){delete _1cb[c];});}dojo.forEach(_1c8,function(c){_1cb[c]=true;});var _1cc=[];for(var c in _1cb){_1cc.push(c);}tn.className=_1cc.join(" ");this._stateClasses=_1c8;},_trackMouseState:function(node,_1cd){var _1ce=false,_1cf=false,_1d0=false;var self=this,cn=dojo.hitch(this,"connect",node);function _1d1(){var _1d2=("disabled" in self&&self.disabled)||("readonly" in self&&self.readonly);dojo.toggleClass(node,_1cd+"Hover",_1ce&&!_1cf&&!_1d2);dojo.toggleClass(node,_1cd+"Active",_1cf&&!_1d2);dojo.toggleClass(node,_1cd+"Focused",_1d0&&!_1d2);};cn("onmouseenter",function(){_1ce=true;_1d1();});cn("onmouseleave",function(){_1ce=false;_1cf=false;_1d1();});cn("onmousedown",function(){_1cf=true;_1d1();});cn("onmouseup",function(){_1cf=false;_1d1();});cn("onfocus",function(){_1d0=true;_1d1();});cn("onblur",function(){_1d0=false;_1d1();});this.watch("disabled",_1d1);this.watch("readOnly",_1d1);}});}if(!dojo._hasResource["dijit.form._FormWidget"]){dojo._hasResource["dijit.form._FormWidget"]=true;dojo.provide("dijit.form._FormWidget");dojo.declare("dijit.form._FormWidget",[dijit._Widget,dijit._Templated,dijit._CssStateMixin],{name:"",alt:"",value:"",type:"text",tabIndex:"0",disabled:false,intermediateChanges:false,scrollOnFocus:true,attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{value:"focusNode",id:"focusNode",tabIndex:"focusNode",alt:"focusNode",title:"focusNode"}),postMixInProperties:function(){this.nameAttrSetting=this.name?("name=\""+this.name.replace(/'/g,""")+"\""):"";this.inherited(arguments);},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onmousedown","_onMouseDown");},_setDisabledAttr:function(_1d3){this._set("disabled",_1d3);dojo.attr(this.focusNode,"disabled",_1d3);if(this.valueNode){dojo.attr(this.valueNode,"disabled",_1d3);}dijit.setWaiState(this.focusNode,"disabled",_1d3);if(_1d3){this._set("hovering",false);this._set("active",false);var _1d4="tabIndex" in this.attributeMap?this.attributeMap.tabIndex:"focusNode";dojo.forEach(dojo.isArray(_1d4)?_1d4:[_1d4],function(_1d5){var node=this[_1d5];if(dojo.isWebKit||dijit.hasDefaultTabStop(node)){node.setAttribute("tabIndex","-1");}else{node.removeAttribute("tabIndex");}},this);}else{if(this.tabIndex!=""){this.focusNode.setAttribute("tabIndex",this.tabIndex);}}},setDisabled:function(_1d6){dojo.deprecated("setDisabled("+_1d6+") is deprecated. Use set('disabled',"+_1d6+") instead.","","2.0");this.set("disabled",_1d6);},_onFocus:function(e){if(this.scrollOnFocus){dojo.window.scrollIntoView(this.domNode);}this.inherited(arguments);},isFocusable:function(){return !this.disabled&&this.focusNode&&(dojo.style(this.domNode,"display")!="none");},focus:function(){if(!this.disabled){dijit.focus(this.focusNode);}},compare:function(val1,val2){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(_1d7){},_onChangeActive:false,_handleOnChange:function(_1d8,_1d9){if(this._lastValueReported==undefined&&(_1d9===null||!this._onChangeActive)){this._resetValue=this._lastValueReported=_1d8;}this._pendingOnChange=this._pendingOnChange||(typeof _1d8!=typeof this._lastValueReported)||(this.compare(_1d8,this._lastValueReported)!=0);if((this.intermediateChanges||_1d9||_1d9===undefined)&&this._pendingOnChange){this._lastValueReported=_1d8;this._pendingOnChange=false;if(this._onChangeActive){if(this._onChangeHandle){clearTimeout(this._onChangeHandle);}this._onChangeHandle=setTimeout(dojo.hitch(this,function(){this._onChangeHandle=null;this.onChange(_1d8);}),0);}}},create:function(){this.inherited(arguments);this._onChangeActive=true;},destroy:function(){if(this._onChangeHandle){clearTimeout(this._onChangeHandle);this.onChange(this._lastValueReported);}this.inherited(arguments);},setValue:function(_1da){dojo.deprecated("dijit.form._FormWidget:setValue("+_1da+") is deprecated. Use set('value',"+_1da+") instead.","","2.0");this.set("value",_1da);},getValue:function(){dojo.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},_onMouseDown:function(e){if(!e.ctrlKey&&dojo.mouseButtons.isLeft(e)&&this.isFocusable()){var _1db=this.connect(dojo.body(),"onmouseup",function(){if(this.isFocusable()){this.focus();}this.disconnect(_1db);});}}});dojo.declare("dijit.form._FormValueWidget",dijit.form._FormWidget,{readOnly:false,attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{value:"",readOnly:"focusNode"}),_setReadOnlyAttr:function(_1dc){dojo.attr(this.focusNode,"readOnly",_1dc);dijit.setWaiState(this.focusNode,"readonly",_1dc);this._set("readOnly",_1dc);},postCreate:function(){this.inherited(arguments);if(dojo.isIE<9||(dojo.isIE&&dojo.isQuirks)){this.connect(this.focusNode||this.domNode,"onkeydown",this._onKeyDown);}if(this._resetValue===undefined){this._lastValueReported=this._resetValue=this.value;}},_setValueAttr:function(_1dd,_1de){this._handleOnChange(_1dd,_1de);},_handleOnChange:function(_1df,_1e0){this._set("value",_1df);this.inherited(arguments);},undo:function(){this._setValueAttr(this._lastValueReported,false);},reset:function(){this._hasBeenBlurred=false;this._setValueAttr(this._resetValue,true);},_onKeyDown:function(e){if(e.keyCode==dojo.keys.ESCAPE&&!(e.ctrlKey||e.altKey||e.metaKey)){var te;if(dojo.isIE){e.preventDefault();te=document.createEventObject();te.keyCode=dojo.keys.ESCAPE;te.shiftKey=e.shiftKey;e.srcElement.fireEvent("onkeypress",te);}}},_layoutHackIE7:function(){if(dojo.isIE==7){var _1e1=this.domNode;var _1e2=_1e1.parentNode;var _1e3=_1e1.firstChild||_1e1;var _1e4=_1e3.style.filter;var _1e5=this;while(_1e2&&_1e2.clientHeight==0){(function ping(){var _1e6=_1e5.connect(_1e2,"onscroll",function(e){_1e5.disconnect(_1e6);_1e3.style.filter=(new Date()).getMilliseconds();setTimeout(function(){_1e3.style.filter=_1e4;},0);});})();_1e2=_1e2.parentNode;}}}});}if(!dojo._hasResource["dijit.dijit"]){dojo._hasResource["dijit.dijit"]=true;dojo.provide("dijit.dijit");}if(!dojo._hasResource["dojo.fx.Toggler"]){dojo._hasResource["dojo.fx.Toggler"]=true;dojo.provide("dojo.fx.Toggler");dojo.declare("dojo.fx.Toggler",null,{node:null,showFunc:dojo.fadeIn,hideFunc:dojo.fadeOut,showDuration:200,hideDuration:200,constructor:function(args){var _1e7=this;dojo.mixin(_1e7,args);_1e7.node=args.node;_1e7._showArgs=dojo.mixin({},args);_1e7._showArgs.node=_1e7.node;_1e7._showArgs.duration=_1e7.showDuration;_1e7.showAnim=_1e7.showFunc(_1e7._showArgs);_1e7._hideArgs=dojo.mixin({},args);_1e7._hideArgs.node=_1e7.node;_1e7._hideArgs.duration=_1e7.hideDuration;_1e7.hideAnim=_1e7.hideFunc(_1e7._hideArgs);dojo.connect(_1e7.showAnim,"beforeBegin",dojo.hitch(_1e7.hideAnim,"stop",true));dojo.connect(_1e7.hideAnim,"beforeBegin",dojo.hitch(_1e7.showAnim,"stop",true));},show:function(_1e8){return this.showAnim.play(_1e8||0);},hide:function(_1e9){return this.hideAnim.play(_1e9||0);}});}if(!dojo._hasResource["dojo.fx"]){dojo._hasResource["dojo.fx"]=true;dojo.provide("dojo.fx");(function(){var d=dojo,_1ea={_fire:function(evt,args){if(this[evt]){this[evt].apply(this,args||[]);}return this;}};var _1eb=function(_1ec){this._index=-1;this._animations=_1ec||[];this._current=this._onAnimateCtx=this._onEndCtx=null;this.duration=0;d.forEach(this._animations,function(a){this.duration+=a.duration;if(a.delay){this.duration+=a.delay;}},this);};d.extend(_1eb,{_onAnimate:function(){this._fire("onAnimate",arguments);},_onEnd:function(){d.disconnect(this._onAnimateCtx);d.disconnect(this._onEndCtx);this._onAnimateCtx=this._onEndCtx=null;if(this._index+1==this._animations.length){this._fire("onEnd");}else{this._current=this._animations[++this._index];this._onAnimateCtx=d.connect(this._current,"onAnimate",this,"_onAnimate");this._onEndCtx=d.connect(this._current,"onEnd",this,"_onEnd");this._current.play(0,true);}},play:function(_1ed,_1ee){if(!this._current){this._current=this._animations[this._index=0];}if(!_1ee&&this._current.status()=="playing"){return this;}var _1ef=d.connect(this._current,"beforeBegin",this,function(){this._fire("beforeBegin");}),_1f0=d.connect(this._current,"onBegin",this,function(arg){this._fire("onBegin",arguments);}),_1f1=d.connect(this._current,"onPlay",this,function(arg){this._fire("onPlay",arguments);d.disconnect(_1ef);d.disconnect(_1f0);d.disconnect(_1f1);});if(this._onAnimateCtx){d.disconnect(this._onAnimateCtx);}this._onAnimateCtx=d.connect(this._current,"onAnimate",this,"_onAnimate");if(this._onEndCtx){d.disconnect(this._onEndCtx);}this._onEndCtx=d.connect(this._current,"onEnd",this,"_onEnd");this._current.play.apply(this._current,arguments);return this;},pause:function(){if(this._current){var e=d.connect(this._current,"onPause",this,function(arg){this._fire("onPause",arguments);d.disconnect(e);});this._current.pause();}return this;},gotoPercent:function(_1f2,_1f3){this.pause();var _1f4=this.duration*_1f2;this._current=null;d.some(this._animations,function(a){if(a.duration<=_1f4){this._current=a;return true;}_1f4-=a.duration;return false;});if(this._current){this._current.gotoPercent(_1f4/this._current.duration,_1f3);}return this;},stop:function(_1f5){if(this._current){if(_1f5){for(;this._index+1<this._animations.length;++this._index){this._animations[this._index].stop(true);}this._current=this._animations[this._index];}var e=d.connect(this._current,"onStop",this,function(arg){this._fire("onStop",arguments);d.disconnect(e);});this._current.stop();}return this;},status:function(){return this._current?this._current.status():"stopped";},destroy:function(){if(this._onAnimateCtx){d.disconnect(this._onAnimateCtx);}if(this._onEndCtx){d.disconnect(this._onEndCtx);}}});d.extend(_1eb,_1ea);dojo.fx.chain=function(_1f6){return new _1eb(_1f6);};var _1f7=function(_1f8){this._animations=_1f8||[];this._connects=[];this._finished=0;this.duration=0;d.forEach(_1f8,function(a){var _1f9=a.duration;if(a.delay){_1f9+=a.delay;}if(this.duration<_1f9){this.duration=_1f9;}this._connects.push(d.connect(a,"onEnd",this,"_onEnd"));},this);this._pseudoAnimation=new d.Animation({curve:[0,1],duration:this.duration});var self=this;d.forEach(["beforeBegin","onBegin","onPlay","onAnimate","onPause","onStop","onEnd"],function(evt){self._connects.push(d.connect(self._pseudoAnimation,evt,function(){self._fire(evt,arguments);}));});};d.extend(_1f7,{_doAction:function(_1fa,args){d.forEach(this._animations,function(a){a[_1fa].apply(a,args);});return this;},_onEnd:function(){if(++this._finished>this._animations.length){this._fire("onEnd");}},_call:function(_1fb,args){var t=this._pseudoAnimation;t[_1fb].apply(t,args);},play:function(_1fc,_1fd){this._finished=0;this._doAction("play",arguments);this._call("play",arguments);return this;},pause:function(){this._doAction("pause",arguments);this._call("pause",arguments);return this;},gotoPercent:function(_1fe,_1ff){var ms=this.duration*_1fe;d.forEach(this._animations,function(a){a.gotoPercent(a.duration<ms?1:(ms/a.duration),_1ff);});this._call("gotoPercent",arguments);return this;},stop:function(_200){this._doAction("stop",arguments);this._call("stop",arguments);return this;},status:function(){return this._pseudoAnimation.status();},destroy:function(){d.forEach(this._connects,dojo.disconnect);}});d.extend(_1f7,_1ea);dojo.fx.combine=function(_201){return new _1f7(_201);};dojo.fx.wipeIn=function(args){var node=args.node=d.byId(args.node),s=node.style,o;var anim=d.animateProperty(d.mixin({properties:{height:{start:function(){o=s.overflow;s.overflow="hidden";if(s.visibility=="hidden"||s.display=="none"){s.height="1px";s.display="";s.visibility="";return 1;}else{var _202=d.style(node,"height");return Math.max(_202,1);}},end:function(){return node.scrollHeight;}}}},args));d.connect(anim,"onEnd",function(){s.height="auto";s.overflow=o;});return anim;};dojo.fx.wipeOut=function(args){var node=args.node=d.byId(args.node),s=node.style,o;var anim=d.animateProperty(d.mixin({properties:{height:{end:1}}},args));d.connect(anim,"beforeBegin",function(){o=s.overflow;s.overflow="hidden";s.display="";});d.connect(anim,"onEnd",function(){s.overflow=o;s.height="auto";s.display="none";});return anim;};dojo.fx.slideTo=function(args){var node=args.node=d.byId(args.node),top=null,left=null;var init=(function(n){return function(){var cs=d.getComputedStyle(n);var pos=cs.position;top=(pos=="absolute"?n.offsetTop:parseInt(cs.top)||0);left=(pos=="absolute"?n.offsetLeft:parseInt(cs.left)||0);if(pos!="absolute"&&pos!="relative"){var ret=d.position(n,true);top=ret.y;left=ret.x;n.style.position="absolute";n.style.top=top+"px";n.style.left=left+"px";}};})(node);init();var anim=d.animateProperty(d.mixin({properties:{top:args.top||0,left:args.left||0}},args));d.connect(anim,"beforeBegin",anim,init);return anim;};})();}if(!dojo._hasResource["dojo.NodeList-fx"]){dojo._hasResource["dojo.NodeList-fx"]=true;dojo.provide("dojo.NodeList-fx");dojo.extend(dojo.NodeList,{_anim:function(obj,_203,args){args=args||{};var a=dojo.fx.combine(this.map(function(item){var _204={node:item};dojo.mixin(_204,args);return obj[_203](_204);}));return args.auto?a.play()&&this:a;},wipeIn:function(args){return this._anim(dojo.fx,"wipeIn",args);},wipeOut:function(args){return this._anim(dojo.fx,"wipeOut",args);},slideTo:function(args){return this._anim(dojo.fx,"slideTo",args);},fadeIn:function(args){return this._anim(dojo,"fadeIn",args);},fadeOut:function(args){return this._anim(dojo,"fadeOut",args);},animateProperty:function(args){return this._anim(dojo,"animateProperty",args);},anim:function(_205,_206,_207,_208,_209){var _20a=dojo.fx.combine(this.map(function(item){return dojo.animateProperty({node:item,properties:_205,duration:_206||350,easing:_207});}));if(_208){dojo.connect(_20a,"onEnd",_208);}return _20a.play(_209||0);}});}if(!dojo._hasResource["dojo.colors"]){dojo._hasResource["dojo.colors"]=true;dojo.provide("dojo.colors");dojo.getObject("colors",true,dojo);(function(){var _20b=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(_20c,obj){var m=_20c.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);if(m){var c=m[2].split(/\s*,\s*/),l=c.length,t=m[1],a;if((t=="rgb"&&l==3)||(t=="rgba"&&l==4)){var r=c[0];if(r.charAt(r.length-1)=="%"){a=dojo.map(c,function(x){return parseFloat(x)*2.56;});if(l==4){a[3]=c[3];}return dojo.colorFromArray(a,obj);}return dojo.colorFromArray(c,obj);}if((t=="hsl"&&l==3)||(t=="hsla"&&l==4)){var H=((parseFloat(c[0])%360)+360)%360/360,S=parseFloat(c[1])/100,L=parseFloat(c[2])/100,m2=L<=0.5?L*(S+1):L+S-L*S,m1=2*L-m2;a=[_20b(m1,m2,H+1/3)*256,_20b(m1,m2,H)*256,_20b(m1,m2,H-1/3)*256,1];if(l==4){a[3]=c[3];}return dojo.colorFromArray(a,obj);}}return null;};var _20d=function(c,low,high){c=Number(c);return isNaN(c)?high:c<low?low:c>high?high:c;};dojo.Color.prototype.sanitize=function(){var t=this;t.r=Math.round(_20d(t.r,0,255));t.g=Math.round(_20d(t.g,0,255));t.b=Math.round(_20d(t.b,0,255));t.a=_20d(t.a,0,1);return this;};})();dojo.colors.makeGrey=function(g,a){return dojo.colorFromArray([g,g,g,a]);};dojo.mixin(dojo.Color.named,{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]});}if(!dojo._hasResource["dojo.i18n"]){dojo._hasResource["dojo.i18n"]=true;dojo.provide("dojo.i18n");dojo.getObject("i18n",true,dojo);dojo.i18n.getLocalization=dojo.i18n.getLocalization||function(_20e,_20f,_210){_210=dojo.i18n.normalizeLocale(_210);var _211=_210.split("-");var _212=[_20e,"nls",_20f].join(".");var _213=dojo._loadedModules[_212];if(_213){var _214;for(var i=_211.length;i>0;i--){var loc=_211.slice(0,i).join("_");if(_213[loc]){_214=_213[loc];break;}}if(!_214){_214=_213.ROOT;}if(_214){var _215=function(){};_215.prototype=_214;return new _215();}}throw new Error("Bundle not found: "+_20f+" in "+_20e+" , locale="+_210);};dojo.i18n.normalizeLocale=function(_216){var _217=_216?_216.toLowerCase():dojo.locale;if(_217=="root"){_217="ROOT";}return _217;};dojo.i18n._requireLocalization=function(_218,_219,_21a,_21b){var _21c=dojo.i18n.normalizeLocale(_21a);var _21d=[_218,"nls",_219].join(".");var _21e="";if(_21b){var _21f=_21b.split(",");for(var i=0;i<_21f.length;i++){if(_21c["indexOf"](_21f[i])==0){if(_21f[i].length>_21e.length){_21e=_21f[i];}}}if(!_21e){_21e="ROOT";}}var _220=_21b?_21e:_21c;var _221=dojo._loadedModules[_21d];var _222=null;if(_221){if(dojo.config.localizationComplete&&_221._built){return;}var _223=_220.replace(/-/g,"_");var _224=_21d+"."+_223;_222=dojo._loadedModules[_224];}if(!_222){_221=dojo["provide"](_21d);var syms=dojo._getModuleSymbols(_218);var _225=syms.concat("nls").join("/");var _226;dojo.i18n._searchLocalePath(_220,_21b,function(loc){var _227=loc.replace(/-/g,"_");var _228=_21d+"."+_227;var _229=false;if(!dojo._loadedModules[_228]){dojo["provide"](_228);var _22a=[_225];if(loc!="ROOT"){_22a.push(loc);}_22a.push(_219);var _22b=_22a.join("/")+".js";_229=dojo._loadPath(_22b,null,function(hash){hash=hash.root||hash;var _22c=function(){};_22c.prototype=_226;_221[_227]=new _22c();for(var j in hash){_221[_227][j]=hash[j];}});}else{_229=true;}if(_229&&_221[_227]){_226=_221[_227];}else{_221[_227]=_226;}if(_21b){return true;}});}if(_21b&&_21c!=_21e){_221[_21c.replace(/-/g,"_")]=_221[_21e.replace(/-/g,"_")];}};(function(){var _22d=dojo.config.extraLocale;if(_22d){if(!_22d instanceof Array){_22d=[_22d];}var req=dojo.i18n._requireLocalization;dojo.i18n._requireLocalization=function(m,b,_22e,_22f){req(m,b,_22e,_22f);if(_22e){return;}for(var i=0;i<_22d.length;i++){req(m,b,_22d[i],_22f);}};}})();dojo.i18n._searchLocalePath=function(_230,down,_231){_230=dojo.i18n.normalizeLocale(_230);var _232=_230.split("-");var _233=[];for(var i=_232.length;i>0;i--){_233.push(_232.slice(0,i).join("-"));}_233.push(false);if(down){_233.reverse();}for(var j=_233.length-1;j>=0;j--){var loc=_233[j]||"ROOT";var stop=_231(loc);if(stop){break;}}};dojo.i18n._preloadLocalizations=function(_234,_235){function _236(_237){_237=dojo.i18n.normalizeLocale(_237);dojo.i18n._searchLocalePath(_237,true,function(loc){for(var i=0;i<_235.length;i++){if(_235[i]==loc){dojo["require"](_234+"_"+loc);return true;}}return false;});};_236();var _238=dojo.config.extraLocale||[];for(var i=0;i<_238.length;i++){_236(_238[i]);}};}if(!dojo._hasResource["dijit._PaletteMixin"]){dojo._hasResource["dijit._PaletteMixin"]=true;dojo.provide("dijit._PaletteMixin");dojo.declare("dijit._PaletteMixin",[dijit._CssStateMixin],{defaultTimeout:500,timeoutChangeRate:0.9,value:null,_selectedCell:-1,tabIndex:"0",cellClass:"dijitPaletteCell",dyeClass:"",_preparePalette:function(_239,_23a,_23b){this._cells=[];var url=this._blankGif;_23b=_23b||dojo.getObject(this.dyeClass);for(var row=0;row<_239.length;row++){var _23c=dojo.create("tr",{tabIndex:"-1"},this.gridNode);for(var col=0;col<_239[row].length;col++){var _23d=_239[row][col];if(_23d){var _23e=new _23b(_23d,row,col);var _23f=dojo.create("td",{"class":this.cellClass,tabIndex:"-1",title:_23a[_23d]});_23e.fillCell(_23f,url);this.connect(_23f,"ondijitclick","_onCellClick");this._trackMouseState(_23f,this.cellClass);dojo.place(_23f,_23c);_23f.index=this._cells.length;this._cells.push({node:_23f,dye:_23e});}}}this._xDim=_239[0].length;this._yDim=_239.length;var _240={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:this.isLeftToRight()?1:-1,LEFT_ARROW:this.isLeftToRight()?-1:1};for(var key in _240){this._connects.push(dijit.typematic.addKeyListener(this.domNode,{charOrCode:dojo.keys[key],ctrlKey:false,altKey:false,shiftKey:false},this,function(){var _241=_240[key];return function(_242){this._navigateByKey(_241,_242);};}(),this.timeoutChangeRate,this.defaultTimeout));}},postCreate:function(){this.inherited(arguments);this._setCurrent(this._cells[0].node);},focus:function(){dijit.focus(this._currentFocus);},_onCellClick:function(evt){var _243=evt.currentTarget,_244=this._getDye(_243).getValue();this._setCurrent(_243);setTimeout(dojo.hitch(this,function(){dijit.focus(_243);this._setValueAttr(_244,true);}));dojo.removeClass(_243,"dijitPaletteCellHover");dojo.stopEvent(evt);},_setCurrent:function(node){if("_currentFocus" in this){dojo.attr(this._currentFocus,"tabIndex","-1");}this._currentFocus=node;if(node){dojo.attr(node,"tabIndex",this.tabIndex);}},_setValueAttr:function(_245,_246){if(this._selectedCell>=0){dojo.removeClass(this._cells[this._selectedCell].node,"dijitPaletteCellSelected");}this._selectedCell=-1;if(_245){for(var i=0;i<this._cells.length;i++){if(_245==this._cells[i].dye.getValue()){this._selectedCell=i;dojo.addClass(this._cells[i].node,"dijitPaletteCellSelected");break;}}}this._set("value",this._selectedCell>=0?_245:null);if(_246||_246===undefined){this.onChange(_245);}},onChange:function(_247){},_navigateByKey:function(_248,_249){if(_249==-1){return;}var _24a=this._currentFocus.index+_248;if(_24a<this._cells.length&&_24a>-1){var _24b=this._cells[_24a].node;this._setCurrent(_24b);setTimeout(dojo.hitch(dijit,"focus",_24b),0);}},_getDye:function(cell){return this._cells[cell.index].dye;}});}if(!dojo._hasResource["dijit.ColorPalette"]){dojo._hasResource["dijit.ColorPalette"]=true;dojo.provide("dijit.ColorPalette");dojo.declare("dijit.ColorPalette",[dijit._Widget,dijit._Templated,dijit._PaletteMixin],{palette:"7x10",_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:dojo.cache("dijit","templates/ColorPalette.html","<div class=\"dijitInline dijitColorPalette\">\n\t<table class=\"dijitPaletteTable\" cellSpacing=\"0\" cellPadding=\"0\">\n\t\t<tbody dojoAttachPoint=\"gridNode\"></tbody>\n\t</table>\n</div>\n"),baseClass:"dijitColorPalette",buildRendering:function(){this.inherited(arguments);this._preparePalette(this._palettes[this.palette],dojo.i18n.getLocalization("dojo","colors",this.lang),dojo.declare(dijit._Color,{hc:dojo.hasClass(dojo.body(),"dijit_a11y"),palette:this.palette}));}});dojo.declare("dijit._Color",dojo.Color,{template:"<span class='dijitInline dijitPaletteImg'>"+"<img src='${blankGif}' alt='${alt}' class='dijitColorPaletteSwatch' style='background-color: ${color}'/>"+"</span>",hcTemplate:"<span class='dijitInline dijitPaletteImg' style='position: relative; overflow: hidden; height: 12px; width: 14px;'>"+"<img src='${image}' alt='${alt}' style='position: absolute; left: ${left}px; top: ${top}px; ${size}'/>"+"</span>",_imagePaths:{"7x10":dojo.moduleUrl("dijit.themes","a11y/colors7x10.png"),"3x4":dojo.moduleUrl("dijit.themes","a11y/colors3x4.png")},constructor:function(_24c,row,col){this._alias=_24c;this._row=row;this._col=col;this.setColor(dojo.Color.named[_24c]);},getValue:function(){return this.toHex();},fillCell:function(cell,_24d){var html=dojo.string.substitute(this.hc?this.hcTemplate:this.template,{color:this.toHex(),blankGif:_24d,alt:this._alias,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"});dojo.place(html,cell);}});}if(!dojo._hasResource["dojo.dnd.common"]){dojo._hasResource["dojo.dnd.common"]=true;dojo.provide("dojo.dnd.common");dojo.getObject("dnd",true,dojo);dojo.dnd.getCopyKeyState=dojo.isCopyKey;dojo.dnd._uniqueId=0;dojo.dnd.getUniqueId=function(){var id;do{id=dojo._scopeName+"Unique"+(++dojo.dnd._uniqueId);}while(dojo.byId(id));return id;};dojo.dnd._empty={};dojo.dnd.isFormElement=function(e){var t=e.target;if(t.nodeType==3){t=t.parentNode;}return " button textarea input select option ".indexOf(" "+t.tagName.toLowerCase()+" ")>=0;};}if(!dojo._hasResource["dojo.dnd.autoscroll"]){dojo._hasResource["dojo.dnd.autoscroll"]=true;dojo.provide("dojo.dnd.autoscroll");dojo.getObject("dnd",true,dojo);dojo.dnd.getViewport=dojo.window.getBox;dojo.dnd.V_TRIGGER_AUTOSCROLL=32;dojo.dnd.H_TRIGGER_AUTOSCROLL=32;dojo.dnd.V_AUTOSCROLL_VALUE=16;dojo.dnd.H_AUTOSCROLL_VALUE=16;dojo.dnd.autoScroll=function(e){var v=dojo.window.getBox(),dx=0,dy=0;if(e.clientX<dojo.dnd.H_TRIGGER_AUTOSCROLL){dx=-dojo.dnd.H_AUTOSCROLL_VALUE;}else{if(e.clientX>v.w-dojo.dnd.H_TRIGGER_AUTOSCROLL){dx=dojo.dnd.H_AUTOSCROLL_VALUE;}}if(e.clientY<dojo.dnd.V_TRIGGER_AUTOSCROLL){dy=-dojo.dnd.V_AUTOSCROLL_VALUE;}else{if(e.clientY>v.h-dojo.dnd.V_TRIGGER_AUTOSCROLL){dy=dojo.dnd.V_AUTOSCROLL_VALUE;}}window.scrollBy(dx,dy);};dojo.dnd._validNodes={"div":1,"p":1,"td":1};dojo.dnd._validOverflow={"auto":1,"scroll":1};dojo.dnd.autoScrollNodes=function(e){for(var n=e.target;n;){if(n.nodeType==1&&(n.tagName.toLowerCase() in dojo.dnd._validNodes)){var s=dojo.getComputedStyle(n);if(s.overflow.toLowerCase() in dojo.dnd._validOverflow){var b=dojo._getContentBox(n,s),t=dojo.position(n,true);var w=Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL,b.w/2),h=Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL,b.h/2),rx=e.pageX-t.x,ry=e.pageY-t.y,dx=0,dy=0;if(dojo.isWebKit||dojo.isOpera){rx+=dojo.body().scrollLeft;ry+=dojo.body().scrollTop;}if(rx>0&&rx<b.w){if(rx<w){dx=-w;}else{if(rx>b.w-w){dx=w;}}}if(ry>0&&ry<b.h){if(ry<h){dy=-h;}else{if(ry>b.h-h){dy=h;}}}var _24e=n.scrollLeft,_24f=n.scrollTop;n.scrollLeft=n.scrollLeft+dx;n.scrollTop=n.scrollTop+dy;if(_24e!=n.scrollLeft||_24f!=n.scrollTop){return;}}}try{n=n.parentNode;}catch(x){n=null;}}dojo.dnd.autoScroll(e);};}if(!dojo._hasResource["dojo.dnd.Mover"]){dojo._hasResource["dojo.dnd.Mover"]=true;dojo.provide("dojo.dnd.Mover");dojo.declare("dojo.dnd.Mover",null,{constructor:function(node,e,host){this.node=dojo.byId(node);var pos=e.touches?e.touches[0]:e;this.marginBox={l:pos.pageX,t:pos.pageY};this.mouseButton=e.button;var h=(this.host=host),d=node.ownerDocument;this.events=[dojo.connect(d,"onmousemove",this,"onFirstMove"),dojo.connect(d,"ontouchmove",this,"onFirstMove"),dojo.connect(d,"onmousemove",this,"onMouseMove"),dojo.connect(d,"ontouchmove",this,"onMouseMove"),dojo.connect(d,"onmouseup",this,"onMouseUp"),dojo.connect(d,"ontouchend",this,"onMouseUp"),dojo.connect(d,"ondragstart",dojo.stopEvent),dojo.connect(d.body,"onselectstart",dojo.stopEvent)];if(h&&h.onMoveStart){h.onMoveStart(this);}},onMouseMove:function(e){dojo.dnd.autoScroll(e);var m=this.marginBox,pos=e.touches?e.touches[0]:e;this.host.onMove(this,{l:m.l+pos.pageX,t:m.t+pos.pageY},e);dojo.stopEvent(e);},onMouseUp:function(e){if(dojo.isWebKit&&dojo.isMac&&this.mouseButton==2?e.button==0:this.mouseButton==e.button){this.destroy();}dojo.stopEvent(e);},onFirstMove:function(e){var s=this.node.style,l,t,h=this.host;switch(s.position){case "relative":case "absolute":l=Math.round(parseFloat(s.left))||0;t=Math.round(parseFloat(s.top))||0;break;default:s.position="absolute";var m=dojo.marginBox(this.node);var b=dojo.doc.body;var bs=dojo.getComputedStyle(b);var bm=dojo._getMarginBox(b,bs);var bc=dojo._getContentBox(b,bs);l=m.l-(bc.l-bm.l);t=m.t-(bc.t-bm.t);break;}this.marginBox.l=l-this.marginBox.l;this.marginBox.t=t-this.marginBox.t;if(h&&h.onFirstMove){h.onFirstMove(this,e);}dojo.disconnect(this.events.shift());dojo.disconnect(this.events.shift());},destroy:function(){dojo.forEach(this.events,dojo.disconnect);var h=this.host;if(h&&h.onMoveStop){h.onMoveStop(this);}this.events=this.node=this.host=null;}});}if(!dojo._hasResource["dojo.dnd.Moveable"]){dojo._hasResource["dojo.dnd.Moveable"]=true;dojo.provide("dojo.dnd.Moveable");dojo.declare("dojo.dnd.Moveable",null,{handle:"",delay:0,skip:false,constructor:function(node,_250){this.node=dojo.byId(node);if(!_250){_250={};}this.handle=_250.handle?dojo.byId(_250.handle):null;if(!this.handle){this.handle=this.node;}this.delay=_250.delay>0?_250.delay:0;this.skip=_250.skip;this.mover=_250.mover?_250.mover:dojo.dnd.Mover;this.events=[dojo.connect(this.handle,"onmousedown",this,"onMouseDown"),dojo.connect(this.handle,"ontouchstart",this,"onMouseDown"),dojo.connect(this.handle,"ondragstart",this,"onSelectStart"),dojo.connect(this.handle,"onselectstart",this,"onSelectStart")];},markupFactory:function(_251,node){return new dojo.dnd.Moveable(node,_251);},destroy:function(){dojo.forEach(this.events,dojo.disconnect);this.events=this.node=this.handle=null;},onMouseDown:function(e){if(this.skip&&dojo.dnd.isFormElement(e)){return;}if(this.delay){this.events.push(dojo.connect(this.handle,"onmousemove",this,"onMouseMove"),dojo.connect(this.handle,"ontouchmove",this,"onMouseMove"),dojo.connect(this.handle,"onmouseup",this,"onMouseUp"),dojo.connect(this.handle,"ontouchend",this,"onMouseUp"));var pos=e.touches?e.touches[0]:e;this._lastX=pos.pageX;this._lastY=pos.pageY;}else{this.onDragDetected(e);}dojo.stopEvent(e);},onMouseMove:function(e){var pos=e.touches?e.touches[0]:e;if(Math.abs(pos.pageX-this._lastX)>this.delay||Math.abs(pos.pageY-this._lastY)>this.delay){this.onMouseUp(e);this.onDragDetected(e);}dojo.stopEvent(e);},onMouseUp:function(e){for(var i=0;i<2;++i){dojo.disconnect(this.events.pop());}dojo.stopEvent(e);},onSelectStart:function(e){if(!this.skip||!dojo.dnd.isFormElement(e)){dojo.stopEvent(e);}},onDragDetected:function(e){new this.mover(this.node,e,this);},onMoveStart:function(_252){dojo.publish("/dnd/move/start",[_252]);dojo.addClass(dojo.body(),"dojoMove");dojo.addClass(this.node,"dojoMoveItem");},onMoveStop:function(_253){dojo.publish("/dnd/move/stop",[_253]);dojo.removeClass(dojo.body(),"dojoMove");dojo.removeClass(this.node,"dojoMoveItem");},onFirstMove:function(_254,e){},onMove:function(_255,_256,e){this.onMoving(_255,_256);var s=_255.node.style;s.left=_256.l+"px";s.top=_256.t+"px";this.onMoved(_255,_256);},onMoving:function(_257,_258){},onMoved:function(_259,_25a){}});}if(!dojo._hasResource["dojo.dnd.move"]){dojo._hasResource["dojo.dnd.move"]=true;dojo.provide("dojo.dnd.move");dojo.declare("dojo.dnd.move.constrainedMoveable",dojo.dnd.Moveable,{constraints:function(){},within:false,markupFactory:function(_25b,node){return new dojo.dnd.move.constrainedMoveable(node,_25b);},constructor:function(node,_25c){if(!_25c){_25c={};}this.constraints=_25c.constraints;this.within=_25c.within;},onFirstMove:function(_25d){var c=this.constraintBox=this.constraints.call(this,_25d);c.r=c.l+c.w;c.b=c.t+c.h;if(this.within){var mb=dojo._getMarginSize(_25d.node);c.r-=mb.w;c.b-=mb.h;}},onMove:function(_25e,_25f){var c=this.constraintBox,s=_25e.node.style;this.onMoving(_25e,_25f);_25f.l=_25f.l<c.l?c.l:c.r<_25f.l?c.r:_25f.l;_25f.t=_25f.t<c.t?c.t:c.b<_25f.t?c.b:_25f.t;s.left=_25f.l+"px";s.top=_25f.t+"px";this.onMoved(_25e,_25f);}});dojo.declare("dojo.dnd.move.boxConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{box:{},markupFactory:function(_260,node){return new dojo.dnd.move.boxConstrainedMoveable(node,_260);},constructor:function(node,_261){var box=_261&&_261.box;this.constraints=function(){return box;};}});dojo.declare("dojo.dnd.move.parentConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{area:"content",markupFactory:function(_262,node){return new dojo.dnd.move.parentConstrainedMoveable(node,_262);},constructor:function(node,_263){var area=_263&&_263.area;this.constraints=function(){var n=this.node.parentNode,s=dojo.getComputedStyle(n),mb=dojo._getMarginBox(n,s);if(area=="margin"){return mb;}var t=dojo._getMarginExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(area=="border"){return mb;}t=dojo._getBorderExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(area=="padding"){return mb;}t=dojo._getPadExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;return mb;};}});dojo.dnd.constrainedMover=dojo.dnd.move.constrainedMover;dojo.dnd.boxConstrainedMover=dojo.dnd.move.boxConstrainedMover;dojo.dnd.parentConstrainedMover=dojo.dnd.move.parentConstrainedMover;}if(!dojo._hasResource["dojo.dnd.TimedMoveable"]){dojo._hasResource["dojo.dnd.TimedMoveable"]=true;dojo.provide("dojo.dnd.TimedMoveable");(function(){var _264=dojo.dnd.Moveable.prototype.onMove;dojo.declare("dojo.dnd.TimedMoveable",dojo.dnd.Moveable,{timeout:40,constructor:function(node,_265){if(!_265){_265={};}if(_265.timeout&&typeof _265.timeout=="number"&&_265.timeout>=0){this.timeout=_265.timeout;}},markupFactory:function(_266,node){return new dojo.dnd.TimedMoveable(node,_266);},onMoveStop:function(_267){if(_267._timer){clearTimeout(_267._timer);_264.call(this,_267,_267._leftTop);}dojo.dnd.Moveable.prototype.onMoveStop.apply(this,arguments);},onMove:function(_268,_269){_268._leftTop=_269;if(!_268._timer){var _26a=this;_268._timer=setTimeout(function(){_268._timer=null;_264.call(_26a,_268,_268._leftTop);},this.timeout);}}});})();}if(!dojo._hasResource["dijit.form._FormMixin"]){dojo._hasResource["dijit.form._FormMixin"]=true;dojo.provide("dijit.form._FormMixin");dojo.declare("dijit.form._FormMixin",null,{state:"",reset:function(){dojo.forEach(this.getDescendants(),function(_26b){if(_26b.reset){_26b.reset();}});},validate:function(){var _26c=false;return dojo.every(dojo.map(this.getDescendants(),function(_26d){_26d._hasBeenBlurred=true;var _26e=_26d.disabled||!_26d.validate||_26d.validate();if(!_26e&&!_26c){dojo.window.scrollIntoView(_26d.containerNode||_26d.domNode);_26d.focus();_26c=true;}return _26e;}),function(item){return item;});},setValues:function(val){dojo.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.","","2.0");return this.set("value",val);},_setValueAttr:function(obj){var map={};dojo.forEach(this.getDescendants(),function(_26f){if(!_26f.name){return;}var _270=map[_26f.name]||(map[_26f.name]=[]);_270.push(_26f);});for(var name in map){if(!map.hasOwnProperty(name)){continue;}var _271=map[name],_272=dojo.getObject(name,false,obj);if(_272===undefined){continue;}if(!dojo.isArray(_272)){_272=[_272];}if(typeof _271[0].checked=="boolean"){dojo.forEach(_271,function(w,i){w.set("value",dojo.indexOf(_272,w.value)!=-1);});}else{if(_271[0].multiple){_271[0].set("value",_272);}else{dojo.forEach(_271,function(w,i){w.set("value",_272[i]);});}}}},getValues:function(){dojo.deprecated(this.declaredClass+"::getValues() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},_getValueAttr:function(){var obj={};dojo.forEach(this.getDescendants(),function(_273){var name=_273.name;if(!name||_273.disabled){return;}var _274=_273.get("value");if(typeof _273.checked=="boolean"){if(/Radio/.test(_273.declaredClass)){if(_274!==false){dojo.setObject(name,_274,obj);}else{_274=dojo.getObject(name,false,obj);if(_274===undefined){dojo.setObject(name,null,obj);}}}else{var ary=dojo.getObject(name,false,obj);if(!ary){ary=[];dojo.setObject(name,ary,obj);}if(_274!==false){ary.push(_274);}}}else{var prev=dojo.getObject(name,false,obj);if(typeof prev!="undefined"){if(dojo.isArray(prev)){prev.push(_274);}else{dojo.setObject(name,[prev,_274],obj);}}else{dojo.setObject(name,_274,obj);}}});return obj;},isValid:function(){return this.state=="";},onValidStateChange:function(_275){},_getState:function(){var _276=dojo.map(this._descendants,function(w){return w.get("state")||"";});return dojo.indexOf(_276,"Error")>=0?"Error":dojo.indexOf(_276,"Incomplete")>=0?"Incomplete":"";},disconnectChildren:function(){dojo.forEach(this._childConnections||[],dojo.hitch(this,"disconnect"));dojo.forEach(this._childWatches||[],function(w){w.unwatch();});},connectChildren:function(_277){var _278=this;this.disconnectChildren();this._descendants=this.getDescendants();var set=_277?function(name,val){_278[name]=val;}:dojo.hitch(this,"_set");set("value",this.get("value"));set("state",this._getState());var _279=(this._childConnections=[]),_27a=(this._childWatches=[]);dojo.forEach(dojo.filter(this._descendants,function(item){return item.validate;}),function(_27b){dojo.forEach(["state","disabled"],function(attr){_27a.push(_27b.watch(attr,function(attr,_27c,_27d){_278.set("state",_278._getState());}));});});var _27e=function(){if(_278._onChangeDelayTimer){clearTimeout(_278._onChangeDelayTimer);}_278._onChangeDelayTimer=setTimeout(function(){delete _278._onChangeDelayTimer;_278._set("value",_278.get("value"));},10);};dojo.forEach(dojo.filter(this._descendants,function(item){return item.onChange;}),function(_27f){_279.push(_278.connect(_27f,"onChange",_27e));_27a.push(_27f.watch("disabled",_27e));});},startup:function(){this.inherited(arguments);this.connectChildren(true);this.watch("state",function(attr,_280,_281){this.onValidStateChange(_281=="");});},destroy:function(){this.disconnectChildren();this.inherited(arguments);}});}if(!dojo._hasResource["dijit._DialogMixin"]){dojo._hasResource["dijit._DialogMixin"]=true;dojo.provide("dijit._DialogMixin");dojo.declare("dijit._DialogMixin",null,{attributeMap:dijit._Widget.prototype.attributeMap,execute:function(_282){},onCancel:function(){},onExecute:function(){},_onSubmit:function(){this.onExecute();this.execute(this.get("value"));},_getFocusItems:function(){var _283=dijit._getTabNavigable(this.containerNode);this._firstFocusItem=_283.lowest||_283.first||this.closeButtonNode||this.domNode;this._lastFocusItem=_283.last||_283.highest||this._firstFocusItem;}});}if(!dojo._hasResource["dijit.DialogUnderlay"]){dojo._hasResource["dijit.DialogUnderlay"]=true;dojo.provide("dijit.DialogUnderlay");dojo.declare("dijit.DialogUnderlay",[dijit._Widget,dijit._Templated],{templateString:"<div class='dijitDialogUnderlayWrapper'><div class='dijitDialogUnderlay' dojoAttachPoint='node'></div></div>",dialogId:"","class":"",attributeMap:{id:"domNode"},_setDialogIdAttr:function(id){dojo.attr(this.node,"id",id+"_underlay");this._set("dialogId",id);},_setClassAttr:function(_284){this.node.className="dijitDialogUnderlay "+_284;this._set("class",_284);},postCreate:function(){dojo.body().appendChild(this.domNode);},layout:function(){var is=this.node.style,os=this.domNode.style;os.display="none";var _285=dojo.window.getBox();os.top=_285.t+"px";os.left=_285.l+"px";is.width=_285.w+"px";is.height=_285.h+"px";os.display="block";},show:function(){this.domNode.style.display="block";this.layout();this.bgIframe=new dijit.BackgroundIframe(this.domNode);},hide:function(){this.bgIframe.destroy();delete this.bgIframe;this.domNode.style.display="none";}});}if(!dojo._hasResource["dijit.layout._ContentPaneResizeMixin"]){dojo._hasResource["dijit.layout._ContentPaneResizeMixin"]=true;dojo.provide("dijit.layout._ContentPaneResizeMixin");dojo.declare("dijit.layout._ContentPaneResizeMixin",null,{doLayout:true,isContainer:true,isLayoutContainer:true,_startChildren:function(){dojo.forEach(this.getChildren(),function(_286){_286.startup();_286._started=true;});},startup:function(){if(this._started){return;}var _287=dijit._Contained.prototype.getParent.call(this);this._childOfLayoutWidget=_287&&_287.isLayoutContainer;this._needLayout=!this._childOfLayoutWidget;this.inherited(arguments);this._startChildren();if(this._isShown()){this._onShow();}if(!this._childOfLayoutWidget){this.connect(dojo.isIE?this.domNode:dojo.global,"onresize",function(){this._needLayout=!this._childOfLayoutWidget;this.resize();});}},_checkIfSingleChild:function(){var _288=dojo.query("> *",this.containerNode).filter(function(node){return node.tagName!=="SCRIPT";}),_289=_288.filter(function(node){return dojo.hasAttr(node,"data-dojo-type")||dojo.hasAttr(node,"dojoType")||dojo.hasAttr(node,"widgetId");}),_28a=dojo.filter(_289.map(dijit.byNode),function(_28b){return _28b&&_28b.domNode&&_28b.resize;});if(_288.length==_289.length&&_28a.length==1){this._singleChild=_28a[0];}else{delete this._singleChild;}dojo.toggleClass(this.containerNode,this.baseClass+"SingleChild",!!this._singleChild);},resize:function(_28c,_28d){if(!this._wasShown&&this.open!==false){this._onShow();}this._resizeCalled=true;this._scheduleLayout(_28c,_28d);},_scheduleLayout:function(_28e,_28f){if(this._isShown()){this._layout(_28e,_28f);}else{this._needLayout=true;this._changeSize=_28e;this._resultSize=_28f;}},_layout:function(_290,_291){if(_290){dojo.marginBox(this.domNode,_290);}var cn=this.containerNode;if(cn===this.domNode){var mb=_291||{};dojo.mixin(mb,_290||{});if(!("h" in mb)||!("w" in mb)){mb=dojo.mixin(dojo.marginBox(cn),mb);}this._contentBox=dijit.layout.marginBox2contentBox(cn,mb);}else{this._contentBox=dojo.contentBox(cn);}this._layoutChildren();delete this._needLayout;},_layoutChildren:function(){if(this.doLayout){this._checkIfSingleChild();}if(this._singleChild&&this._singleChild.resize){var cb=this._contentBox||dojo.contentBox(this.containerNode);this._singleChild.resize({w:cb.w,h:cb.h});}else{dojo.forEach(this.getChildren(),function(_292){if(_292.resize){_292.resize();}});}},_isShown:function(){if(this._childOfLayoutWidget){if(this._resizeCalled&&"open" in this){return this.open;}return this._resizeCalled;}else{if("open" in this){return this.open;}else{var node=this.domNode,_293=this.domNode.parentNode;return (node.style.display!="none")&&(node.style.visibility!="hidden")&&!dojo.hasClass(node,"dijitHidden")&&_293&&_293.style&&(_293.style.display!="none");}}},_onShow:function(){if(this._needLayout){this._layout(this._changeSize,this._resultSize);}this.inherited(arguments);this._wasShown=true;}});}if(!dojo._hasResource["dojo.html"]){dojo._hasResource["dojo.html"]=true;dojo.provide("dojo.html");dojo.getObject("html",true,dojo);(function(){var _294=0,d=dojo;dojo.html._secureForInnerHtml=function(cont){return cont.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig,"");};dojo.html._emptyNode=dojo.empty;dojo.html._setNodeContent=function(node,cont){d.empty(node);if(cont){if(typeof cont=="string"){cont=d._toDom(cont,node.ownerDocument);}if(!cont.nodeType&&d.isArrayLike(cont)){for(var _295=cont.length,i=0;i<cont.length;i=_295==cont.length?i+1:0){d.place(cont[i],node,"last");}}else{d.place(cont,node,"last");}}return node;};dojo.declare("dojo.html._ContentSetter",null,{node:"",content:"",id:"",cleanContent:false,extractContent:false,parseContent:false,parserScope:dojo._scopeName,startup:true,constructor:function(_296,node){dojo.mixin(this,_296||{});node=this.node=dojo.byId(this.node||node);if(!this.id){this.id=["Setter",(node)?node.id||node.tagName:"",_294++].join("_");}},set:function(cont,_297){if(undefined!==cont){this.content=cont;}if(_297){this._mixin(_297);}this.onBegin();this.setContent();this.onEnd();return this.node;},setContent:function(){var node=this.node;if(!node){throw new Error(this.declaredClass+": setContent given no node");}try{node=dojo.html._setNodeContent(node,this.content);}catch(e){var _298=this.onContentError(e);try{node.innerHTML=_298;}catch(e){console.error("Fatal "+this.declaredClass+".setContent could not change content due to "+e.message,e);}}this.node=node;},empty:function(){if(this.parseResults&&this.parseResults.length){dojo.forEach(this.parseResults,function(w){if(w.destroy){w.destroy();}});delete this.parseResults;}dojo.html._emptyNode(this.node);},onBegin:function(){var cont=this.content;if(dojo.isString(cont)){if(this.cleanContent){cont=dojo.html._secureForInnerHtml(cont);}if(this.extractContent){var _299=cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_299){cont=_299[1];}}}this.empty();this.content=cont;return this.node;},onEnd:function(){if(this.parseContent){this._parse();}return this.node;},tearDown:function(){delete this.parseResults;delete this.node;delete this.content;},onContentError:function(err){return "Error occured setting content: "+err;},_mixin:function(_29a){var _29b={},key;for(key in _29a){if(key in _29b){continue;}this[key]=_29a[key];}},_parse:function(){var _29c=this.node;try{var _29d={};dojo.forEach(["dir","lang","textDir"],function(name){if(this[name]){_29d[name]=this[name];}},this);this.parseResults=dojo.parser.parse({rootNode:_29c,noStart:!this.startup,inherited:_29d,scope:this.parserScope});}catch(e){this._onError("Content",e,"Error parsing in _ContentSetter#"+this.id);}},_onError:function(type,err,_29e){var _29f=this["on"+type+"Error"].call(this,err);if(_29e){console.error(_29e,err);}else{if(_29f){dojo.html._setNodeContent(this.node,_29f,true);}}}});dojo.html.set=function(node,cont,_2a0){if(undefined==cont){console.warn("dojo.html.set: no cont argument provided, using empty string");cont="";}if(!_2a0){return dojo.html._setNodeContent(node,cont,true);}else{var op=new dojo.html._ContentSetter(dojo.mixin(_2a0,{content:cont,node:node}));return op.set();}};})();}if(!dojo._hasResource["dijit.layout.ContentPane"]){dojo._hasResource["dijit.layout.ContentPane"]=true;dojo.provide("dijit.layout.ContentPane");dojo.declare("dijit.layout.ContentPane",[dijit._Widget,dijit.layout._ContentPaneResizeMixin],{href:"",extractContent:false,parseOnLoad:true,parserScope:dojo._scopeName,preventCache:false,preload:false,refreshOnShow:false,loadingMessage:"<span class='dijitContentPaneLoading'>${loadingState}</span>",errorMessage:"<span class='dijitContentPaneError'>${errorState}</span>",isLoaded:false,baseClass:"dijitContentPane",ioArgs:{},onLoadDeferred:null,attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{title:[]}),stopParser:true,template:false,create:function(_2a1,_2a2){if((!_2a1||!_2a1.template)&&_2a2&&!("href" in _2a1)&&!("content" in _2a1)){var df=dojo.doc.createDocumentFragment();_2a2=dojo.byId(_2a2);while(_2a2.firstChild){df.appendChild(_2a2.firstChild);}_2a1=dojo.delegate(_2a1,{content:df});}this.inherited(arguments,[_2a1,_2a2]);},postMixInProperties:function(){this.inherited(arguments);var _2a3=dojo.i18n.getLocalization("dijit","loading",this.lang);this.loadingMessage=dojo.string.substitute(this.loadingMessage,_2a3);this.errorMessage=dojo.string.substitute(this.errorMessage,_2a3);},buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}this.domNode.title="";if(!dojo.attr(this.domNode,"role")){dijit.setWaiRole(this.domNode,"group");}},_startChildren:function(){this.inherited(arguments);if(this._contentSetter){dojo.forEach(this._contentSetter.parseResults,function(obj){if(!obj._started&&!obj._destroyed&&dojo.isFunction(obj.startup)){obj.startup();obj._started=true;}},this);}},setHref:function(href){dojo.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.","","2.0");return this.set("href",href);},_setHrefAttr:function(href){this.cancel();this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));this.onLoadDeferred.addCallback(dojo.hitch(this,"onLoad"));this._set("href",href);if(this.preload||(this._created&&this._isShown())){this._load();}else{this._hrefChanged=true;}return this.onLoadDeferred;},setContent:function(data){dojo.deprecated("dijit.layout.ContentPane.setContent() is deprecated. Use set('content', ...) instead.","","2.0");this.set("content",data);},_setContentAttr:function(data){this._set("href","");this.cancel();this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));if(this._created){this.onLoadDeferred.addCallback(dojo.hitch(this,"onLoad"));}this._setContent(data||"");this._isDownloaded=false;return this.onLoadDeferred;},_getContentAttr:function(){return this.containerNode.innerHTML;},cancel:function(){if(this._xhrDfd&&(this._xhrDfd.fired==-1)){this._xhrDfd.cancel();}delete this._xhrDfd;this.onLoadDeferred=null;},uninitialize:function(){if(this._beingDestroyed){this.cancel();}this.inherited(arguments);},destroyRecursive:function(_2a4){if(this._beingDestroyed){return;}this.inherited(arguments);},_onShow:function(){this.inherited(arguments);if(this.href){if(!this._xhrDfd&&(!this.isLoaded||this._hrefChanged||this.refreshOnShow)){return this.refresh();}}},refresh:function(){this.cancel();this.onLoadDeferred=new dojo.Deferred(dojo.hitch(this,"cancel"));this.onLoadDeferred.addCallback(dojo.hitch(this,"onLoad"));this._load();return this.onLoadDeferred;},_load:function(){this._setContent(this.onDownloadStart(),true);var self=this;var _2a5={preventCache:(this.preventCache||this.refreshOnShow),url:this.href,handleAs:"text"};if(dojo.isObject(this.ioArgs)){dojo.mixin(_2a5,this.ioArgs);}var hand=(this._xhrDfd=(this.ioMethod||dojo.xhrGet)(_2a5));hand.addCallback(function(html){try{self._isDownloaded=true;self._setContent(html,false);self.onDownloadEnd();}catch(err){self._onError("Content",err);}delete self._xhrDfd;return html;});hand.addErrback(function(err){if(!hand.canceled){self._onError("Download",err);}delete self._xhrDfd;return err;});delete this._hrefChanged;},_onLoadHandler:function(data){this._set("isLoaded",true);try{this.onLoadDeferred.callback(data);}catch(e){console.error("Error "+this.widgetId+" running custom onLoad code: "+e.message);}},_onUnloadHandler:function(){this._set("isLoaded",false);try{this.onUnload();}catch(e){console.error("Error "+this.widgetId+" running custom onUnload code: "+e.message);}},destroyDescendants:function(){if(this.isLoaded){this._onUnloadHandler();}var _2a6=this._contentSetter;dojo.forEach(this.getChildren(),function(_2a7){if(_2a7.destroyRecursive){_2a7.destroyRecursive();}});if(_2a6){dojo.forEach(_2a6.parseResults,function(_2a8){if(_2a8.destroyRecursive&&_2a8.domNode&&_2a8.domNode.parentNode==dojo.body()){_2a8.destroyRecursive();}});delete _2a6.parseResults;}dojo.html._emptyNode(this.containerNode);delete this._singleChild;},_setContent:function(cont,_2a9){this.destroyDescendants();var _2aa=this._contentSetter;if(!(_2aa&&_2aa instanceof dojo.html._ContentSetter)){_2aa=this._contentSetter=new dojo.html._ContentSetter({node:this.containerNode,_onError:dojo.hitch(this,this._onError),onContentError:dojo.hitch(this,function(e){var _2ab=this.onContentError(e);try{this.containerNode.innerHTML=_2ab;}catch(e){console.error("Fatal "+this.id+" could not change content due to "+e.message,e);}})});}var _2ac=dojo.mixin({cleanContent:this.cleanContent,extractContent:this.extractContent,parseContent:this.parseOnLoad,parserScope:this.parserScope,startup:false,dir:this.dir,lang:this.lang},this._contentSetterParams||{});_2aa.set((dojo.isObject(cont)&&cont.domNode)?cont.domNode:cont,_2ac);delete this._contentSetterParams;if(this.doLayout){this._checkIfSingleChild();}if(!_2a9){if(this._started){this._startChildren();this._scheduleLayout();}this._onLoadHandler(cont);}},_onError:function(type,err,_2ad){this.onLoadDeferred.errback(err);var _2ae=this["on"+type+"Error"].call(this,err);if(_2ad){console.error(_2ad,err);}else{if(_2ae){this._setContent(_2ae,true);}}},onLoad:function(data){},onUnload:function(){},onDownloadStart:function(){return this.loadingMessage;},onContentError:function(_2af){},onDownloadError:function(_2b0){return this.errorMessage;},onDownloadEnd:function(){}});}if(!dojo._hasResource["dijit.TooltipDialog"]){dojo._hasResource["dijit.TooltipDialog"]=true;dojo.provide("dijit.TooltipDialog");dojo.declare("dijit.TooltipDialog",[dijit.layout.ContentPane,dijit._Templated,dijit.form._FormMixin,dijit._DialogMixin],{title:"",doLayout:false,autofocus:true,baseClass:"dijitTooltipDialog",_firstFocusItem:null,_lastFocusItem:null,templateString:dojo.cache("dijit","templates/TooltipDialog.html","<div role=\"presentation\" tabIndex=\"-1\">\n\t<div class=\"dijitTooltipContainer\" role=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" role=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" role=\"presentation\"></div>\n</div>\n"),_setTitleAttr:function(_2b1){this.containerNode.title=_2b1;this._set("title",_2b1);},postCreate:function(){this.inherited(arguments);this.connect(this.containerNode,"onkeypress","_onKey");},orient:function(node,_2b2,_2b3){var newC="dijitTooltipAB"+(_2b3.charAt(1)=="L"?"Left":"Right")+" dijitTooltip"+(_2b3.charAt(0)=="T"?"Below":"Above");dojo.replaceClass(this.domNode,newC,this._currentOrientClass||"");this._currentOrientClass=newC;},focus:function(){this._getFocusItems(this.containerNode);dijit.focus(this._firstFocusItem);},onOpen:function(pos){this.orient(this.domNode,pos.aroundCorner,pos.corner);this._onShow();},onClose:function(){this.onHide();},_onKey:function(evt){var node=evt.target;var dk=dojo.keys;if(evt.charOrCode===dk.TAB){this._getFocusItems(this.containerNode);}var _2b4=(this._firstFocusItem==this._lastFocusItem);if(evt.charOrCode==dk.ESCAPE){setTimeout(dojo.hitch(this,"onCancel"),0);dojo.stopEvent(evt);}else{if(node==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===dk.TAB){if(!_2b4){dijit.focus(this._lastFocusItem);}dojo.stopEvent(evt);}else{if(node==this._lastFocusItem&&evt.charOrCode===dk.TAB&&!evt.shiftKey){if(!_2b4){dijit.focus(this._firstFocusItem);}dojo.stopEvent(evt);}else{if(evt.charOrCode===dk.TAB){evt.stopPropagation();}}}}}});}if(!dojo._hasResource["dijit.Dialog"]){dojo._hasResource["dijit.Dialog"]=true;dojo.provide("dijit.Dialog");dojo.declare("dijit._DialogBase",[dijit._Templated,dijit.form._FormMixin,dijit._DialogMixin,dijit._CssStateMixin],{templateString:dojo.cache("dijit","templates/Dialog.html","<div class=\"dijitDialog\" role=\"dialog\" aria-labelledby=\"${id}_title\">\n\t<div dojoAttachPoint=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t<span dojoAttachPoint=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\"></span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" dojoAttachEvent=\"ondijitclick: onCancel\" title=\"${buttonCancel}\" role=\"button\" tabIndex=\"-1\">\n\t\t<span dojoAttachPoint=\"closeText\" class=\"closeText\" title=\"${buttonCancel}\">x</span>\n\t</span>\n\t</div>\n\t\t<div dojoAttachPoint=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n"),baseClass:"dijitDialog",cssStateNodes:{closeButtonNode:"dijitDialogCloseIcon"},attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{title:[{node:"titleNode",type:"innerHTML"},{node:"titleBar",type:"attribute"}],"aria-describedby":""}),open:false,duration:dijit.defaultDuration,refocus:true,autofocus:true,_firstFocusItem:null,_lastFocusItem:null,doLayout:false,draggable:true,"aria-describedby":"",postMixInProperties:function(){var _2b5=dojo.i18n.getLocalization("dijit","common");dojo.mixin(this,_2b5);this.inherited(arguments);},postCreate:function(){dojo.style(this.domNode,{display:"none",position:"absolute"});dojo.body().appendChild(this.domNode);this.inherited(arguments);this.connect(this,"onExecute","hide");this.connect(this,"onCancel","hide");this._modalconnects=[];},onLoad:function(){this._position();if(this.autofocus&&dijit._DialogLevelManager.isTop(this)){this._getFocusItems(this.domNode);dijit.focus(this._firstFocusItem);}this.inherited(arguments);},_endDrag:function(e){if(e&&e.node&&e.node===this.domNode){this._relativePosition=dojo.position(e.node);}},_setup:function(){var node=this.domNode;if(this.titleBar&&this.draggable){this._moveable=(dojo.isIE==6)?new dojo.dnd.TimedMoveable(node,{handle:this.titleBar}):new dojo.dnd.Moveable(node,{handle:this.titleBar,timeout:0});this._dndListener=dojo.subscribe("/dnd/move/stop",this,"_endDrag");}else{dojo.addClass(node,"dijitDialogFixed");}this.underlayAttrs={dialogId:this.id,"class":dojo.map(this["class"].split(/\s/),function(s){return s+"_underlay";}).join(" ")};},_size:function(){this._checkIfSingleChild();if(this._singleChild){if(this._singleChildOriginalStyle){this._singleChild.domNode.style.cssText=this._singleChildOriginalStyle;}delete this._singleChildOriginalStyle;}else{dojo.style(this.containerNode,{width:"auto",height:"auto"});}var mb=dojo._getMarginSize(this.domNode);var _2b6=dojo.window.getBox();if(mb.w>=_2b6.w||mb.h>=_2b6.h){var w=Math.min(mb.w,Math.floor(_2b6.w*0.75)),h=Math.min(mb.h,Math.floor(_2b6.h*0.75));if(this._singleChild&&this._singleChild.resize){this._singleChildOriginalStyle=this._singleChild.domNode.style.cssText;this._singleChild.resize({w:w,h:h});}else{dojo.style(this.containerNode,{width:w+"px",height:h+"px",overflow:"auto",position:"relative"});}}else{if(this._singleChild&&this._singleChild.resize){this._singleChild.resize();}}},_position:function(){if(!dojo.hasClass(dojo.body(),"dojoMove")){var node=this.domNode,_2b7=dojo.window.getBox(),p=this._relativePosition,bb=p?null:dojo._getBorderBox(node),l=Math.floor(_2b7.l+(p?p.x:(_2b7.w-bb.w)/2)),t=Math.floor(_2b7.t+(p?p.y:(_2b7.h-bb.h)/2));dojo.style(node,{left:l+"px",top:t+"px"});}},_onKey:function(evt){if(evt.charOrCode){var dk=dojo.keys;var node=evt.target;if(evt.charOrCode===dk.TAB){this._getFocusItems(this.domNode);}var _2b8=(this._firstFocusItem==this._lastFocusItem);if(node==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===dk.TAB){if(!_2b8){dijit.focus(this._lastFocusItem);}dojo.stopEvent(evt);}else{if(node==this._lastFocusItem&&evt.charOrCode===dk.TAB&&!evt.shiftKey){if(!_2b8){dijit.focus(this._firstFocusItem);}dojo.stopEvent(evt);}else{while(node){if(node==this.domNode||dojo.hasClass(node,"dijitPopup")){if(evt.charOrCode==dk.ESCAPE){this.onCancel();}else{return;}}node=node.parentNode;}if(evt.charOrCode!==dk.TAB){dojo.stopEvent(evt);}else{if(!dojo.isOpera){try{this._firstFocusItem.focus();}catch(e){}}}}}}},show:function(){if(this.open){return;}if(!this._started){this.startup();}if(!this._alreadyInitialized){this._setup();this._alreadyInitialized=true;}if(this._fadeOutDeferred){this._fadeOutDeferred.cancel();}this._modalconnects.push(dojo.connect(window,"onscroll",this,"layout"));this._modalconnects.push(dojo.connect(window,"onresize",this,function(){var _2b9=dojo.window.getBox();if(!this._oldViewport||_2b9.h!=this._oldViewport.h||_2b9.w!=this._oldViewport.w){this.layout();this._oldViewport=_2b9;}}));this._modalconnects.push(dojo.connect(this.domNode,"onkeypress",this,"_onKey"));dojo.style(this.domNode,{opacity:0,display:""});this._set("open",true);this._onShow();this._size();this._position();var _2ba;this._fadeInDeferred=new dojo.Deferred(dojo.hitch(this,function(){_2ba.stop();delete this._fadeInDeferred;}));_2ba=dojo.fadeIn({node:this.domNode,duration:this.duration,beforeBegin:dojo.hitch(this,function(){dijit._DialogLevelManager.show(this,this.underlayAttrs);}),onEnd:dojo.hitch(this,function(){if(this.autofocus&&dijit._DialogLevelManager.isTop(this)){this._getFocusItems(this.domNode);dijit.focus(this._firstFocusItem);}this._fadeInDeferred.callback(true);delete this._fadeInDeferred;})}).play();return this._fadeInDeferred;},hide:function(){if(!this._alreadyInitialized){return;}if(this._fadeInDeferred){this._fadeInDeferred.cancel();}var _2bb;this._fadeOutDeferred=new dojo.Deferred(dojo.hitch(this,function(){_2bb.stop();delete this._fadeOutDeferred;}));_2bb=dojo.fadeOut({node:this.domNode,duration:this.duration,onEnd:dojo.hitch(this,function(){this.domNode.style.display="none";dijit._DialogLevelManager.hide(this);this.onHide();this._fadeOutDeferred.callback(true);delete this._fadeOutDeferred;})}).play();if(this._scrollConnected){this._scrollConnected=false;}dojo.forEach(this._modalconnects,dojo.disconnect);this._modalconnects=[];if(this._relativePosition){delete this._relativePosition;}this._set("open",false);return this._fadeOutDeferred;},layout:function(){if(this.domNode.style.display!="none"){if(dijit._underlay){dijit._underlay.layout();}this._position();}},destroy:function(){if(this._fadeInDeferred){this._fadeInDeferred.cancel();}if(this._fadeOutDeferred){this._fadeOutDeferred.cancel();}if(this._moveable){this._moveable.destroy();}if(this._dndListener){dojo.unsubscribe(this._dndListener);}dojo.forEach(this._modalconnects,dojo.disconnect);dijit._DialogLevelManager.hide(this);this.inherited(arguments);}});dojo.declare("dijit.Dialog",[dijit.layout.ContentPane,dijit._DialogBase],{});dijit._DialogLevelManager={show:function(_2bc,_2bd){var ds=dijit._dialogStack;ds[ds.length-1].focus=dijit.getFocus(_2bc);var _2be=dijit._underlay;if(!_2be||_2be._destroyed){_2be=dijit._underlay=new dijit.DialogUnderlay(_2bd);}else{_2be.set(_2bc.underlayAttrs);}var _2bf=ds[ds.length-1].dialog?ds[ds.length-1].zIndex+2:950;if(ds.length==1){_2be.show();}dojo.style(dijit._underlay.domNode,"zIndex",_2bf-1);dojo.style(_2bc.domNode,"zIndex",_2bf);ds.push({dialog:_2bc,underlayAttrs:_2bd,zIndex:_2bf});},hide:function(_2c0){var ds=dijit._dialogStack;if(ds[ds.length-1].dialog==_2c0){ds.pop();var pd=ds[ds.length-1];if(ds.length==1){if(!dijit._underlay._destroyed){dijit._underlay.hide();}}else{dojo.style(dijit._underlay.domNode,"zIndex",pd.zIndex-1);dijit._underlay.set(pd.underlayAttrs);}if(_2c0.refocus){var _2c1=pd.focus;if(!_2c1||(pd.dialog&&!dojo.isDescendant(_2c1.node,pd.dialog.domNode))){pd.dialog._getFocusItems(pd.dialog.domNode);_2c1=pd.dialog._firstFocusItem;}try{dijit.focus(_2c1);}catch(e){}}}else{var idx=dojo.indexOf(dojo.map(ds,function(elem){return elem.dialog;}),_2c0);if(idx!=-1){ds.splice(idx,1);}}},isTop:function(_2c2){var ds=dijit._dialogStack;return ds[ds.length-1].dialog==_2c2;}};dijit._dialogStack=[{dialog:null,focus:null,underlayAttrs:null}];}if(!dojo._hasResource["dijit._HasDropDown"]){dojo._hasResource["dijit._HasDropDown"]=true;dojo.provide("dijit._HasDropDown");dojo.declare("dijit._HasDropDown",null,{_buttonNode:null,_arrowWrapperNode:null,_popupStateNode:null,_aroundNode:null,dropDown:null,autoWidth:true,forceWidth:false,maxHeight:0,dropDownPosition:["below","above"],_stopClickEvents:true,_onDropDownMouseDown:function(e){if(this.disabled||this.readOnly){return;}dojo.stopEvent(e);this._docHandler=this.connect(dojo.doc,"onmouseup","_onDropDownMouseUp");this.toggleDropDown();},_onDropDownMouseUp:function(e){if(e&&this._docHandler){this.disconnect(this._docHandler);}var _2c3=this.dropDown,_2c4=false;if(e&&this._opened){var c=dojo.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&&!_2c4){if(dojo.hasClass(t,"dijitPopup")){_2c4=true;}else{t=t.parentNode;}}if(_2c4){t=e.target;if(_2c3.onItemClick){var _2c5;while(t&&!(_2c5=dijit.byNode(t))){t=t.parentNode;}if(_2c5&&_2c5.onClick&&_2c5.getParent){_2c5.getParent().onItemClick(_2c5,e);}}return;}}}if(this._opened&&_2c3.focus&&_2c3.autoFocus!==false){window.setTimeout(dojo.hitch(_2c3,"focus"),1);}},_onDropDownClick:function(e){if(this._stopClickEvents){dojo.stopEvent(e);}},buildRendering:function(){this.inherited(arguments);this._buttonNode=this._buttonNode||this.focusNode||this.domNode;this._popupStateNode=this._popupStateNode||this.focusNode||this._buttonNode;var _2c6={"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";dojo.addClass(this._arrowWrapperNode||this._buttonNode,"dijit"+_2c6+"ArrowButton");},postCreate:function(){this.inherited(arguments);this.connect(this._buttonNode,"onmousedown","_onDropDownMouseDown");this.connect(this._buttonNode,"onclick","_onDropDownClick");this.connect(this.focusNode,"onkeypress","_onKey");this.connect(this.focusNode,"onkeyup","_onKeyUp");},destroy:function(){if(this.dropDown){if(!this.dropDown._destroyed){this.dropDown.destroyRecursive();}delete this.dropDown;}this.inherited(arguments);},_onKey:function(e){if(this.disabled||this.readOnly){return;}var d=this.dropDown,_2c7=e.target;if(d&&this._opened&&d.handleKey){if(d.handleKey(e)===false){dojo.stopEvent(e);return;}}if(d&&this._opened&&e.charOrCode==dojo.keys.ESCAPE){this.closeDropDown();dojo.stopEvent(e);}else{if(!this._opened&&(e.charOrCode==dojo.keys.DOWN_ARROW||((e.charOrCode==dojo.keys.ENTER||e.charOrCode==" ")&&((_2c7.tagName||"").toLowerCase()!=="input"||(_2c7.type&&_2c7.type.toLowerCase()!=="text"))))){this._toggleOnKeyUp=true;dojo.stopEvent(e);}}},_onKeyUp:function(){if(this._toggleOnKeyUp){delete this._toggleOnKeyUp;this.toggleDropDown();var d=this.dropDown;if(d&&d.focus){setTimeout(dojo.hitch(d,"focus"),1);}}},_onBlur:function(){var _2c8=dijit._curFocus&&this.dropDown&&dojo.isDescendant(dijit._curFocus,this.dropDown.domNode);this.closeDropDown(_2c8);this.inherited(arguments);},isLoaded:function(){return true;},loadDropDown:function(_2c9){_2c9();},toggleDropDown:function(){if(this.disabled||this.readOnly){return;}if(!this._opened){if(!this.isLoaded()){this.loadDropDown(dojo.hitch(this,"openDropDown"));return;}else{this.openDropDown();}}else{this.closeDropDown();}},openDropDown:function(){var _2ca=this.dropDown,_2cb=_2ca.domNode,_2cc=this._aroundNode||this.domNode,self=this;if(!this._preparedNode){this._preparedNode=true;if(_2cb.style.width){this._explicitDDWidth=true;}if(_2cb.style.height){this._explicitDDHeight=true;}}if(this.maxHeight||this.forceWidth||this.autoWidth){var _2cd={display:"",visibility:"hidden"};if(!this._explicitDDWidth){_2cd.width="";}if(!this._explicitDDHeight){_2cd.height="";}dojo.style(_2cb,_2cd);var _2ce=this.maxHeight;if(_2ce==-1){var _2cf=dojo.window.getBox(),_2d0=dojo.position(_2cc,false);_2ce=Math.floor(Math.max(_2d0.y,_2cf.h-(_2d0.y+_2d0.h)));}if(_2ca.startup&&!_2ca._started){_2ca.startup();}dijit.popup.moveOffScreen(_2ca);var mb=dojo._getMarginSize(_2cb);var _2d1=(_2ce&&mb.h>_2ce);dojo.style(_2cb,{overflowX:"hidden",overflowY:_2d1?"auto":"hidden"});if(_2d1){mb.h=_2ce;if("w" in mb){mb.w+=16;}}else{delete mb.h;}if(this.forceWidth){mb.w=_2cc.offsetWidth;}else{if(this.autoWidth){mb.w=Math.max(mb.w,_2cc.offsetWidth);}else{delete mb.w;}}if(dojo.isFunction(_2ca.resize)){_2ca.resize(mb);}else{dojo.marginBox(_2cb,mb);}}var _2d2=dijit.popup.open({parent:this,popup:_2ca,around:_2cc,orient:dijit.getPopupAroundAlignment((this.dropDownPosition&&this.dropDownPosition.length)?this.dropDownPosition:["below"],this.isLeftToRight()),onExecute:function(){self.closeDropDown(true);},onCancel:function(){self.closeDropDown(true);},onClose:function(){dojo.attr(self._popupStateNode,"popupActive",false);dojo.removeClass(self._popupStateNode,"dijitHasDropDownOpen");self._opened=false;}});dojo.attr(this._popupStateNode,"popupActive","true");dojo.addClass(self._popupStateNode,"dijitHasDropDownOpen");this._opened=true;return _2d2;},closeDropDown:function(_2d3){if(this._opened){if(_2d3){this.focus();}dijit.popup.close(this.dropDown);this._opened=false;}}});}if(!dojo._hasResource["dijit.form.Button"]){dojo._hasResource["dijit.form.Button"]=true;dojo.provide("dijit.form.Button");dojo.declare("dijit.form.Button",dijit.form._FormWidget,{label:"",showLabel:true,iconClass:"",type:"button",baseClass:"dijitButton",templateString:dojo.cache("dijit.form","templates/Button.html","<span class=\"dijit dijitReset dijitInline\"\n\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdojoAttachPoint=\"titleNode,focusNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\" dojoAttachPoint=\"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\tdojoAttachPoint=\"containerNode\"\n\t\t\t></span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\" tabIndex=\"-1\"\n\t\tdojoAttachPoint=\"valueNode\"\n/></span>\n"),attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{value:"valueNode"}),_onClick:function(e){if(this.disabled){return false;}this._clicked();return this.onClick(e);},_onButtonClick:function(e){if(this._onClick(e)===false){e.preventDefault();}else{if(this.type=="submit"&&!(this.valueNode||this.focusNode).form){for(var node=this.domNode;node.parentNode;node=node.parentNode){var _2d4=dijit.byNode(node);if(_2d4&&typeof _2d4._onSubmit=="function"){_2d4._onSubmit(e);break;}}}else{if(this.valueNode){this.valueNode.click();e.preventDefault();}}}},buildRendering:function(){this.inherited(arguments);dojo.setSelectable(this.focusNode,false);},_fillContent:function(_2d5){if(_2d5&&(!this.params||!("label" in this.params))){this.set("label",_2d5.innerHTML);}},_setShowLabelAttr:function(val){if(this.containerNode){dojo.toggleClass(this.containerNode,"dijitDisplayNone",!val);}this._set("showLabel",val);},onClick:function(e){return true;},_clicked:function(e){},setLabel:function(_2d6){dojo.deprecated("dijit.form.Button.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_2d6);},_setLabelAttr:function(_2d7){this._set("label",_2d7);this.containerNode.innerHTML=_2d7;if(this.showLabel==false&&!this.params.title){this.titleNode.title=dojo.trim(this.containerNode.innerText||this.containerNode.textContent||"");}},_setIconClassAttr:function(val){var _2d8=this.iconClass||"dijitNoIcon",_2d9=val||"dijitNoIcon";dojo.replaceClass(this.iconNode,_2d9,_2d8);this._set("iconClass",val);}});dojo.declare("dijit.form.DropDownButton",[dijit.form.Button,dijit._Container,dijit._HasDropDown],{baseClass:"dijitDropDownButton",templateString:dojo.cache("dijit.form","templates/DropDownButton.html","<span class=\"dijit dijitReset dijitInline\"\n\t><span class='dijitReset dijitInline dijitButtonNode'\n\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick\" dojoAttachPoint=\"_buttonNode\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdojoAttachPoint=\"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\tdojoAttachPoint=\"iconNode\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tdojoAttachPoint=\"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\tdojoAttachPoint=\"valueNode\"\n/></span>\n"),_fillContent:function(){if(this.srcNodeRef){var _2da=dojo.query("*",this.srcNodeRef);dijit.form.DropDownButton.superclass._fillContent.call(this,_2da[0]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}if(!this.dropDown&&this.dropDownContainer){var _2db=dojo.query("[widgetId]",this.dropDownContainer)[0];this.dropDown=dijit.byNode(_2db);delete this.dropDownContainer;}if(this.dropDown){dijit.popup.hide(this.dropDown);}this.inherited(arguments);},isLoaded:function(){var _2dc=this.dropDown;return (!!_2dc&&(!_2dc.href||_2dc.isLoaded));},loadDropDown:function(){var _2dd=this.dropDown;if(!_2dd){return;}if(!this.isLoaded()){var _2de=dojo.connect(_2dd,"onLoad",this,function(){dojo.disconnect(_2de);this.openDropDown();});_2dd.refresh();}else{this.openDropDown();}},isFocusable:function(){return this.inherited(arguments)&&!this._mouseDown;}});dojo.declare("dijit.form.ComboButton",dijit.form.DropDownButton,{templateString:dojo.cache("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\" dojoAttachPoint=\"buttonNode\" dojoAttachEvent=\"ondijitclick:_onButtonClick,onkeypress:_onButtonKeyPress\"\n\t\t><div id=\"${id}_button\" class=\"dijitReset dijitButtonContents\"\n\t\t\tdojoAttachPoint=\"titleNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" dojoAttachPoint=\"iconNode\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"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\tdojoAttachPoint=\"_popupStateNode,focusNode,_buttonNode\"\n\t\t\tdojoAttachEvent=\"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}\" dojoAttachPoint=\"valueNode\"\n\t\t/></td></tr></tbody\n></table>\n"),attributeMap:dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap),{id:"",tabIndex:["focusNode","titleNode"],title:"titleNode"}),optionsTitle:"",baseClass:"dijitComboButton",cssStateNodes:{"buttonNode":"dijitButtonNode","titleNode":"dijitButtonContents","_popupStateNode":"dijitDownArrowButton"},_focusedNode:null,_onButtonKeyPress:function(evt){if(evt.charOrCode==dojo.keys[this.isLeftToRight()?"RIGHT_ARROW":"LEFT_ARROW"]){dijit.focus(this._popupStateNode);dojo.stopEvent(evt);}},_onArrowKeyPress:function(evt){if(evt.charOrCode==dojo.keys[this.isLeftToRight()?"LEFT_ARROW":"RIGHT_ARROW"]){dijit.focus(this.titleNode);dojo.stopEvent(evt);}},focus:function(_2df){if(!this.disabled){dijit.focus(_2df=="start"?this.titleNode:this._popupStateNode);}}});dojo.declare("dijit.form.ToggleButton",dijit.form.Button,{baseClass:"dijitToggleButton",checked:false,attributeMap:dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap),{checked:"focusNode"}),_clicked:function(evt){this.set("checked",!this.checked);},_setCheckedAttr:function(_2e0,_2e1){this._set("checked",_2e0);dojo.attr(this.focusNode||this.domNode,"checked",_2e0);dijit.setWaiState(this.focusNode||this.domNode,"pressed",_2e0);this._handleOnChange(_2e0,_2e1);},setChecked:function(_2e2){dojo.deprecated("setChecked("+_2e2+") is deprecated. Use set('checked',"+_2e2+") instead.","","2.0");this.set("checked",_2e2);},reset:function(){this._hasBeenBlurred=false;this.set("checked",this.params.checked||false);}});}if(!dojo._hasResource["dijit.form.ToggleButton"]){dojo._hasResource["dijit.form.ToggleButton"]=true;dojo.provide("dijit.form.ToggleButton");}if(!dojo._hasResource["dijit.form.CheckBox"]){dojo._hasResource["dijit.form.CheckBox"]=true;dojo.provide("dijit.form.CheckBox");dojo.declare("dijit.form.CheckBox",dijit.form.ToggleButton,{templateString:dojo.cache("dijit.form","templates/CheckBox.html","<div class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><input\n\t \t${!nameAttrSetting} type=\"${type}\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onclick:_onClick\"\n/></div>\n"),baseClass:"dijitCheckBox",type:"checkbox",value:"on",readOnly:false,attributeMap:dojo.delegate(dijit.form._FormWidget.prototype.attributeMap,{readOnly:"focusNode"}),_setReadOnlyAttr:function(_2e3){this._set("readOnly",_2e3);dojo.attr(this.focusNode,"readOnly",_2e3);dijit.setWaiState(this.focusNode,"readonly",_2e3);},_setValueAttr:function(_2e4,_2e5){if(typeof _2e4=="string"){this._set("value",_2e4);dojo.attr(this.focusNode,"value",_2e4);_2e4=true;}if(this._created){this.set("checked",_2e4,_2e5);}},_getValueAttr:function(){return (this.checked?this.value:false);},_setLabelAttr:undefined,postMixInProperties:function(){if(this.value==""){this.value="on";}this.checkedAttrSetting=this.checked?"checked":"";this.inherited(arguments);},_fillContent:function(_2e6){},reset:function(){this._hasBeenBlurred=false;this.set("checked",this.params.checked||false);this._set("value",this.params.value||"on");dojo.attr(this.focusNode,"value",this.value);},_onFocus:function(){if(this.id){dojo.query("label[for='"+this.id+"']").addClass("dijitFocusedLabel");}this.inherited(arguments);},_onBlur:function(){if(this.id){dojo.query("label[for='"+this.id+"']").removeClass("dijitFocusedLabel");}this.inherited(arguments);},_onClick:function(e){if(this.readOnly){dojo.stopEvent(e);return false;}return this.inherited(arguments);}});dojo.declare("dijit.form.RadioButton",dijit.form.CheckBox,{type:"radio",baseClass:"dijitRadio",_setCheckedAttr:function(_2e7){this.inherited(arguments);if(!this._created){return;}if(_2e7){var _2e8=this;dojo.query("INPUT[type=radio]",this.focusNode.form||dojo.doc).forEach(function(_2e9){if(_2e9.name==_2e8.name&&_2e9!=_2e8.focusNode&&_2e9.form==_2e8.focusNode.form){var _2ea=dijit.getEnclosingWidget(_2e9);if(_2ea&&_2ea.checked){_2ea.set("checked",false);}}});}},_clicked:function(e){if(!this.checked){this.set("checked",true);}}});}if(!dojo._hasResource["dijit.form.DropDownButton"]){dojo._hasResource["dijit.form.DropDownButton"]=true;dojo.provide("dijit.form.DropDownButton");}if(!dojo._hasResource["dojo.regexp"]){dojo._hasResource["dojo.regexp"]=true;dojo.provide("dojo.regexp");dojo.getObject("regexp",true,dojo);dojo.regexp.escapeString=function(str,_2eb){return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(ch){if(_2eb&&_2eb.indexOf(ch)!=-1){return ch;}return "\\"+ch;});};dojo.regexp.buildGroupRE=function(arr,re,_2ec){if(!(arr instanceof Array)){return re(arr);}var b=[];for(var i=0;i<arr.length;i++){b.push(re(arr[i]));}return dojo.regexp.group(b.join("|"),_2ec);};dojo.regexp.group=function(_2ed,_2ee){return "("+(_2ee?"?:":"")+_2ed+")";};}if(!dojo._hasResource["dojo.data.util.sorter"]){dojo._hasResource["dojo.data.util.sorter"]=true;dojo.provide("dojo.data.util.sorter");dojo.getObject("data.util.sorter",true,dojo);dojo.data.util.sorter.basicComparator=function(a,b){var r=-1;if(a===null){a=undefined;}if(b===null){b=undefined;}if(a==b){r=0;}else{if(a>b||a==null){r=1;}}return r;};dojo.data.util.sorter.createSortFunction=function(_2ef,_2f0){var _2f1=[];function _2f2(attr,dir,comp,s){return function(_2f3,_2f4){var a=s.getValue(_2f3,attr);var b=s.getValue(_2f4,attr);return dir*comp(a,b);};};var _2f5;var map=_2f0.comparatorMap;var bc=dojo.data.util.sorter.basicComparator;for(var i=0;i<_2ef.length;i++){_2f5=_2ef[i];var attr=_2f5.attribute;if(attr){var dir=(_2f5.descending)?-1:1;var comp=bc;if(map){if(typeof attr!=="string"&&("toString" in attr)){attr=attr.toString();}comp=map[attr]||bc;}_2f1.push(_2f2(attr,dir,comp,_2f0));}}return function(rowA,rowB){var i=0;while(i<_2f1.length){var ret=_2f1[i++](rowA,rowB);if(ret!==0){return ret;}}return 0;};};}if(!dojo._hasResource["dojo.data.util.simpleFetch"]){dojo._hasResource["dojo.data.util.simpleFetch"]=true;dojo.provide("dojo.data.util.simpleFetch");dojo.getObject("data.util.simpleFetch",true,dojo);dojo.data.util.simpleFetch.fetch=function(_2f6){_2f6=_2f6||{};if(!_2f6.store){_2f6.store=this;}var self=this;var _2f7=function(_2f8,_2f9){if(_2f9.onError){var _2fa=_2f9.scope||dojo.global;_2f9.onError.call(_2fa,_2f8,_2f9);}};var _2fb=function(_2fc,_2fd){var _2fe=_2fd.abort||null;var _2ff=false;var _300=_2fd.start?_2fd.start:0;var _301=(_2fd.count&&(_2fd.count!==Infinity))?(_300+_2fd.count):_2fc.length;_2fd.abort=function(){_2ff=true;if(_2fe){_2fe.call(_2fd);}};var _302=_2fd.scope||dojo.global;if(!_2fd.store){_2fd.store=self;}if(_2fd.onBegin){_2fd.onBegin.call(_302,_2fc.length,_2fd);}if(_2fd.sort){_2fc.sort(dojo.data.util.sorter.createSortFunction(_2fd.sort,self));}if(_2fd.onItem){for(var i=_300;(i<_2fc.length)&&(i<_301);++i){var item=_2fc[i];if(!_2ff){_2fd.onItem.call(_302,item,_2fd);}}}if(_2fd.onComplete&&!_2ff){var _303=null;if(!_2fd.onItem){_303=_2fc.slice(_300,_301);}_2fd.onComplete.call(_302,_303,_2fd);}};this._fetchItems(_2f6,_2fb,_2f7);return _2f6;};}if(!dojo._hasResource["dojo.data.util.filter"]){dojo._hasResource["dojo.data.util.filter"]=true;dojo.provide("dojo.data.util.filter");dojo.getObject("data.util.filter",true,dojo);dojo.data.util.filter.patternToRegExp=function(_304,_305){var rxp="^";var c=null;for(var i=0;i<_304.length;i++){c=_304.charAt(i);switch(c){case "\\":rxp+=c;i++;rxp+=_304.charAt(i);break;case "*":rxp+=".*";break;case "?":rxp+=".";break;case "$":case "^":case "/":case "+":case ".":case "|":case "(":case ")":case "{":case "}":case "[":case "]":rxp+="\\";default:rxp+=c;}}rxp+="$";if(_305){return new RegExp(rxp,"mi");}else{return new RegExp(rxp,"m");}};}if(!dojo._hasResource["dijit.form.TextBox"]){dojo._hasResource["dijit.form.TextBox"]=true;dojo.provide("dijit.form.TextBox");dojo.declare("dijit.form.TextBox",dijit.form._FormValueWidget,{trim:false,uppercase:false,lowercase:false,propercase:false,maxLength:"",selectOnClick:false,placeHolder:"",templateString:dojo.cache("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\" dojoAttachPoint='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"),_singleNodeTemplate:"<input class=\"dijit dijitReset dijitLeft dijitInputField\" dojoAttachPoint=\"textbox,focusNode\" autocomplete=\"off\" type=\"${type}\" ${!nameAttrSetting} />",_buttonInputDisabled:dojo.isIE?"disabled":"",baseClass:"dijitTextBox",attributeMap:dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap,{maxLength:"focusNode"}),postMixInProperties:function(){var type=this.type.toLowerCase();if(this.templateString&&this.templateString.toLowerCase()=="input"||((type=="hidden"||type=="file")&&this.templateString==dijit.form.TextBox.prototype.templateString)){this.templateString=this._singleNodeTemplate;}this.inherited(arguments);},_setPlaceHolderAttr:function(v){this._set("placeHolder",v);if(!this._phspan){this._attachPoints.push("_phspan");this._phspan=dojo.create("span",{className:"dijitPlaceHolder dijitInputField"},this.textbox,"after");}this._phspan.innerHTML="";this._phspan.appendChild(document.createTextNode(v));this._updatePlaceHolder();},_updatePlaceHolder:function(){if(this._phspan){this._phspan.style.display=(this.placeHolder&&!this._focused&&!this.textbox.value)?"":"none";}},_getValueAttr:function(){return this.parse(this.get("displayedValue"),this.constraints);},_setValueAttr:function(_306,_307,_308){var _309;if(_306!==undefined){_309=this.filter(_306);if(typeof _308!="string"){if(_309!==null&&((typeof _309!="number")||!isNaN(_309))){_308=this.filter(this.format(_309,this.constraints));}else{_308="";}}}if(_308!=null&&_308!=undefined&&((typeof _308)!="number"||!isNaN(_308))&&this.textbox.value!=_308){this.textbox.value=_308;this._set("displayedValue",this.get("displayedValue"));}this._updatePlaceHolder();this.inherited(arguments,[_309,_307]);},displayedValue:"",getDisplayedValue:function(){dojo.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use set('displayedValue') instead.","","2.0");return this.get("displayedValue");},_getDisplayedValueAttr:function(){return this.filter(this.textbox.value);},setDisplayedValue:function(_30a){dojo.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.","","2.0");this.set("displayedValue",_30a);},_setDisplayedValueAttr:function(_30b){if(_30b===null||_30b===undefined){_30b="";}else{if(typeof _30b!="string"){_30b=String(_30b);}}this.textbox.value=_30b;this._setValueAttr(this.get("value"),undefined);this._set("displayedValue",this.get("displayedValue"));},format:function(_30c,_30d){return ((_30c==null||_30c==undefined)?"":(_30c.toString?_30c.toString():_30c));},parse:function(_30e,_30f){return _30e;},_refreshState:function(){},_onInput:function(e){if(e&&e.type&&/key/i.test(e.type)&&e.keyCode){switch(e.keyCode){case dojo.keys.SHIFT:case dojo.keys.ALT:case dojo.keys.CTRL:case dojo.keys.TAB:return;}}if(this.intermediateChanges){var _310=this;setTimeout(function(){_310._handleOnChange(_310.get("value"),false);},0);}this._refreshState();this._set("displayedValue",this.get("displayedValue"));},postCreate:function(){if(dojo.isIE){setTimeout(dojo.hitch(this,function(){var s=dojo.getComputedStyle(this.domNode);if(s){var ff=s.fontFamily;if(ff){var _311=this.domNode.getElementsByTagName("INPUT");if(_311){for(var i=0;i<_311.length;i++){_311[i].style.fontFamily=ff;}}}}}),0);}this.textbox.setAttribute("value",this.textbox.value);this.inherited(arguments);if(dojo.isMoz||dojo.isOpera){this.connect(this.textbox,"oninput","_onInput");}else{this.connect(this.textbox,"onkeydown","_onInput");this.connect(this.textbox,"onkeyup","_onInput");this.connect(this.textbox,"onpaste","_onInput");this.connect(this.textbox,"oncut","_onInput");}},_blankValue:"",filter:function(val){if(val===null){return this._blankValue;}if(typeof val!="string"){return val;}if(this.trim){val=dojo.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);if(this._selectOnClickHandle){this.disconnect(this._selectOnClickHandle);}if(this.selectOnClick&&dojo.isMoz){this.textbox.selectionStart=this.textbox.selectionEnd=undefined;}this._updatePlaceHolder();},_onFocus:function(by){if(this.disabled||this.readOnly){return;}if(this.selectOnClick&&by=="mouse"){this._selectOnClickHandle=this.connect(this.domNode,"onmouseup",function(){this.disconnect(this._selectOnClickHandle);var _312;if(dojo.isIE){var _313=dojo.doc.selection.createRange();var _314=_313.parentElement();_312=_314==this.textbox&&_313.text.length==0;}else{_312=this.textbox.selectionStart==this.textbox.selectionEnd;}if(_312){dijit.selectInputText(this.textbox);}});}this._updatePlaceHolder();this.inherited(arguments);this._refreshState();},reset:function(){this.textbox.value="";this.inherited(arguments);}});dijit.selectInputText=function(_315,_316,stop){var _317=dojo.global;var _318=dojo.doc;_315=dojo.byId(_315);if(isNaN(_316)){_316=0;}if(isNaN(stop)){stop=_315.value?_315.value.length:0;}dijit.focus(_315);if(_318["selection"]&&dojo.body()["createTextRange"]){if(_315.createTextRange){var r=_315.createTextRange();r.collapse(true);r.moveStart("character",-99999);r.moveStart("character",_316);r.moveEnd("character",stop-_316);r.select();}}else{if(_317["getSelection"]){if(_315.setSelectionRange){_315.setSelectionRange(_316,stop);}}}};}if(!dojo._hasResource["dijit.Tooltip"]){dojo._hasResource["dijit.Tooltip"]=true;dojo.provide("dijit.Tooltip");dojo.declare("dijit._MasterTooltip",[dijit._Widget,dijit._Templated],{duration:dijit.defaultDuration,templateString:dojo.cache("dijit","templates/Tooltip.html","<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\"\n\t><div class=\"dijitTooltipContainer dijitTooltipContents\" dojoAttachPoint=\"containerNode\" role='alert'></div\n\t><div class=\"dijitTooltipConnector\" dojoAttachPoint=\"connectorNode\"></div\n></div>\n"),postCreate:function(){dojo.body().appendChild(this.domNode);this.bgIframe=new dijit.BackgroundIframe(this.domNode);this.fadeIn=dojo.fadeIn({node:this.domNode,duration:this.duration,onEnd:dojo.hitch(this,"_onShow")});this.fadeOut=dojo.fadeOut({node:this.domNode,duration:this.duration,onEnd:dojo.hitch(this,"_onHide")});},show:function(_319,_31a,_31b,rtl){if(this.aroundNode&&this.aroundNode===_31a){return;}this.domNode.width="auto";if(this.fadeOut.status()=="playing"){this._onDeck=arguments;return;}this.containerNode.innerHTML=_319;var pos=dijit.placeOnScreenAroundElement(this.domNode,_31a,dijit.getPopupAroundAlignment((_31b&&_31b.length)?_31b:dijit.Tooltip.defaultPosition,!rtl),dojo.hitch(this,"orient"));dojo.style(this.domNode,"opacity",0);this.fadeIn.play();this.isShowingNow=true;this.aroundNode=_31a;},orient:function(node,_31c,_31d,_31e,_31f){this.connectorNode.style.top="";var _320=_31e.w-this.connectorNode.offsetWidth;node.className="dijitTooltip "+{"BL-TL":"dijitTooltipBelow dijitTooltipABLeft","TL-BL":"dijitTooltipAbove dijitTooltipABLeft","BR-TR":"dijitTooltipBelow dijitTooltipABRight","TR-BR":"dijitTooltipAbove dijitTooltipABRight","BR-BL":"dijitTooltipRight","BL-BR":"dijitTooltipLeft"}[_31c+"-"+_31d];this.domNode.style.width="auto";var size=dojo.contentBox(this.domNode);var _321=Math.min((Math.max(_320,1)),size.w);var _322=_321<size.w;this.domNode.style.width=_321+"px";if(_322){this.containerNode.style.overflow="auto";var _323=this.containerNode.scrollWidth;this.containerNode.style.overflow="visible";if(_323>_321){_323=_323+dojo.style(this.domNode,"paddingLeft")+dojo.style(this.domNode,"paddingRight");this.domNode.style.width=_323+"px";}}if(_31d.charAt(0)=="B"&&_31c.charAt(0)=="B"){var mb=dojo.marginBox(node);var _324=this.connectorNode.offsetHeight;if(mb.h>_31e.h){var _325=_31e.h-(_31f.h/2)-(_324/2);this.connectorNode.style.top=_325+"px";this.connectorNode.style.bottom="";}else{this.connectorNode.style.bottom=Math.min(Math.max(_31f.h/2-_324/2,0),mb.h-_324)+"px";this.connectorNode.style.top="";}}else{this.connectorNode.style.top="";this.connectorNode.style.bottom="";}return Math.max(0,size.w-_320);},_onShow:function(){if(dojo.isIE){this.domNode.style.filter="";}},hide:function(_326){if(this._onDeck&&this._onDeck[1]==_326){this._onDeck=null;}else{if(this.aroundNode===_326){this.fadeIn.stop();this.isShowingNow=false;this.aroundNode=null;this.fadeOut.play();}else{}}},_onHide:function(){this.domNode.style.cssText="";this.containerNode.innerHTML="";if(this._onDeck){this.show.apply(this,this._onDeck);this._onDeck=null;}}});dijit.showTooltip=function(_327,_328,_329,rtl){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.show(_327,_328,_329,rtl);};dijit.hideTooltip=function(_32a){if(!dijit._masterTT){dijit._masterTT=new dijit._MasterTooltip();}return dijit._masterTT.hide(_32a);};dojo.declare("dijit.Tooltip",dijit._Widget,{label:"",showDelay:400,connectId:[],position:[],_setConnectIdAttr:function(_32b){dojo.forEach(this._connections||[],function(_32c){dojo.forEach(_32c,dojo.hitch(this,"disconnect"));},this);var ary=dojo.isArrayLike(_32b)?_32b:(_32b?[_32b]:[]);this._connections=dojo.map(ary,function(id){var node=dojo.byId(id);return node?[this.connect(node,"onmouseenter","_onTargetMouseEnter"),this.connect(node,"onmouseleave","_onTargetMouseLeave"),this.connect(node,"onfocus","_onTargetFocus"),this.connect(node,"onblur","_onTargetBlur")]:[];},this);this._set("connectId",_32b);this._connectIds=ary;},addTarget:function(node){var id=node.id||node;if(dojo.indexOf(this._connectIds,id)==-1){this.set("connectId",this._connectIds.concat(id));}},removeTarget:function(node){var id=node.id||node,idx=dojo.indexOf(this._connectIds,id);if(idx>=0){this._connectIds.splice(idx,1);this.set("connectId",this._connectIds);}},buildRendering:function(){this.inherited(arguments);dojo.addClass(this.domNode,"dijitTooltipData");},startup:function(){this.inherited(arguments);var ids=this.connectId;dojo.forEach(dojo.isArrayLike(ids)?ids:[ids],this.addTarget,this);},_onTargetMouseEnter:function(e){this._onHover(e);},_onTargetMouseLeave:function(e){this._onUnHover(e);},_onTargetFocus:function(e){this._focus=true;this._onHover(e);},_onTargetBlur:function(e){this._focus=false;this._onUnHover(e);},_onHover:function(e){if(!this._showTimer){var _32d=e.target;this._showTimer=setTimeout(dojo.hitch(this,function(){this.open(_32d);}),this.showDelay);}},_onUnHover:function(e){if(this._focus){return;}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}this.close();},open:function(_32e){if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}dijit.showTooltip(this.label||this.domNode.innerHTML,_32e,this.position,!this.isLeftToRight());this._connectNode=_32e;this.onShow(_32e,this.position);},close:function(){if(this._connectNode){dijit.hideTooltip(this._connectNode);delete this._connectNode;this.onHide();}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}},onShow:function(_32f,_330){},onHide:function(){},uninitialize:function(){this.close();this.inherited(arguments);}});dijit.Tooltip.defaultPosition=["after","before"];}if(!dojo._hasResource["dijit.form.ValidationTextBox"]){dojo._hasResource["dijit.form.ValidationTextBox"]=true;dojo.provide("dijit.form.ValidationTextBox");dojo.declare("dijit.form.ValidationTextBox",dijit.form.TextBox,{templateString:dojo.cache("dijit.form","templates/ValidationTextBox.html","<div class=\"dijit dijitReset dijitInlineTable 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\" dojoAttachPoint='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"),baseClass:"dijitTextBox dijitValidationTextBox",required:false,promptMessage:"",invalidMessage:"$_unset_$",missingMessage:"$_unset_$",message:"",constraints:{},regExp:".*",regExpGen:function(_331){return this.regExp;},state:"",tooltipPosition:[],_setValueAttr:function(){this.inherited(arguments);this.validate(this._focused);},validator:function(_332,_333){return (new RegExp("^(?:"+this.regExpGen(_333)+")"+(this.required?"":"?")+"$")).test(_332)&&(!this.required||!this._isEmpty(_332))&&(this._isEmpty(_332)||this.parse(_332,_333)!==undefined);},_isValidSubset:function(){return this.textbox.value.search(this._partialre)==0;},isValid:function(_334){return this.validator(this.textbox.value,this.constraints);},_isEmpty:function(_335){return (this.trim?/^\s*$/:/^$/).test(_335);},getErrorMessage:function(_336){return (this.required&&this._isEmpty(this.textbox.value))?this.missingMessage:this.invalidMessage;},getPromptMessage:function(_337){return this.promptMessage;},_maskValidSubsetError:true,validate:function(_338){var _339="";var _33a=this.disabled||this.isValid(_338);if(_33a){this._maskValidSubsetError=true;}var _33b=this._isEmpty(this.textbox.value);var _33c=!_33a&&_338&&this._isValidSubset();this._set("state",_33a?"":(((((!this._hasBeenBlurred||_338)&&_33b)||_33c)&&this._maskValidSubsetError)?"Incomplete":"Error"));dijit.setWaiState(this.focusNode,"invalid",_33a?"false":"true");if(this.state=="Error"){this._maskValidSubsetError=_338&&_33c;_339=this.getErrorMessage(_338);}else{if(this.state=="Incomplete"){_339=this.getPromptMessage(_338);this._maskValidSubsetError=!this._hasBeenBlurred||_338;}else{if(_33b){_339=this.getPromptMessage(_338);}}}this.set("message",_339);return _33a;},displayMessage:function(_33d){dijit.hideTooltip(this.domNode);if(_33d&&this._focused){dijit.showTooltip(_33d,this.domNode,this.tooltipPosition,!this.isLeftToRight());}},_refreshState:function(){this.validate(this._focused);this.inherited(arguments);},constructor:function(){this.constraints={};},_setConstraintsAttr:function(_33e){if(!_33e.locale&&this.lang){_33e.locale=this.lang;}this._set("constraints",_33e);this._computePartialRE();},_computePartialRE:function(){var p=this.regExpGen(this.constraints);this.regExp=p;var _33f="";if(p!=".*"){this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g,function(re){switch(re.charAt(0)){case "{":case "+":case "?":case "*":case "^":case "$":case "|":case "(":_33f+=re;break;case ")":_33f+="|$)";break;default:_33f+="(?:"+re+"|$)";break;}});}try{"".search(_33f);}catch(e){_33f=this.regExp;console.warn("RegExp error in "+this.declaredClass+": "+this.regExp);}this._partialre="^(?:"+_33f+")$";},postMixInProperties:function(){this.inherited(arguments);this.messages=dojo.i18n.getLocalization("dijit.form","validate",this.lang);if(this.invalidMessage=="$_unset_$"){this.invalidMessage=this.messages.invalidMessage;}if(!this.invalidMessage){this.invalidMessage=this.promptMessage;}if(this.missingMessage=="$_unset_$"){this.missingMessage=this.messages.missingMessage;}if(!this.missingMessage){this.missingMessage=this.invalidMessage;}this._setConstraintsAttr(this.constraints);},_setDisabledAttr:function(_340){this.inherited(arguments);this._refreshState();},_setRequiredAttr:function(_341){this._set("required",_341);dijit.setWaiState(this.focusNode,"required",_341);this._refreshState();},_setMessageAttr:function(_342){this._set("message",_342);this.displayMessage(_342);},reset:function(){this._maskValidSubsetError=true;this.inherited(arguments);},_onBlur:function(){this.displayMessage("");this.inherited(arguments);}});dojo.declare("dijit.form.MappedTextBox",dijit.form.ValidationTextBox,{postMixInProperties:function(){this.inherited(arguments);this.nameAttrSetting="";},serialize:function(val,_343){return val.toString?val.toString():"";},toString:function(){var val=this.filter(this.get("value"));return val!=null?(typeof val=="string"?val:this.serialize(val,this.constraints)):"";},validate:function(){this.valueNode.value=this.toString();return this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);this.valueNode=dojo.place("<input type='hidden'"+(this.name?" name='"+this.name.replace(/'/g,""")+"'":"")+"/>",this.textbox,"after");},reset:function(){this.valueNode.value="";this.inherited(arguments);}});dojo.declare("dijit.form.RangeBoundTextBox",dijit.form.MappedTextBox,{rangeMessage:"",rangeCheck:function(_344,_345){return ("min" in _345?(this.compare(_344,_345.min)>=0):true)&&("max" in _345?(this.compare(_344,_345.max)<=0):true);},isInRange:function(_346){return this.rangeCheck(this.get("value"),this.constraints);},_isDefinitelyOutOfRange:function(){var val=this.get("value");var _347=false;var _348=false;if("min" in this.constraints){var min=this.constraints.min;min=this.compare(val,((typeof min=="number")&&min>=0&&val!=0)?0:min);_347=(typeof min=="number")&&min<0;}if("max" in this.constraints){var max=this.constraints.max;max=this.compare(val,((typeof max!="number")||max>0)?max:0);_348=(typeof max=="number")&&max>0;}return _347||_348;},_isValidSubset:function(){return this.inherited(arguments)&&!this._isDefinitelyOutOfRange();},isValid:function(_349){return this.inherited(arguments)&&((this._isEmpty(this.textbox.value)&&!this.required)||this.isInRange(_349));},getErrorMessage:function(_34a){var v=this.get("value");if(v!==null&&v!==""&&v!==undefined&&(typeof v!="number"||!isNaN(v))&&!this.isInRange(_34a)){return this.rangeMessage;}return this.inherited(arguments);},postMixInProperties:function(){this.inherited(arguments);if(!this.rangeMessage){this.messages=dojo.i18n.getLocalization("dijit.form","validate",this.lang);this.rangeMessage=this.messages.rangeMessage;}},_setConstraintsAttr:function(_34b){this.inherited(arguments);if(this.focusNode){if(this.constraints.min!==undefined){dijit.setWaiState(this.focusNode,"valuemin",this.constraints.min);}else{dijit.removeWaiState(this.focusNode,"valuemin");}if(this.constraints.max!==undefined){dijit.setWaiState(this.focusNode,"valuemax",this.constraints.max);}else{dijit.removeWaiState(this.focusNode,"valuemax");}}},_setValueAttr:function(_34c,_34d){dijit.setWaiState(this.focusNode,"valuenow",_34c);this.inherited(arguments);}});}if(!dojo._hasResource["dijit.form.ComboBox"]){dojo._hasResource["dijit.form.ComboBox"]=true;dojo.provide("dijit.form.ComboBox");dojo.declare("dijit.form.ComboBoxMixin",dijit._HasDropDown,{item:null,pageSize:Infinity,store:null,fetchProperties:{},query:{},autoComplete:true,highlightMatch:"first",searchDelay:100,searchAttr:"name",labelAttr:"",labelType:"text",queryExpr:"${0}*",ignoreCase:true,hasDownArrow:true,templateString:dojo.cache("dijit.form","templates/DropDownBox.html","<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdojoAttachPoint=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"▼ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\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\tdojoAttachPoint=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"),baseClass:"dijitTextBox dijitComboBox",dropDownClass:"dijit.form._ComboBoxMenu",cssStateNodes:{"_buttonNode":"dijitDownArrowButton"},maxHeight:-1,_stopClickEvents:false,_getCaretPos:function(_34e){var pos=0;if(typeof (_34e.selectionStart)=="number"){pos=_34e.selectionStart;}else{if(dojo.isIE){var tr=dojo.doc.selection.createRange().duplicate();var ntr=_34e.createTextRange();tr.move("character",0);ntr.move("character",0);try{ntr.setEndPoint("EndToEnd",tr);pos=String(ntr.text).replace(/\r/g,"").length;}catch(e){}}}return pos;},_setCaretPos:function(_34f,_350){_350=parseInt(_350);dijit.selectInputText(_34f,_350,_350);},_setDisabledAttr:function(_351){this.inherited(arguments);dijit.setWaiState(this.domNode,"disabled",_351);},_abortQuery:function(){if(this.searchTimer){clearTimeout(this.searchTimer);this.searchTimer=null;}if(this._fetchHandle){if(this._fetchHandle.abort){this._fetchHandle.abort();}this._fetchHandle=null;}},_onInput:function(evt){if(!this.searchTimer&&(evt.type=="paste"||evt.type=="input")&&this._lastInput!=this.textbox.value){this.searchTimer=setTimeout(dojo.hitch(this,function(){this._onKey({charOrCode:229});}),100);}this.inherited(arguments);},_onKey:function(evt){var key=evt.charOrCode;if(evt.altKey||((evt.ctrlKey||evt.metaKey)&&(key!="x"&&key!="v"))||key==dojo.keys.SHIFT){return;}var _352=false;var pw=this.dropDown;var dk=dojo.keys;var _353=null;this._prev_key_backspace=false;this._abortQuery();this.inherited(arguments);if(this._opened){_353=pw.getHighlightedOption();}switch(key){case dk.PAGE_DOWN:case dk.DOWN_ARROW:case dk.PAGE_UP:case dk.UP_ARROW:if(this._opened){this._announceOption(_353);}dojo.stopEvent(evt);break;case dk.ENTER:if(_353){if(_353==pw.nextButton){this._nextSearch(1);dojo.stopEvent(evt);break;}else{if(_353==pw.previousButton){this._nextSearch(-1);dojo.stopEvent(evt);break;}}}else{this._setBlurValue();this._setCaretPos(this.focusNode,this.focusNode.value.length);}if(this._opened||this._fetchHandle){evt.preventDefault();}case dk.TAB:var _354=this.get("displayedValue");if(pw&&(_354==pw._messages["previousMessage"]||_354==pw._messages["nextMessage"])){break;}if(_353){this._selectOption();}if(this._opened){this._lastQuery=null;this.closeDropDown();}break;case " ":if(_353){dojo.stopEvent(evt);this._selectOption();this.closeDropDown();}else{_352=true;}break;case dk.DELETE:case dk.BACKSPACE:this._prev_key_backspace=true;_352=true;break;default:_352=typeof key=="string"||key==229;}if(_352){this.item=undefined;this.searchTimer=setTimeout(dojo.hitch(this,"_startSearchFromInput"),1);}},_autoCompleteText:function(text){var fn=this.focusNode;dijit.selectInputText(fn,fn.value.length);var _355=this.ignoreCase?"toLowerCase":"substr";if(text[_355](0).indexOf(this.focusNode.value[_355](0))==0){var cpos=this._getCaretPos(fn);if((cpos+1)>fn.value.length){fn.value=text;dijit.selectInputText(fn,cpos);}}else{fn.value=text;dijit.selectInputText(fn);}},_openResultList:function(_356,_357){this._fetchHandle=null;if(this.disabled||this.readOnly||(_357.query[this.searchAttr]!=this._lastQuery)){return;}var _358=this.dropDown._highlighted_option&&dojo.hasClass(this.dropDown._highlighted_option,"dijitMenuItemSelected");this.dropDown.clearResultList();if(!_356.length&&!this._maxOptions){this.closeDropDown();return;}_357._maxOptions=this._maxOptions;var _359=this.dropDown.createOptions(_356,_357,dojo.hitch(this,"_getMenuLabelFromItem"));this._showResultList();if(_357.direction){if(1==_357.direction){this.dropDown.highlightFirstOption();}else{if(-1==_357.direction){this.dropDown.highlightLastOption();}}if(_358){this._announceOption(this.dropDown.getHighlightedOption());}}else{if(this.autoComplete&&!this._prev_key_backspace&&!/^[*]+$/.test(_357.query[this.searchAttr])){this._announceOption(_359[1]);}}},_showResultList:function(){this.closeDropDown(true);this.displayMessage("");this.openDropDown();dijit.setWaiState(this.domNode,"expanded","true");},loadDropDown:function(_35a){this._startSearchAll();},isLoaded:function(){return false;},closeDropDown:function(){this._abortQuery();if(this._opened){this.inherited(arguments);dijit.setWaiState(this.domNode,"expanded","false");dijit.removeWaiState(this.focusNode,"activedescendant");}},_setBlurValue:function(){var _35b=this.get("displayedValue");var pw=this.dropDown;if(pw&&(_35b==pw._messages["previousMessage"]||_35b==pw._messages["nextMessage"])){this._setValueAttr(this._lastValueReported,true);}else{if(typeof this.item=="undefined"){this.item=null;this.set("displayedValue",_35b);}else{if(this.value!=this._lastValueReported){dijit.form._FormValueWidget.prototype._setValueAttr.call(this,this.value,true);}this._refreshState();}}},_onBlur:function(){this.closeDropDown();this.inherited(arguments);},_setItemAttr:function(item,_35c,_35d){if(!_35d){_35d=this.store.getValue(item,this.searchAttr);}var _35e=this._getValueField()!=this.searchAttr?this.store.getIdentity(item):_35d;this._set("item",item);dijit.form.ComboBox.superclass._setValueAttr.call(this,_35e,_35c,_35d);},_announceOption:function(node){if(!node){return;}var _35f;if(node==this.dropDown.nextButton||node==this.dropDown.previousButton){_35f=node.innerHTML;this.item=undefined;this.value="";}else{_35f=this.store.getValue(node.item,this.searchAttr).toString();this.set("item",node.item,false,_35f);}this.focusNode.value=this.focusNode.value.substring(0,this._lastInput.length);dijit.setWaiState(this.focusNode,"activedescendant",dojo.attr(node,"id"));this._autoCompleteText(_35f);},_selectOption:function(evt){if(evt){this._announceOption(evt.target);}this.closeDropDown();this._setCaretPos(this.focusNode,this.focusNode.value.length);dijit.form._FormValueWidget.prototype._setValueAttr.call(this,this.value,true);},_startSearchAll:function(){this._startSearch("");},_startSearchFromInput:function(){this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g,"\\$1"));},_getQueryString:function(text){return dojo.string.substitute(this.queryExpr,[text]);},_startSearch:function(key){if(!this.dropDown){var _360=this.id+"_popup",_361=dojo.getObject(this.dropDownClass,false);this.dropDown=new _361({onChange:dojo.hitch(this,this._selectOption),id:_360,dir:this.dir});dijit.removeWaiState(this.focusNode,"activedescendant");dijit.setWaiState(this.textbox,"owns",_360);}var _362=dojo.clone(this.query);this._lastInput=key;this._lastQuery=_362[this.searchAttr]=this._getQueryString(key);this.searchTimer=setTimeout(dojo.hitch(this,function(_363,_364){this.searchTimer=null;var _365={queryOptions:{ignoreCase:this.ignoreCase,deep:true},query:_363,onBegin:dojo.hitch(this,"_setMaxOptions"),onComplete:dojo.hitch(this,"_openResultList"),onError:function(_366){_364._fetchHandle=null;console.error("dijit.form.ComboBox: "+_366);_364.closeDropDown();},start:0,count:this.pageSize};dojo.mixin(_365,_364.fetchProperties);this._fetchHandle=_364.store.fetch(_365);var _367=function(_368,_369){_368.start+=_368.count*_369;_368.direction=_369;this._fetchHandle=this.store.fetch(_368);this.focus();};this._nextSearch=this.dropDown.onPage=dojo.hitch(this,_367,this._fetchHandle);},_362,this),this.searchDelay);},_setMaxOptions:function(size,_36a){this._maxOptions=size;},_getValueField:function(){return this.searchAttr;},constructor:function(){this.query={};this.fetchProperties={};},postMixInProperties:function(){if(!this.store){var _36b=this.srcNodeRef;this.store=new dijit.form._ComboBoxDataStore(_36b);if(!("value" in this.params)){var item=(this.item=this.store.fetchSelectedItem());if(item){var _36c=this._getValueField();this.value=this.store.getValue(item,_36c);}}}this.inherited(arguments);},postCreate:function(){var _36d=dojo.query("label[for=\""+this.id+"\"]");if(_36d.length){_36d[0].id=(this.id+"_label");dijit.setWaiState(this.domNode,"labelledby",_36d[0].id);}this.inherited(arguments);},_setHasDownArrowAttr:function(val){this.hasDownArrow=val;this._buttonNode.style.display=val?"":"none";},_getMenuLabelFromItem:function(item){var _36e=this.labelFunc(item,this.store),_36f=this.labelType;if(this.highlightMatch!="none"&&this.labelType=="text"&&this._lastInput){_36e=this.doHighlight(_36e,this._escapeHtml(this._lastInput));_36f="html";}return {html:_36f=="html",label:_36e};},doHighlight:function(_370,find){var _371=(this.ignoreCase?"i":"")+(this.highlightMatch=="all"?"g":""),i=this.queryExpr.indexOf("${0}");find=dojo.regexp.escapeString(find);return this._escapeHtml(_370).replace(new RegExp((i==0?"^":"")+"("+find+")"+(i==(this.queryExpr.length-4)?"$":""),_371),"<span class=\"dijitComboBoxHighlightMatch\">$1</span>");},_escapeHtml:function(str){str=String(str).replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,""");return str;},reset:function(){this.item=null;this.inherited(arguments);},labelFunc:function(item,_372){return _372.getValue(item,this.labelAttr||this.searchAttr).toString();}});dojo.declare("dijit.form._ComboBoxMenu",[dijit._Widget,dijit._Templated,dijit._CssStateMixin],{templateString:"<ul class='dijitReset dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' style='overflow: \"auto\"; overflow-x: \"hidden\";'>"+"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton' role='option'></li>"+"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton' role='option'></li>"+"</ul>",_messages:null,baseClass:"dijitComboBoxMenu",postMixInProperties:function(){this.inherited(arguments);this._messages=dojo.i18n.getLocalization("dijit.form","ComboBox",this.lang);},buildRendering:function(){this.inherited(arguments);this.previousButton.innerHTML=this._messages["previousMessage"];this.nextButton.innerHTML=this._messages["nextMessage"];},_setValueAttr:function(_373){this.value=_373;this.onChange(_373);},onChange:function(_374){},onPage:function(_375){},onClose:function(){this._blurOptionNode();},_createOption:function(item,_376){var _377=dojo.create("li",{"class":"dijitReset dijitMenuItem"+(this.isLeftToRight()?"":" dijitMenuItemRtl"),role:"option"});var _378=_376(item);if(_378.html){_377.innerHTML=_378.label;}else{_377.appendChild(dojo.doc.createTextNode(_378.label));}if(_377.innerHTML==""){_377.innerHTML=" ";}_377.item=item;return _377;},createOptions:function(_379,_37a,_37b){this.previousButton.style.display=(_37a.start==0)?"none":"";dojo.attr(this.previousButton,"id",this.id+"_prev");dojo.forEach(_379,function(item,i){var _37c=this._createOption(item,_37b);dojo.attr(_37c,"id",this.id+i);this.domNode.insertBefore(_37c,this.nextButton);},this);var _37d=false;if(_37a._maxOptions&&_37a._maxOptions!=-1){if((_37a.start+_37a.count)<_37a._maxOptions){_37d=true;}else{if((_37a.start+_37a.count)>_37a._maxOptions&&_37a.count==_379.length){_37d=true;}}}else{if(_37a.count==_379.length){_37d=true;}}this.nextButton.style.display=_37d?"":"none";dojo.attr(this.nextButton,"id",this.id+"_next");return this.domNode.childNodes;},clearResultList:function(){while(this.domNode.childNodes.length>2){this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]);}this._blurOptionNode();},_onMouseDown:function(evt){dojo.stopEvent(evt);},_onMouseUp:function(evt){if(evt.target===this.domNode||!this._highlighted_option){return;}else{if(evt.target==this.previousButton){this._blurOptionNode();this.onPage(-1);}else{if(evt.target==this.nextButton){this._blurOptionNode();this.onPage(1);}else{var tgt=evt.target;while(!tgt.item){tgt=tgt.parentNode;}this._setValueAttr({target:tgt},true);}}}},_onMouseOver:function(evt){if(evt.target===this.domNode){return;}var tgt=evt.target;if(!(tgt==this.previousButton||tgt==this.nextButton)){while(!tgt.item){tgt=tgt.parentNode;}}this._focusOptionNode(tgt);},_onMouseOut:function(evt){if(evt.target===this.domNode){return;}this._blurOptionNode();},_focusOptionNode:function(node){if(this._highlighted_option!=node){this._blurOptionNode();this._highlighted_option=node;dojo.addClass(this._highlighted_option,"dijitMenuItemSelected");}},_blurOptionNode:function(){if(this._highlighted_option){dojo.removeClass(this._highlighted_option,"dijitMenuItemSelected");this._highlighted_option=null;}},_highlightNextOption:function(){if(!this.getHighlightedOption()){var fc=this.domNode.firstChild;this._focusOptionNode(fc.style.display=="none"?fc.nextSibling:fc);}else{var ns=this._highlighted_option.nextSibling;if(ns&&ns.style.display!="none"){this._focusOptionNode(ns);}else{this.highlightFirstOption();}}dojo.window.scrollIntoView(this._highlighted_option);},highlightFirstOption:function(){var _37e=this.domNode.firstChild;var _37f=_37e.nextSibling;this._focusOptionNode(_37f.style.display=="none"?_37e:_37f);dojo.window.scrollIntoView(this._highlighted_option);},highlightLastOption:function(){this._focusOptionNode(this.domNode.lastChild.previousSibling);dojo.window.scrollIntoView(this._highlighted_option);},_highlightPrevOption:function(){if(!this.getHighlightedOption()){var lc=this.domNode.lastChild;this._focusOptionNode(lc.style.display=="none"?lc.previousSibling:lc);}else{var ps=this._highlighted_option.previousSibling;if(ps&&ps.style.display!="none"){this._focusOptionNode(ps);}else{this.highlightLastOption();}}dojo.window.scrollIntoView(this._highlighted_option);},_page:function(up){var _380=0;var _381=this.domNode.scrollTop;var _382=dojo.style(this.domNode,"height");if(!this.getHighlightedOption()){this._highlightNextOption();}while(_380<_382){if(up){if(!this.getHighlightedOption().previousSibling||this._highlighted_option.previousSibling.style.display=="none"){break;}this._highlightPrevOption();}else{if(!this.getHighlightedOption().nextSibling||this._highlighted_option.nextSibling.style.display=="none"){break;}this._highlightNextOption();}var _383=this.domNode.scrollTop;_380+=(_383-_381)*(up?-1:1);_381=_383;}},pageUp:function(){this._page(true);},pageDown:function(){this._page(false);},getHighlightedOption:function(){var ho=this._highlighted_option;return (ho&&ho.parentNode)?ho:null;},handleKey:function(evt){switch(evt.charOrCode){case dojo.keys.DOWN_ARROW:this._highlightNextOption();return false;case dojo.keys.PAGE_DOWN:this.pageDown();return false;case dojo.keys.UP_ARROW:this._highlightPrevOption();return false;case dojo.keys.PAGE_UP:this.pageUp();return false;default:return true;}}});dojo.declare("dijit.form.ComboBox",[dijit.form.ValidationTextBox,dijit.form.ComboBoxMixin],{_setValueAttr:function(_384,_385,_386){this._set("item",null);if(!_384){_384="";}dijit.form.ValidationTextBox.prototype._setValueAttr.call(this,_384,_385,_386);}});dojo.declare("dijit.form._ComboBoxDataStore",null,{constructor:function(root){this.root=root;if(root.tagName!="SELECT"&&root.firstChild){root=dojo.query("select",root);if(root.length>0){root=root[0];}else{this.root.innerHTML="<SELECT>"+this.root.innerHTML+"</SELECT>";root=this.root.firstChild;}this.root=root;}dojo.query("> option",root).forEach(function(node){node.innerHTML=dojo.trim(node.innerHTML);});},getValue:function(item,_387,_388){return (_387=="value")?item.value:(item.innerText||item.textContent||"");},isItemLoaded:function(_389){return true;},getFeatures:function(){return {"dojo.data.api.Read":true,"dojo.data.api.Identity":true};},_fetchItems:function(args,_38a,_38b){if(!args.query){args.query={};}if(!args.query.name){args.query.name="";}if(!args.queryOptions){args.queryOptions={};}var _38c=dojo.data.util.filter.patternToRegExp(args.query.name,args.queryOptions.ignoreCase),_38d=dojo.query("> option",this.root).filter(function(_38e){return (_38e.innerText||_38e.textContent||"").match(_38c);});if(args.sort){_38d.sort(dojo.data.util.sorter.createSortFunction(args.sort,this));}_38a(_38d,args);},close:function(_38f){return;},getLabel:function(item){return item.innerHTML;},getIdentity:function(item){return dojo.attr(item,"value");},fetchItemByIdentity:function(args){var item=dojo.query("> option[value='"+args.identity+"']",this.root)[0];args.onItem(item);},fetchSelectedItem:function(){var root=this.root,si=root.selectedIndex;return typeof si=="number"?dojo.query("> option:nth-child("+(si!=-1?si+1:1)+")",root)[0]:null;}});dojo.extend(dijit.form._ComboBoxDataStore,dojo.data.util.simpleFetch);}if(!dojo._hasResource["dijit.form.FilteringSelect"]){dojo._hasResource["dijit.form.FilteringSelect"]=true;dojo.provide("dijit.form.FilteringSelect");dojo.declare("dijit.form.FilteringSelect",[dijit.form.MappedTextBox,dijit.form.ComboBoxMixin],{required:true,_lastDisplayedValue:"",_isValidSubset:function(){return this._opened;},isValid:function(){return this.item||(!this.required&&this.get("displayedValue")=="");},_refreshState:function(){if(!this.searchTimer){this.inherited(arguments);}},_callbackSetLabel:function(_390,_391,_392){if((_391&&_391.query[this.searchAttr]!=this._lastQuery)||(!_391&&_390.length&&this.store.getIdentity(_390[0])!=this._lastQuery)){return;}if(!_390.length){this.valueNode.value="";dijit.form.TextBox.superclass._setValueAttr.call(this,"",_392||(_392===undefined&&!this._focused));this._set("item",null);this.validate(this._focused);}else{this.set("item",_390[0],_392);}},_openResultList:function(_393,_394){if(_394.query[this.searchAttr]!=this._lastQuery){return;}dijit.form.ComboBoxMixin.prototype._openResultList.apply(this,arguments);if(this.item===undefined){this.validate(true);}},_getValueAttr:function(){return this.valueNode.value;},_getValueField:function(){return "value";},_setValueAttr:function(_395,_396){if(!this._onChangeActive){_396=null;}this._lastQuery=_395;if(_395===null||_395===""){this._setDisplayedValueAttr("",_396);return;}var self=this;this.store.fetchItemByIdentity({identity:_395,onItem:function(item){self._callbackSetLabel(item?[item]:[],undefined,_396);}});},_setItemAttr:function(item,_397,_398){this.inherited(arguments);this.valueNode.value=this.value;this._lastDisplayedValue=this.textbox.value;},_getDisplayQueryString:function(text){return text.replace(/([\\\*\?])/g,"\\$1");},_setDisplayedValueAttr:function(_399,_39a){if(_399==null){_399="";}if(!this._created){if(!("displayedValue" in this.params)){return;}_39a=false;}if(this.store){this.closeDropDown();var _39b=dojo.clone(this.query);this._lastQuery=_39b[this.searchAttr]=this._getDisplayQueryString(_399);this.textbox.value=_399;this._lastDisplayedValue=_399;this._set("displayedValue",_399);var _39c=this;var _39d={query:_39b,queryOptions:{ignoreCase:this.ignoreCase,deep:true},onComplete:function(_39e,_39f){_39c._fetchHandle=null;dojo.hitch(_39c,"_callbackSetLabel")(_39e,_39f,_39a);},onError:function(_3a0){_39c._fetchHandle=null;console.error("dijit.form.FilteringSelect: "+_3a0);dojo.hitch(_39c,"_callbackSetLabel")([],undefined,false);}};dojo.mixin(_39d,this.fetchProperties);this._fetchHandle=this.store.fetch(_39d);}},undo:function(){this.set("displayedValue",this._lastDisplayedValue);}});}if(!dojo._hasResource["dijit.form.Form"]){dojo._hasResource["dijit.form.Form"]=true;dojo.provide("dijit.form.Form");dojo.declare("dijit.form.Form",[dijit._Widget,dijit._Templated,dijit.form._FormMixin,dijit.layout._ContentPaneResizeMixin],{name:"",action:"",method:"",encType:"","accept-charset":"",accept:"",target:"",templateString:"<form dojoAttachPoint='containerNode' dojoAttachEvent='onreset:_onReset,onsubmit:_onSubmit' ${!nameAttrSetting}></form>",attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{action:"",method:"",encType:"","accept-charset":"",accept:"",target:""}),postMixInProperties:function(){this.nameAttrSetting=this.name?("name='"+this.name+"'"):"";this.inherited(arguments);},execute:function(_3a1){},onExecute:function(){},_setEncTypeAttr:function(_3a2){this.encType=_3a2;dojo.attr(this.domNode,"encType",_3a2);if(dojo.isIE){this.domNode.encoding=_3a2;}},postCreate:function(){if(dojo.isIE&&this.srcNodeRef&&this.srcNodeRef.attributes){var item=this.srcNodeRef.attributes.getNamedItem("encType");if(item&&!item.specified&&(typeof item.value=="string")){this.set("encType",item.value);}}this.inherited(arguments);},reset:function(e){var faux={returnValue:true,preventDefault:function(){this.returnValue=false;},stopPropagation:function(){},currentTarget:e?e.target:this.domNode,target:e?e.target:this.domNode};if(!(this.onReset(faux)===false)&&faux.returnValue){this.inherited(arguments,[]);}},onReset:function(e){return true;},_onReset:function(e){this.reset(e);dojo.stopEvent(e);return false;},_onSubmit:function(e){var fp=dijit.form.Form.prototype;if(this.execute!=fp.execute||this.onExecute!=fp.onExecute){dojo.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.","","2.0");this.onExecute();this.execute(this.getValues());}if(this.onSubmit(e)===false){dojo.stopEvent(e);}},onSubmit:function(e){return this.isValid();},submit:function(){if(!(this.onSubmit()===false)){this.containerNode.submit();}}});}if(!dojo._hasResource["dijit.form.RadioButton"]){dojo._hasResource["dijit.form.RadioButton"]=true;dojo.provide("dijit.form.RadioButton");}if(!dojo._hasResource["dijit.form._FormSelectWidget"]){dojo._hasResource["dijit.form._FormSelectWidget"]=true;dojo.provide("dijit.form._FormSelectWidget");dojo.declare("dijit.form._FormSelectWidget",dijit.form._FormValueWidget,{multiple:false,options:null,store:null,query:null,queryOptions:null,onFetch:null,sortByLabel:true,loadChildrenOnOpen:false,getOptions:function(_3a3){var _3a4=_3a3,opts=this.options||[],l=opts.length;if(_3a4===undefined){return opts;}if(dojo.isArray(_3a4)){return dojo.map(_3a4,"return this.getOptions(item);",this);}if(dojo.isObject(_3a3)){if(!dojo.some(this.options,function(o,idx){if(o===_3a4||(o.value&&o.value===_3a4.value)){_3a4=idx;return true;}return false;})){_3a4=-1;}}if(typeof _3a4=="string"){for(var i=0;i<l;i++){if(opts[i].value===_3a4){_3a4=i;break;}}}if(typeof _3a4=="number"&&_3a4>=0&&_3a4<l){return this.options[_3a4];}return null;},addOption:function(_3a5){if(!dojo.isArray(_3a5)){_3a5=[_3a5];}dojo.forEach(_3a5,function(i){if(i&&dojo.isObject(i)){this.options.push(i);}},this);this._loadChildren();},removeOption:function(_3a6){if(!dojo.isArray(_3a6)){_3a6=[_3a6];}var _3a7=this.getOptions(_3a6);dojo.forEach(_3a7,function(i){if(i){this.options=dojo.filter(this.options,function(node,idx){return (node.value!==i.value||node.label!==i.label);});this._removeOptionItem(i);}},this);this._loadChildren();},updateOption:function(_3a8){if(!dojo.isArray(_3a8)){_3a8=[_3a8];}dojo.forEach(_3a8,function(i){var _3a9=this.getOptions(i),k;if(_3a9){for(k in i){_3a9[k]=i[k];}}},this);this._loadChildren();},setStore:function(_3aa,_3ab,_3ac){var _3ad=this.store;_3ac=_3ac||{};if(_3ad!==_3aa){dojo.forEach(this._notifyConnections||[],dojo.disconnect);delete this._notifyConnections;if(_3aa&&_3aa.getFeatures()["dojo.data.api.Notification"]){this._notifyConnections=[dojo.connect(_3aa,"onNew",this,"_onNewItem"),dojo.connect(_3aa,"onDelete",this,"_onDeleteItem"),dojo.connect(_3aa,"onSet",this,"_onSetItem")];}this._set("store",_3aa);}this._onChangeActive=false;if(this.options&&this.options.length){this.removeOption(this.options);}if(_3aa){this._loadingStore=true;_3aa.fetch(dojo.delegate(_3ac,{onComplete:function(_3ae,opts){if(this.sortByLabel&&!_3ac.sort&&_3ae.length){_3ae.sort(dojo.data.util.sorter.createSortFunction([{attribute:_3aa.getLabelAttributes(_3ae[0])[0]}],_3aa));}if(_3ac.onFetch){_3ae=_3ac.onFetch.call(this,_3ae,opts);}dojo.forEach(_3ae,function(i){this._addOptionForItem(i);},this);this._loadingStore=false;this.set("value","_pendingValue" in this?this._pendingValue:_3ab);delete this._pendingValue;if(!this.loadChildrenOnOpen){this._loadChildren();}else{this._pseudoLoadChildren(_3ae);}this._fetchedWith=opts;this._lastValueReported=this.multiple?[]:null;this._onChangeActive=true;this.onSetStore();this._handleOnChange(this.value);},scope:this}));}else{delete this._fetchedWith;}return _3ad;},_setValueAttr:function(_3af,_3b0){if(this._loadingStore){this._pendingValue=_3af;return;}var opts=this.getOptions()||[];if(!dojo.isArray(_3af)){_3af=[_3af];}dojo.forEach(_3af,function(i,idx){if(!dojo.isObject(i)){i=i+"";}if(typeof i==="string"){_3af[idx]=dojo.filter(opts,function(node){return node.value===i;})[0]||{value:"",label:""};}},this);_3af=dojo.filter(_3af,function(i){return i&&i.value;});if(!this.multiple&&(!_3af[0]||!_3af[0].value)&&opts.length){_3af[0]=opts[0];}dojo.forEach(opts,function(i){i.selected=dojo.some(_3af,function(v){return v.value===i.value;});});var val=dojo.map(_3af,function(i){return i.value;}),disp=dojo.map(_3af,function(i){return i.label;});this._set("value",this.multiple?val:val[0]);this._setDisplay(this.multiple?disp:disp[0]);this._updateSelection();this._handleOnChange(this.value,_3b0);},_getDisplayedValueAttr:function(){var val=this.get("value");if(!dojo.isArray(val)){val=[val];}var ret=dojo.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(){if(this._loadingStore){return;}dojo.forEach(this._getChildren(),function(_3b1){_3b1.destroyRecursive();});dojo.forEach(this.options,this._addOptionItem,this);this._updateSelection();},_updateSelection:function(){this._set("value",this._getValueFromOpts());var val=this.value;if(!dojo.isArray(val)){val=[val];}if(val&&val[0]){dojo.forEach(this._getChildren(),function(_3b2){var _3b3=dojo.some(val,function(v){return _3b2.option&&(v===_3b2.option.value);});dojo.toggleClass(_3b2.domNode,this.baseClass+"SelectedOption",_3b3);dijit.setWaiState(_3b2.domNode,"selected",_3b3);},this);}},_getValueFromOpts:function(){var opts=this.getOptions()||[];if(!this.multiple&&opts.length){var opt=dojo.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){return dojo.map(dojo.filter(opts,function(i){return i.selected;}),function(i){return i.value;})||[];}}return "";},_onNewItem:function(item,_3b4){if(!_3b4||!_3b4.parent){this._addOptionForItem(item);}},_onDeleteItem:function(item){var _3b5=this.store;this.removeOption(_3b5.getIdentity(item));},_onSetItem:function(item){this.updateOption(this._getOptionObjForItem(item));},_getOptionObjForItem:function(item){var _3b6=this.store,_3b7=_3b6.getLabel(item),_3b8=(_3b7?_3b6.getIdentity(item):null);return {value:_3b8,label:_3b7,item:item};},_addOptionForItem:function(item){var _3b9=this.store;if(!_3b9.isItemLoaded(item)){_3b9.loadItem({item:item,onComplete:function(i){this._addOptionForItem(item);},scope:this});return;}var _3ba=this._getOptionObjForItem(item);this.addOption(_3ba);},constructor:function(_3bb){this._oValue=(_3bb||{}).value||null;},buildRendering:function(){this.inherited(arguments);dojo.setSelectable(this.focusNode,false);},_fillContent:function(){var opts=this.options;if(!opts){opts=this.options=this.srcNodeRef?dojo.query(">",this.srcNodeRef).map(function(node){if(node.getAttribute("type")==="separator"){return {value:"",label:"",selected:false,disabled:false};}return {value:(node.getAttribute("data-"+dojo._scopeName+"-value")||node.getAttribute("value")),label:String(node.innerHTML),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(){this.inherited(arguments);this.connect(this,"onChange","_updateSelection");this.connect(this,"startup","_loadChildren");this._setValueAttr(this.value,null);},startup:function(){this.inherited(arguments);var _3bc=this.store,_3bd={};dojo.forEach(["query","queryOptions","onFetch"],function(i){if(this[i]){_3bd[i]=this[i];}delete this[i];},this);if(_3bc&&_3bc.getFeatures()["dojo.data.api.Identity"]){this.store=null;this.setStore(_3bc,this._oValue,_3bd);}},destroy:function(){dojo.forEach(this._notifyConnections||[],dojo.disconnect);this.inherited(arguments);},_addOptionItem:function(_3be){},_removeOptionItem:function(_3bf){},_setDisplay:function(_3c0){},_getChildren:function(){return [];},_getSelectedOptionsAttr:function(){return this.getOptions(this.get("value"));},_pseudoLoadChildren:function(_3c1){},onSetStore:function(){}});}if(!dojo._hasResource["dijit._KeyNavContainer"]){dojo._hasResource["dijit._KeyNavContainer"]=true;dojo.provide("dijit._KeyNavContainer");dojo.declare("dijit._KeyNavContainer",dijit._Container,{tabIndex:"0",_keyNavCodes:{},connectKeyNavHandlers:function(_3c2,_3c3){var _3c4=(this._keyNavCodes={});var prev=dojo.hitch(this,this.focusPrev);var next=dojo.hitch(this,this.focusNext);dojo.forEach(_3c2,function(code){_3c4[code]=prev;});dojo.forEach(_3c3,function(code){_3c4[code]=next;});_3c4[dojo.keys.HOME]=dojo.hitch(this,"focusFirstChild");_3c4[dojo.keys.END]=dojo.hitch(this,"focusLastChild");this.connect(this.domNode,"onkeypress","_onContainerKeypress");this.connect(this.domNode,"onfocus","_onContainerFocus");},startupKeyNavChildren:function(){dojo.forEach(this.getChildren(),dojo.hitch(this,"_startupChild"));},addChild:function(_3c5,_3c6){dijit._KeyNavContainer.superclass.addChild.apply(this,arguments);this._startupChild(_3c5);},focus:function(){this.focusFirstChild();},focusFirstChild:function(){var _3c7=this._getFirstFocusableChild();if(_3c7){this.focusChild(_3c7);}},focusLastChild:function(){var _3c8=this._getLastFocusableChild();if(_3c8){this.focusChild(_3c8);}},focusNext:function(){var _3c9=this._getNextFocusableChild(this.focusedChild,1);this.focusChild(_3c9);},focusPrev:function(){var _3ca=this._getNextFocusableChild(this.focusedChild,-1);this.focusChild(_3ca,true);},focusChild:function(_3cb,last){if(this.focusedChild&&_3cb!==this.focusedChild){this._onChildBlur(this.focusedChild);}_3cb.set("tabIndex",this.tabIndex);_3cb.focus(last?"end":"start");this._set("focusedChild",_3cb);},_startupChild:function(_3cc){_3cc.set("tabIndex","-1");this.connect(_3cc,"_onFocus",function(){_3cc.set("tabIndex",this.tabIndex);});this.connect(_3cc,"_onBlur",function(){_3cc.set("tabIndex","-1");});},_onContainerFocus:function(evt){if(evt.target!==this.domNode){return;}this.focusFirstChild();dojo.attr(this.domNode,"tabIndex","-1");},_onBlur:function(evt){if(this.tabIndex){dojo.attr(this.domNode,"tabIndex",this.tabIndex);}this.inherited(arguments);},_onContainerKeypress:function(evt){if(evt.ctrlKey||evt.altKey){return;}var func=this._keyNavCodes[evt.charOrCode];if(func){func();dojo.stopEvent(evt);}},_onChildBlur:function(_3cd){},_getFirstFocusableChild:function(){return this._getNextFocusableChild(null,1);},_getLastFocusableChild:function(){return this._getNextFocusableChild(null,-1);},_getNextFocusableChild:function(_3ce,dir){if(_3ce){_3ce=this._getSiblingOfChild(_3ce,dir);}var _3cf=this.getChildren();for(var i=0;i<_3cf.length;i++){if(!_3ce){_3ce=_3cf[(dir>0)?0:(_3cf.length-1)];}if(_3ce.isFocusable()){return _3ce;}_3ce=this._getSiblingOfChild(_3ce,dir);}return null;}});}if(!dojo._hasResource["dijit.MenuItem"]){dojo._hasResource["dijit.MenuItem"]=true;dojo.provide("dijit.MenuItem");dojo.declare("dijit.MenuItem",[dijit._Widget,dijit._Templated,dijit._Contained,dijit._CssStateMixin],{templateString:dojo.cache("dijit","templates/MenuItem.html","<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" role=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" role=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitMenuItemIcon\" dojoAttachPoint=\"iconNode\"/>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojoAttachPoint=\"containerNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" dojoAttachPoint=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" role=\"presentation\">\n\t\t<div dojoAttachPoint=\"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"),attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{label:{node:"containerNode",type:"innerHTML"},iconClass:{node:"iconNode",type:"class"}}),baseClass:"dijitMenuItem",label:"",iconClass:"",accelKey:"",disabled:false,_fillContent:function(_3d0){if(_3d0&&!("label" in this.params)){this.set("label",_3d0.innerHTML);}},buildRendering:function(){this.inherited(arguments);var _3d1=this.id+"_text";dojo.attr(this.containerNode,"id",_3d1);if(this.accelKeyNode){dojo.attr(this.accelKeyNode,"id",this.id+"_accel");_3d1+=" "+this.id+"_accel";}dijit.setWaiState(this.domNode,"labelledby",_3d1);dojo.setSelectable(this.domNode,false);},_onHover:function(){this.getParent().onItemHover(this);},_onUnhover:function(){this.getParent().onItemUnhover(this);this._set("hovering",false);},_onClick:function(evt){this.getParent().onItemClick(this,evt);dojo.stopEvent(evt);},onClick:function(evt){},focus:function(){try{if(dojo.isIE==8){this.containerNode.focus();}dijit.focus(this.focusNode);}catch(e){}},_onFocus:function(){this._setSelected(true);this.getParent()._onItemFocus(this);this.inherited(arguments);},_setSelected:function(_3d2){dojo.toggleClass(this.domNode,"dijitMenuItemSelected",_3d2);},setLabel:function(_3d3){dojo.deprecated("dijit.MenuItem.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_3d3);},setDisabled:function(_3d4){dojo.deprecated("dijit.Menu.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_3d4);},_setDisabledAttr:function(_3d5){dijit.setWaiState(this.focusNode,"disabled",_3d5?"true":"false");this._set("disabled",_3d5);},_setAccelKeyAttr:function(_3d6){this.accelKeyNode.style.display=_3d6?"":"none";this.accelKeyNode.innerHTML=_3d6;dojo.attr(this.containerNode,"colSpan",_3d6?"1":"2");this._set("accelKey",_3d6);}});}if(!dojo._hasResource["dijit.PopupMenuItem"]){dojo._hasResource["dijit.PopupMenuItem"]=true;dojo.provide("dijit.PopupMenuItem");dojo.declare("dijit.PopupMenuItem",dijit.MenuItem,{_fillContent:function(){if(this.srcNodeRef){var _3d7=dojo.query("*",this.srcNodeRef);dijit.PopupMenuItem.superclass._fillContent.call(this,_3d7[0]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}this.inherited(arguments);if(!this.popup){var node=dojo.query("[widgetId]",this.dropDownContainer)[0];this.popup=dijit.byNode(node);}dojo.body().appendChild(this.popup.domNode);this.popup.startup();this.popup.domNode.style.display="none";if(this.arrowWrapper){dojo.style(this.arrowWrapper,"visibility","");}dijit.setWaiState(this.focusNode,"haspopup","true");},destroyDescendants:function(){if(this.popup){if(!this.popup._destroyed){this.popup.destroyRecursive();}delete this.popup;}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.CheckedMenuItem"]){dojo._hasResource["dijit.CheckedMenuItem"]=true;dojo.provide("dijit.CheckedMenuItem");dojo.declare("dijit.CheckedMenuItem",dijit.MenuItem,{templateString:dojo.cache("dijit","templates/CheckedMenuItem.html","<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" role=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" role=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" dojoAttachPoint=\"iconNode\"/>\n\t\t<span class=\"dijitCheckedMenuItemIconChar\">✓</span>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojoAttachPoint=\"containerNode,labelNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" dojoAttachPoint=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" role=\"presentation\"> </td>\n</tr>\n"),checked:false,_setCheckedAttr:function(_3d8){dojo.toggleClass(this.domNode,"dijitCheckedMenuItemChecked",_3d8);dijit.setWaiState(this.domNode,"checked",_3d8);this._set("checked",_3d8);},onChange:function(_3d9){},_onClick:function(e){if(!this.disabled){this.set("checked",!this.checked);this.onChange(this.checked);}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.MenuSeparator"]){dojo._hasResource["dijit.MenuSeparator"]=true;dojo.provide("dijit.MenuSeparator");dojo.declare("dijit.MenuSeparator",[dijit._Widget,dijit._Templated,dijit._Contained],{templateString:dojo.cache("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>\n"),buildRendering:function(){this.inherited(arguments);dojo.setSelectable(this.domNode,false);},isFocusable:function(){return false;}});}if(!dojo._hasResource["dijit.Menu"]){dojo._hasResource["dijit.Menu"]=true;dojo.provide("dijit.Menu");dojo.declare("dijit._MenuBase",[dijit._Widget,dijit._Templated,dijit._KeyNavContainer],{parentMenu:null,popupDelay:500,startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),function(_3da){_3da.startup();});this.startupKeyNavChildren();this.inherited(arguments);},onExecute:function(){},onCancel:function(_3db){},_moveToPopup:function(evt){if(this.focusedChild&&this.focusedChild.popup&&!this.focusedChild.disabled){this.focusedChild._onClick(evt);}else{var _3dc=this._getTopMenu();if(_3dc&&_3dc._isMenuBar){_3dc.focusNext();}}},_onPopupHover:function(evt){if(this.currentPopup&&this.currentPopup._pendingClose_timer){var _3dd=this.currentPopup.parentMenu;if(_3dd.focusedChild){_3dd.focusedChild._setSelected(false);}_3dd.focusedChild=this.currentPopup.from_item;_3dd.focusedChild._setSelected(true);this._stopPendingCloseTimer(this.currentPopup);}},onItemHover:function(item){if(this.isActive){this.focusChild(item);if(this.focusedChild.popup&&!this.focusedChild.disabled&&!this.hover_timer){this.hover_timer=setTimeout(dojo.hitch(this,"_openPopup"),this.popupDelay);}}if(this.focusedChild){this.focusChild(item);}this._hoveredChild=item;},_onChildBlur:function(item){this._stopPopupTimer();item._setSelected(false);var _3de=item.popup;if(_3de){this._stopPendingCloseTimer(_3de);_3de._pendingClose_timer=setTimeout(function(){_3de._pendingClose_timer=null;if(_3de.parentMenu){_3de.parentMenu.currentPopup=null;}dijit.popup.close(_3de);},this.popupDelay);}},onItemUnhover:function(item){if(this.isActive){this._stopPopupTimer();}if(this._hoveredChild==item){this._hoveredChild=null;}},_stopPopupTimer:function(){if(this.hover_timer){clearTimeout(this.hover_timer);this.hover_timer=null;}},_stopPendingCloseTimer:function(_3df){if(_3df._pendingClose_timer){clearTimeout(_3df._pendingClose_timer);_3df._pendingClose_timer=null;}},_stopFocusTimer:function(){if(this._focus_timer){clearTimeout(this._focus_timer);this._focus_timer=null;}},_getTopMenu:function(){for(var top=this;top.parentMenu;top=top.parentMenu){}return top;},onItemClick:function(item,evt){if(typeof this.isShowingNow=="undefined"){this._markActive();}this.focusChild(item);if(item.disabled){return false;}if(item.popup){this._openPopup();}else{this.onExecute();item.onClick(evt);}},_openPopup:function(){this._stopPopupTimer();var _3e0=this.focusedChild;if(!_3e0){return;}var _3e1=_3e0.popup;if(_3e1.isShowingNow){return;}if(this.currentPopup){this._stopPendingCloseTimer(this.currentPopup);dijit.popup.close(this.currentPopup);}_3e1.parentMenu=this;_3e1.from_item=_3e0;var self=this;dijit.popup.open({parent:this,popup:_3e1,around:_3e0.domNode,orient:this._orient||(this.isLeftToRight()?{"TR":"TL","TL":"TR","BR":"BL","BL":"BR"}:{"TL":"TR","TR":"TL","BL":"BR","BR":"BL"}),onCancel:function(){self.focusChild(_3e0);self._cleanUp();_3e0._setSelected(true);self.focusedChild=_3e0;},onExecute:dojo.hitch(this,"_cleanUp")});this.currentPopup=_3e1;_3e1.connect(_3e1.domNode,"onmouseenter",dojo.hitch(self,"_onPopupHover"));if(_3e1.focus){_3e1._focus_timer=setTimeout(dojo.hitch(_3e1,function(){this._focus_timer=null;this.focus();}),0);}},_markActive:function(){this.isActive=true;dojo.replaceClass(this.domNode,"dijitMenuActive","dijitMenuPassive");},onOpen:function(e){this.isShowingNow=true;this._markActive();},_markInactive:function(){this.isActive=false;dojo.replaceClass(this.domNode,"dijitMenuPassive","dijitMenuActive");},onClose:function(){this._stopFocusTimer();this._markInactive();this.isShowingNow=false;this.parentMenu=null;},_closeChild:function(){this._stopPopupTimer();var _3e2=this.focusedChild&&this.focusedChild.from_item;if(this.currentPopup){if(dijit._curFocus&&dojo.isDescendant(dijit._curFocus,this.currentPopup.domNode)){this.focusedChild.focusNode.focus();}dijit.popup.close(this.currentPopup);this.currentPopup=null;}if(this.focusedChild){this.focusedChild._setSelected(false);this.focusedChild._onUnhover();this.focusedChild=null;}},_onItemFocus:function(item){if(this._hoveredChild&&this._hoveredChild!=item){this._hoveredChild._onUnhover();}},_onBlur:function(){this._cleanUp();this.inherited(arguments);},_cleanUp:function(){this._closeChild();if(typeof this.isShowingNow=="undefined"){this._markInactive();}}});dojo.declare("dijit.Menu",dijit._MenuBase,{constructor:function(){this._bindings=[];},templateString:dojo.cache("dijit","templates/Menu.html","<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" role=\"menu\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress:_onKeyPress\" cellspacing=\"0\">\n\t<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>\n</table>\n"),baseClass:"dijitMenu",targetNodeIds:[],contextMenuForWindow:false,leftClickToOpen:false,refocus:true,postCreate:function(){if(this.contextMenuForWindow){this.bindDomNode(dojo.body());}else{dojo.forEach(this.targetNodeIds,this.bindDomNode,this);}var k=dojo.keys,l=this.isLeftToRight();this._openSubMenuKey=l?k.RIGHT_ARROW:k.LEFT_ARROW;this._closeSubMenuKey=l?k.LEFT_ARROW:k.RIGHT_ARROW;this.connectKeyNavHandlers([k.UP_ARROW],[k.DOWN_ARROW]);},_onKeyPress:function(evt){if(evt.ctrlKey||evt.altKey){return;}switch(evt.charOrCode){case this._openSubMenuKey:this._moveToPopup(evt);dojo.stopEvent(evt);break;case this._closeSubMenuKey:if(this.parentMenu){if(this.parentMenu._isMenuBar){this.parentMenu.focusPrev();}else{this.onCancel(false);}}else{dojo.stopEvent(evt);}break;}},_iframeContentWindow:function(_3e3){var win=dojo.window.get(this._iframeContentDocument(_3e3))||this._iframeContentDocument(_3e3)["__parent__"]||(_3e3.name&&dojo.doc.frames[_3e3.name])||null;return win;},_iframeContentDocument:function(_3e4){var doc=_3e4.contentDocument||(_3e4.contentWindow&&_3e4.contentWindow.document)||(_3e4.name&&dojo.doc.frames[_3e4.name]&&dojo.doc.frames[_3e4.name].document)||null;return doc;},bindDomNode:function(node){node=dojo.byId(node);var cn;if(node.tagName.toLowerCase()=="iframe"){var _3e5=node,win=this._iframeContentWindow(_3e5);cn=dojo.withGlobal(win,dojo.body);}else{cn=(node==dojo.body()?dojo.doc.documentElement:node);}var _3e6={node:node,iframe:_3e5};dojo.attr(node,"_dijitMenu"+this.id,this._bindings.push(_3e6));var _3e7=dojo.hitch(this,function(cn){return [dojo.connect(cn,this.leftClickToOpen?"onclick":"oncontextmenu",this,function(evt){dojo.stopEvent(evt);this._scheduleOpen(evt.target,_3e5,{x:evt.pageX,y:evt.pageY});}),dojo.connect(cn,"onkeydown",this,function(evt){if(evt.shiftKey&&evt.keyCode==dojo.keys.F10){dojo.stopEvent(evt);this._scheduleOpen(evt.target,_3e5);}})];});_3e6.connects=cn?_3e7(cn):[];if(_3e5){_3e6.onloadHandler=dojo.hitch(this,function(){var win=this._iframeContentWindow(_3e5);cn=dojo.withGlobal(win,dojo.body);_3e6.connects=_3e7(cn);});if(_3e5.addEventListener){_3e5.addEventListener("load",_3e6.onloadHandler,false);}else{_3e5.attachEvent("onload",_3e6.onloadHandler);}}},unBindDomNode:function(_3e8){var node;try{node=dojo.byId(_3e8);}catch(e){return;}var _3e9="_dijitMenu"+this.id;if(node&&dojo.hasAttr(node,_3e9)){var bid=dojo.attr(node,_3e9)-1,b=this._bindings[bid];dojo.forEach(b.connects,dojo.disconnect);var _3ea=b.iframe;if(_3ea){if(_3ea.removeEventListener){_3ea.removeEventListener("load",b.onloadHandler,false);}else{_3ea.detachEvent("onload",b.onloadHandler);}}dojo.removeAttr(node,_3e9);delete this._bindings[bid];}},_scheduleOpen:function(_3eb,_3ec,_3ed){if(!this._openTimer){this._openTimer=setTimeout(dojo.hitch(this,function(){delete this._openTimer;this._openMyself({target:_3eb,iframe:_3ec,coords:_3ed});}),1);}},_openMyself:function(args){var _3ee=args.target,_3ef=args.iframe,_3f0=args.coords;if(_3f0){if(_3ef){var od=_3ee.ownerDocument,ifc=dojo.position(_3ef,true),win=this._iframeContentWindow(_3ef),_3f1=dojo.withGlobal(win,"_docScroll",dojo);var cs=dojo.getComputedStyle(_3ef),tp=dojo._toPixelValue,left=(dojo.isIE&&dojo.isQuirks?0:tp(_3ef,cs.paddingLeft))+(dojo.isIE&&dojo.isQuirks?tp(_3ef,cs.borderLeftWidth):0),top=(dojo.isIE&&dojo.isQuirks?0:tp(_3ef,cs.paddingTop))+(dojo.isIE&&dojo.isQuirks?tp(_3ef,cs.borderTopWidth):0);_3f0.x+=ifc.x+left-_3f1.x;_3f0.y+=ifc.y+top-_3f1.y;}}else{_3f0=dojo.position(_3ee,true);_3f0.x+=10;_3f0.y+=10;}var self=this;var _3f2=dijit.getFocus(this);function _3f3(){if(self.refocus){dijit.focus(_3f2);}dijit.popup.close(self);};dijit.popup.open({popup:this,x:_3f0.x,y:_3f0.y,onExecute:_3f3,onCancel:_3f3,orient:this.isLeftToRight()?"L":"R"});this.focus();this._onBlur=function(){this.inherited("_onBlur",arguments);dijit.popup.close(this);};},uninitialize:function(){dojo.forEach(this._bindings,function(b){if(b){this.unBindDomNode(b.node);}},this);this.inherited(arguments);}});}if(!dojo._hasResource["dijit.form.Select"]){dojo._hasResource["dijit.form.Select"]=true;dojo.provide("dijit.form.Select");dojo.declare("dijit.form._SelectMenu",dijit.Menu,{buildRendering:function(){this.inherited(arguments);var o=(this.menuTableNode=this.domNode);var n=(this.domNode=dojo.create("div",{style:{overflowX:"hidden",overflowY:"scroll"}}));if(o.parentNode){o.parentNode.replaceChild(n,o);}dojo.removeClass(o,"dijitMenuTable");n.className=o.className+" dijitSelectMenu";o.className="dijitReset dijitMenuTable";dijit.setWaiRole(o,"listbox");dijit.setWaiRole(n,"presentation");n.appendChild(o);},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onmousemove",dojo.stopEvent);},resize:function(mb){if(mb){dojo.marginBox(this.domNode,mb);if("w" in mb){this.menuTableNode.style.width="100%";}}}});dojo.declare("dijit.form.Select",[dijit.form._FormSelectWidget,dijit._HasDropDown],{baseClass:"dijitSelect",templateString:dojo.cache("dijit.form","templates/Select.html","<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tdojoAttachPoint=\"_buttonNode,tableNode,focusNode\" cellspacing='0' cellpadding='0'\n\trole=\"combobox\" aria-haspopup=\"true\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" role=\"presentation\"\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\" dojoAttachPoint=\"containerNode,_popupStateNode\"></span\n\t\t\t><input type=\"hidden\" ${!nameAttrSetting} dojoAttachPoint=\"valueNode\" value=\"${value}\" aria-hidden=\"true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"titleNode\" role=\"presentation\"\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></tr></tbody\n></table>\n"),attributeMap:dojo.mixin(dojo.clone(dijit.form._FormSelectWidget.prototype.attributeMap),{style:"tableNode"}),required:false,state:"",message:"",tooltipPosition:[],emptyLabel:" ",_isLoaded:false,_childrenLoaded:false,_fillContent:function(){this.inherited(arguments);if(this.options.length&&!this.value&&this.srcNodeRef){var si=this.srcNodeRef.selectedIndex||0;this.value=this.options[si>=0?si:0].value;}this.dropDown=new dijit.form._SelectMenu({id:this.id+"_menu"});dojo.addClass(this.dropDown.domNode,this.baseClass+"Menu");},_getMenuItemForOption:function(_3f4){if(!_3f4.value&&!_3f4.label){return new dijit.MenuSeparator();}else{var _3f5=dojo.hitch(this,"_setValueAttr",_3f4);var item=new dijit.MenuItem({option:_3f4,label:_3f4.label||this.emptyLabel,onClick:_3f5,disabled:_3f4.disabled||false});dijit.setWaiRole(item.focusNode,"listitem");return item;}},_addOptionItem:function(_3f6){if(this.dropDown){this.dropDown.addChild(this._getMenuItemForOption(_3f6));}},_getChildren:function(){if(!this.dropDown){return [];}return this.dropDown.getChildren();},_loadChildren:function(_3f7){if(_3f7===true){if(this.dropDown){delete this.dropDown.focusedChild;}if(this.options.length){this.inherited(arguments);}else{dojo.forEach(this._getChildren(),function(_3f8){_3f8.destroyRecursive();});var item=new dijit.MenuItem({label:" "});this.dropDown.addChild(item);}}else{this._updateSelection();}this._isLoaded=false;this._childrenLoaded=true;if(!this._loadingStore){this._setValueAttr(this.value);}},_setValueAttr:function(_3f9){this.inherited(arguments);dojo.attr(this.valueNode,"value",this.get("value"));},_setDisplay:function(_3fa){var lbl=_3fa||this.emptyLabel;this.containerNode.innerHTML="<span class=\"dijitReset dijitInline "+this.baseClass+"Label\">"+lbl+"</span>";dijit.setWaiState(this.focusNode,"valuetext",lbl);},validate:function(_3fb){var _3fc=this.isValid(_3fb);this._set("state",_3fc?"":"Error");dijit.setWaiState(this.focusNode,"invalid",_3fc?"false":"true");var _3fd=_3fc?"":this._missingMsg;if(this.message!==_3fd){this._set("message",_3fd);dijit.hideTooltip(this.domNode);if(_3fd){dijit.showTooltip(_3fd,this.domNode,this.tooltipPosition,!this.isLeftToRight());}}return _3fc;},isValid:function(_3fe){return (!this.required||this.value===0||!(/^\s*$/.test(this.value||"")));},reset:function(){this.inherited(arguments);dijit.hideTooltip(this.domNode);this._set("state","");this._set("message","");},postMixInProperties:function(){this.inherited(arguments);this._missingMsg=dojo.i18n.getLocalization("dijit.form","validate",this.lang).missingMessage;},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onmousemove",dojo.stopEvent);},_setStyleAttr:function(_3ff){this.inherited(arguments);dojo.toggleClass(this.domNode,this.baseClass+"FixedWidth",!!this.tableNode.style.width);},isLoaded:function(){return this._isLoaded;},loadDropDown:function(_400){this._loadChildren(true);this._isLoaded=true;_400();},closeDropDown:function(){this.inherited(arguments);if(this.dropDown&&this.dropDown.menuTableNode){this.dropDown.menuTableNode.style.width="";}},uninitialize:function(_401){if(this.dropDown&&!this.dropDown._destroyed){this.dropDown.destroyRecursive(_401);delete this.dropDown;}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.form.SimpleTextarea"]){dojo._hasResource["dijit.form.SimpleTextarea"]=true;dojo.provide("dijit.form.SimpleTextarea");dojo.declare("dijit.form.SimpleTextarea",dijit.form.TextBox,{baseClass:"dijitTextBox dijitTextArea",attributeMap:dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap,{rows:"textbox",cols:"textbox"}),rows:"3",cols:"20",templateString:"<textarea ${!nameAttrSetting} dojoAttachPoint='focusNode,containerNode,textbox' autocomplete='off'></textarea>",postMixInProperties:function(){if(!this.value&&this.srcNodeRef){this.value=this.srcNodeRef.value;}this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);if(dojo.isIE&&this.cols){dojo.addClass(this.textbox,"dijitTextAreaCols");}},filter:function(_402){if(_402){_402=_402.replace(/\r/g,"");}return this.inherited(arguments);},_previousValue:"",_onInput:function(e){if(this.maxLength){var _403=parseInt(this.maxLength);var _404=this.textbox.value.replace(/\r/g,"");var _405=_404.length-_403;if(_405>0){if(e){dojo.stopEvent(e);}var _406=this.textbox;if(_406.selectionStart){var pos=_406.selectionStart;var cr=0;if(dojo.isOpera){cr=(this.textbox.value.substring(0,pos).match(/\r/g)||[]).length;}this.textbox.value=_404.substring(0,pos-_405-cr)+_404.substring(pos-cr);_406.setSelectionRange(pos-_405,pos-_405);}else{if(dojo.doc.selection){_406.focus();var _407=dojo.doc.selection.createRange();_407.moveStart("character",-_405);_407.text="";_407.select();}}}this._previousValue=this.textbox.value;}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.InlineEditBox"]){dojo._hasResource["dijit.InlineEditBox"]=true;dojo.provide("dijit.InlineEditBox");dojo.declare("dijit.InlineEditBox",dijit._Widget,{editing:false,autoSave:true,buttonSave:"",buttonCancel:"",renderAsHtml:false,editor:"dijit.form.TextBox",editorWrapper:"dijit._InlineEditor",editorParams:{},disabled:false,onChange:function(_408){},onCancel:function(){},width:"100%",value:"",noValueIndicator:dojo.isIE<=6?"<span style='font-family: wingdings; text-decoration: underline;'>    ✍    </span>":"<span style='text-decoration: underline;'>    ✍    </span>",constructor:function(){this.editorParams={};},postMixInProperties:function(){this.inherited(arguments);this.displayNode=this.srcNodeRef;var _409={ondijitclick:"_onClick",onmouseover:"_onMouseOver",onmouseout:"_onMouseOut",onfocus:"_onMouseOver",onblur:"_onMouseOut"};for(var name in _409){this.connect(this.displayNode,name,_409[name]);}dijit.setWaiRole(this.displayNode,"button");if(!this.displayNode.getAttribute("tabIndex")){this.displayNode.setAttribute("tabIndex",0);}if(!this.value&&!("value" in this.params)){this.value=dojo.trim(this.renderAsHtml?this.displayNode.innerHTML:(this.displayNode.innerText||this.displayNode.textContent||""));}if(!this.value){this.displayNode.innerHTML=this.noValueIndicator;}dojo.addClass(this.displayNode,"dijitInlineEditBoxDisplayMode");},setDisabled:function(_40a){dojo.deprecated("dijit.InlineEditBox.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_40a);},_setDisabledAttr:function(_40b){dijit.setWaiState(this.domNode,"disabled",_40b);if(_40b){this.displayNode.removeAttribute("tabIndex");}else{this.displayNode.setAttribute("tabIndex",0);}dojo.toggleClass(this.displayNode,"dijitInlineEditBoxDisplayModeDisabled",_40b);this._set("disabled",_40b);},_onMouseOver:function(){if(!this.disabled){dojo.addClass(this.displayNode,"dijitInlineEditBoxDisplayModeHover");}},_onMouseOut:function(){dojo.removeClass(this.displayNode,"dijitInlineEditBoxDisplayModeHover");},_onClick:function(e){if(this.disabled){return;}if(e){dojo.stopEvent(e);}this._onMouseOut();setTimeout(dojo.hitch(this,"edit"),0);},edit:function(){if(this.disabled||this.editing){return;}this.editing=true;this._savedPosition=dojo.style(this.displayNode,"position")||"static";this._savedOpacity=dojo.style(this.displayNode,"opacity")||"1";this._savedTabIndex=dojo.attr(this.displayNode,"tabIndex")||"0";if(this.wrapperWidget){var ew=this.wrapperWidget.editWidget;ew.set("displayedValue" in ew?"displayedValue":"value",this.value);}else{var _40c=dojo.create("span",null,this.domNode,"before");var ewc=typeof this.editorWrapper=="string"?dojo.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:dojo.getComputedStyle(this.displayNode),save:dojo.hitch(this,"save"),cancel:dojo.hitch(this,"cancel")},_40c);if(!this._started){this.startup();}}var ww=this.wrapperWidget;if(dojo.isIE){dijit.focus(dijit.getFocus());}dojo.style(this.displayNode,{position:"absolute",opacity:"0",display:"none"});dojo.style(ww.domNode,{position:this._savedPosition,visibility:"visible",opacity:"1"});dojo.attr(this.displayNode,"tabIndex","-1");setTimeout(dojo.hitch(this,function(){ww.focus();ww._resetValue=ww.getValue();}),0);},_onBlur:function(){this.inherited(arguments);if(!this.editing){}},destroy:function(){if(this.wrapperWidget&&!this.wrapperWidget._destroyed){this.wrapperWidget.destroy();delete this.wrapperWidget;}this.inherited(arguments);},_showText:function(_40d){var ww=this.wrapperWidget;dojo.style(ww.domNode,{position:"absolute",visibility:"hidden",opacity:"0"});dojo.style(this.displayNode,{position:this._savedPosition,opacity:this._savedOpacity,display:""});dojo.attr(this.displayNode,"tabIndex",this._savedTabIndex);if(_40d){dijit.focus(this.displayNode);}},save:function(_40e){if(this.disabled||!this.editing){return;}this.editing=false;var ww=this.wrapperWidget;var _40f=ww.getValue();this.set("value",_40f);this._showText(_40e);},setValue:function(val){dojo.deprecated("dijit.InlineEditBox.setValue() is deprecated. Use set('value', ...) instead.","","2.0");return this.set("value",val);},_setValueAttr:function(val){val=dojo.trim(val);var _410=this.renderAsHtml?val:val.replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,""").replace(/\n/g,"<br>");this.displayNode.innerHTML=_410||this.noValueIndicator;this._set("value",val);if(this._started){setTimeout(dojo.hitch(this,"onChange",val),0);}},getValue:function(){dojo.deprecated("dijit.InlineEditBox.getValue() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},cancel:function(_411){if(this.disabled||!this.editing){return;}this.editing=false;setTimeout(dojo.hitch(this,"onCancel"),0);this._showText(_411);}});dojo.declare("dijit._InlineEditor",[dijit._Widget,dijit._Templated],{templateString:dojo.cache("dijit","templates/InlineEditBox.html","<span data-dojo-attach-point=\"editNode\" role=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\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"),widgetsInTemplate:true,postMixInProperties:function(){this.inherited(arguments);this.messages=dojo.i18n.getLocalization("dijit","common",this.lang);dojo.forEach(["buttonSave","buttonCancel"],function(prop){if(!this[prop]){this[prop]=this.messages[prop];}},this);},buildRendering:function(){this.inherited(arguments);var cls=typeof this.editor=="string"?dojo.getObject(this.editor):this.editor;var _412=this.sourceStyle,_413="line-height:"+_412.lineHeight+";",_414=dojo.getComputedStyle(this.domNode);dojo.forEach(["Weight","Family","Size","Style"],function(prop){var _415=_412["font"+prop],_416=_414["font"+prop];if(_416!=_415){_413+="font-"+prop+":"+_412["font"+prop]+";";}},this);dojo.forEach(["marginTop","marginBottom","marginLeft","marginRight"],function(prop){this.domNode.style[prop]=_412[prop];},this);var _417=this.inlineEditBox.width;if(_417=="100%"){_413+="width:100%;";this.domNode.style.display="block";}else{_413+="width:"+(_417+(Number(_417)==_417?"px":""))+";";}var _418=dojo.delegate(this.inlineEditBox.editorParams,{style:_413,dir:this.dir,lang:this.lang});_418["displayedValue" in cls.prototype?"displayedValue":"value"]=this.value;this.editWidget=new cls(_418,this.editorPlaceholder);if(this.inlineEditBox.autoSave){dojo.destroy(this.buttonContainer);}},postCreate:function(){this.inherited(arguments);var ew=this.editWidget;if(this.inlineEditBox.autoSave){this.connect(ew,"onChange","_onChange");this.connect(ew,"onKeyPress","_onKeyPress");}else{if("intermediateChanges" in ew){ew.set("intermediateChanges",true);this.connect(ew,"onChange","_onIntermediateChange");this.saveButton.set("disabled",true);}}},_onIntermediateChange:function(val){this.saveButton.set("disabled",(this.getValue()==this._resetValue)||!this.enableSave());},destroy:function(){this.editWidget.destroy(true);this.inherited(arguments);},getValue:function(){var ew=this.editWidget;return String(ew.get("displayedValue" in ew?"displayedValue":"value"));},_onKeyPress:function(e){if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing){if(e.altKey||e.ctrlKey){return;}if(e.charOrCode==dojo.keys.ESCAPE){dojo.stopEvent(e);this.cancel(true);}else{if(e.charOrCode==dojo.keys.ENTER&&e.target.tagName=="INPUT"){dojo.stopEvent(e);this._onChange();}}}},_onBlur:function(){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(){if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing&&this.enableSave()){dojo.style(this.inlineEditBox.displayNode,{display:""});dijit.focus(this.inlineEditBox.displayNode);}},enableSave:function(){return (this.editWidget.isValid?this.editWidget.isValid():true);},focus:function(){this.editWidget.focus();setTimeout(dojo.hitch(this,function(){if(this.editWidget.focusNode&&this.editWidget.focusNode.tagName=="INPUT"){dijit.selectInputText(this.editWidget.focusNode);}}),0);}});}if(!dojo._hasResource["dojo.cookie"]){dojo._hasResource["dojo.cookie"]=true;dojo.provide("dojo.cookie");dojo.cookie=function(name,_419,_41a){var c=document.cookie;if(arguments.length==1){var _41b=c.match(new RegExp("(?:^|; )"+dojo.regexp.escapeString(name)+"=([^;]*)"));return _41b?decodeURIComponent(_41b[1]):undefined;}else{_41a=_41a||{};var exp=_41a.expires;if(typeof exp=="number"){var d=new Date();d.setTime(d.getTime()+exp*24*60*60*1000);exp=_41a.expires=d;}if(exp&&exp.toUTCString){_41a.expires=exp.toUTCString();}_419=encodeURIComponent(_419);var _41c=name+"="+_419,_41d;for(_41d in _41a){_41c+="; "+_41d;var _41e=_41a[_41d];if(_41e!==true){_41c+="="+_41e;}}document.cookie=_41c;}};dojo.cookie.isSupported=function(){if(!("cookieEnabled" in navigator)){this("__djCookieTest__","CookiesAllowed");navigator.cookieEnabled=this("__djCookieTest__")=="CookiesAllowed";if(navigator.cookieEnabled){this("__djCookieTest__","",{expires:-1});}}return navigator.cookieEnabled;};}if(!dojo._hasResource["dijit.layout.StackController"]){dojo._hasResource["dijit.layout.StackController"]=true;dojo.provide("dijit.layout.StackController");dojo.declare("dijit.layout.StackController",[dijit._Widget,dijit._Templated,dijit._Container],{templateString:"<span role='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>",containerId:"",buttonWidget:"dijit.layout._StackButton",constructor:function(){this.pane2button={};this.pane2connects={};this.pane2watches={};},buildRendering:function(){this.inherited(arguments);dijit.setWaiRole(this.domNode,"tablist");},postCreate:function(){this.inherited(arguments);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");},onStartup:function(info){dojo.forEach(info.children,this.onAddChild,this);if(info.selected){this.onSelectChild(info.selected);}},destroy:function(){for(var pane in this.pane2button){this.onRemoveChild(dijit.byId(pane));}this.inherited(arguments);},onAddChild:function(page,_41f){var cls=dojo.getObject(this.buttonWidget);var _420=new cls({id:this.id+"_"+page.id,label:page.title,dir:page.dir,lang:page.lang,showLabel:page.showTitle,iconClass:page.iconClass,closeButton:page.closable,title:page.tooltip});dijit.setWaiState(_420.focusNode,"selected","false");var _421=["title","showTitle","iconClass","closable","tooltip"],_422=["label","showLabel","iconClass","closeButton","title"];this.pane2watches[page.id]=dojo.map(_421,function(_423,idx){return page.watch(_423,function(name,_424,_425){_420.set(_422[idx],_425);});});this.pane2connects[page.id]=[this.connect(_420,"onClick",dojo.hitch(this,"onButtonClick",page)),this.connect(_420,"onClickCloseButton",dojo.hitch(this,"onCloseButtonClick",page))];this.addChild(_420,_41f);this.pane2button[page.id]=_420;page.controlButton=_420;if(!this._currentChild){_420.focusNode.setAttribute("tabIndex","0");dijit.setWaiState(_420.focusNode,"selected","true");this._currentChild=page;}if(!this.isLeftToRight()&&dojo.isIE&&this._rectifyRtlTabList){this._rectifyRtlTabList();}},onRemoveChild:function(page){if(this._currentChild===page){this._currentChild=null;}dojo.forEach(this.pane2connects[page.id],dojo.hitch(this,"disconnect"));delete this.pane2connects[page.id];dojo.forEach(this.pane2watches[page.id],function(w){w.unwatch();});delete this.pane2watches[page.id];var _426=this.pane2button[page.id];if(_426){this.removeChild(_426);delete this.pane2button[page.id];_426.destroy();}delete page.controlButton;},onSelectChild:function(page){if(!page){return;}if(this._currentChild){var _427=this.pane2button[this._currentChild.id];_427.set("checked",false);dijit.setWaiState(_427.focusNode,"selected","false");_427.focusNode.setAttribute("tabIndex","-1");}var _428=this.pane2button[page.id];_428.set("checked",true);dijit.setWaiState(_428.focusNode,"selected","true");this._currentChild=page;_428.focusNode.setAttribute("tabIndex","0");var _429=dijit.byId(this.containerId);dijit.setWaiState(_429.containerNode,"labelledby",_428.id);},onButtonClick:function(page){var _42a=dijit.byId(this.containerId);_42a.selectChild(page);},onCloseButtonClick:function(page){var _42b=dijit.byId(this.containerId);_42b.closeChild(page);if(this._currentChild){var b=this.pane2button[this._currentChild.id];if(b){dijit.focus(b.focusNode||b.domNode);}}},adjacent:function(_42c){if(!this.isLeftToRight()&&(!this.tabPosition||/top|bottom/.test(this.tabPosition))){_42c=!_42c;}var _42d=this.getChildren();var _42e=dojo.indexOf(_42d,this.pane2button[this._currentChild.id]);var _42f=_42c?1:_42d.length-1;return _42d[(_42e+_42f)%_42d.length];},onkeypress:function(e){if(this.disabled||e.altKey){return;}var _430=null;if(e.ctrlKey||!e._djpage){var k=dojo.keys;switch(e.charOrCode){case k.LEFT_ARROW:case k.UP_ARROW:if(!e._djpage){_430=false;}break;case k.PAGE_UP:if(e.ctrlKey){_430=false;}break;case k.RIGHT_ARROW:case k.DOWN_ARROW:if(!e._djpage){_430=true;}break;case k.PAGE_DOWN:if(e.ctrlKey){_430=true;}break;case k.HOME:case k.END:var _431=this.getChildren();if(_431&&_431.length){_431[e.charOrCode==k.HOME?0:_431.length-1].onClick();}dojo.stopEvent(e);break;case k.DELETE:if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}dojo.stopEvent(e);break;default:if(e.ctrlKey){if(e.charOrCode===k.TAB){this.adjacent(!e.shiftKey).onClick();dojo.stopEvent(e);}else{if(e.charOrCode=="w"){if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}dojo.stopEvent(e);}}}}if(_430!==null){this.adjacent(_430).onClick();dojo.stopEvent(e);}}},onContainerKeyPress:function(info){info.e._djpage=info.page;this.onkeypress(info.e);}});dojo.declare("dijit.layout._StackButton",dijit.form.ToggleButton,{tabIndex:"-1",buildRendering:function(evt){this.inherited(arguments);dijit.setWaiRole((this.focusNode||this.domNode),"tab");},onClick:function(evt){dijit.focus(this.focusNode);},onClickCloseButton:function(evt){evt.stopPropagation();}});}if(!dojo._hasResource["dijit.layout.StackContainer"]){dojo._hasResource["dijit.layout.StackContainer"]=true;dojo.provide("dijit.layout.StackContainer");dojo.declare("dijit.layout.StackContainer",dijit.layout._LayoutWidget,{doLayout:true,persist:false,baseClass:"dijitStackContainer",buildRendering:function(){this.inherited(arguments);dojo.addClass(this.domNode,"dijitLayoutContainer");dijit.setWaiRole(this.containerNode,"tabpanel");},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onkeypress",this._onKeyPress);},startup:function(){if(this._started){return;}var _432=this.getChildren();dojo.forEach(_432,this._setupChild,this);if(this.persist){this.selectedChildWidget=dijit.byId(dojo.cookie(this.id+"_selectedChild"));}else{dojo.some(_432,function(_433){if(_433.selected){this.selectedChildWidget=_433;}return _433.selected;},this);}var _434=this.selectedChildWidget;if(!_434&&_432[0]){_434=this.selectedChildWidget=_432[0];_434.selected=true;}dojo.publish(this.id+"-startup",[{children:_432,selected:_434}]);this.inherited(arguments);},resize:function(){var _435=this.selectedChildWidget;if(_435&&!this._hasBeenShown){this._hasBeenShown=true;this._showChild(_435);}this.inherited(arguments);},_setupChild:function(_436){this.inherited(arguments);dojo.replaceClass(_436.domNode,"dijitHidden","dijitVisible");_436.domNode.title="";},addChild:function(_437,_438){this.inherited(arguments);if(this._started){dojo.publish(this.id+"-addChild",[_437,_438]);this.layout();if(!this.selectedChildWidget){this.selectChild(_437);}}},removeChild:function(page){this.inherited(arguments);if(this._started){dojo.publish(this.id+"-removeChild",[page]);}if(this._beingDestroyed){return;}if(this.selectedChildWidget===page){this.selectedChildWidget=undefined;if(this._started){var _439=this.getChildren();if(_439.length){this.selectChild(_439[0]);}}}if(this._started){this.layout();}},selectChild:function(page,_43a){page=dijit.byId(page);if(this.selectedChildWidget!=page){var d=this._transition(page,this.selectedChildWidget,_43a);this._set("selectedChildWidget",page);dojo.publish(this.id+"-selectChild",[page]);if(this.persist){dojo.cookie(this.id+"_selectedChild",this.selectedChildWidget.id);}}return d;},_transition:function(_43b,_43c,_43d){if(_43c){this._hideChild(_43c);}var d=this._showChild(_43b);if(_43b.resize){if(this.doLayout){_43b.resize(this._containerContentBox||this._contentBox);}else{_43b.resize();}}return d;},_adjacent:function(_43e){var _43f=this.getChildren();var _440=dojo.indexOf(_43f,this.selectedChildWidget);_440+=_43e?1:_43f.length-1;return _43f[_440%_43f.length];},forward:function(){return this.selectChild(this._adjacent(true),true);},back:function(){return this.selectChild(this._adjacent(false),true);},_onKeyPress:function(e){dojo.publish(this.id+"-containerKeyPress",[{e:e,page:this}]);},layout:function(){if(this.doLayout&&this.selectedChildWidget&&this.selectedChildWidget.resize){this.selectedChildWidget.resize(this._containerContentBox||this._contentBox);}},_showChild:function(page){var _441=this.getChildren();page.isFirstChild=(page==_441[0]);page.isLastChild=(page==_441[_441.length-1]);page._set("selected",true);dojo.replaceClass(page.domNode,"dijitVisible","dijitHidden");return page._onShow()||true;},_hideChild:function(page){page._set("selected",false);dojo.replaceClass(page.domNode,"dijitHidden","dijitVisible");page.onHide();},closeChild:function(page){var _442=page.onClose(this,page);if(_442){this.removeChild(page);page.destroyRecursive();}},destroyDescendants:function(_443){dojo.forEach(this.getChildren(),function(_444){this.removeChild(_444);_444.destroyRecursive(_443);},this);}});dojo.extend(dijit._Widget,{selected:false,closable:false,iconClass:"",showTitle:true});}if(!dojo._hasResource["dijit.layout.AccordionPane"]){dojo._hasResource["dijit.layout.AccordionPane"]=true;dojo.provide("dijit.layout.AccordionPane");dojo.declare("dijit.layout.AccordionPane",dijit.layout.ContentPane,{constructor:function(){dojo.deprecated("dijit.layout.AccordionPane deprecated, use ContentPane instead","","2.0");},onSelected:function(){}});}if(!dojo._hasResource["dijit.layout.AccordionContainer"]){dojo._hasResource["dijit.layout.AccordionContainer"]=true;dojo.provide("dijit.layout.AccordionContainer");dojo.declare("dijit.layout.AccordionContainer",dijit.layout.StackContainer,{duration:dijit.defaultDuration,buttonWidget:"dijit.layout._AccordionButton",baseClass:"dijitAccordionContainer",buildRendering:function(){this.inherited(arguments);this.domNode.style.overflow="hidden";dijit.setWaiRole(this.domNode,"tablist");},startup:function(){if(this._started){return;}this.inherited(arguments);if(this.selectedChildWidget){var _445=this.selectedChildWidget.containerNode.style;_445.display="";_445.overflow="auto";this.selectedChildWidget._wrapperWidget.set("selected",true);}},layout:function(){var _446=this.selectedChildWidget;if(!_446){return;}var _447=_446._wrapperWidget.domNode,_448=dojo._getMarginExtents(_447),_449=dojo._getPadBorderExtents(_447),_44a=_446._wrapperWidget.containerNode,_44b=dojo._getMarginExtents(_44a),_44c=dojo._getPadBorderExtents(_44a),_44d=this._contentBox;var _44e=0;dojo.forEach(this.getChildren(),function(_44f){if(_44f!=_446){_44e+=dojo._getMarginSize(_44f._wrapperWidget.domNode).h;}});this._verticalSpace=_44d.h-_44e-_448.h-_449.h-_44b.h-_44c.h-_446._buttonWidget.getTitleHeight();this._containerContentBox={h:this._verticalSpace,w:this._contentBox.w-_448.w-_449.w-_44b.w-_44c.w};if(_446){_446.resize(this._containerContentBox);}},_setupChild:function(_450){_450._wrapperWidget=new dijit.layout._AccordionInnerContainer({contentWidget:_450,buttonWidget:this.buttonWidget,id:_450.id+"_wrapper",dir:_450.dir,lang:_450.lang,parent:this});this.inherited(arguments);},addChild:function(_451,_452){if(this._started){dojo.place(_451.domNode,this.containerNode,_452);if(!_451._started){_451.startup();}this._setupChild(_451);dojo.publish(this.id+"-addChild",[_451,_452]);this.layout();if(!this.selectedChildWidget){this.selectChild(_451);}}else{this.inherited(arguments);}},removeChild:function(_453){if(_453._wrapperWidget){dojo.place(_453.domNode,_453._wrapperWidget.domNode,"after");_453._wrapperWidget.destroy();delete _453._wrapperWidget;}dojo.removeClass(_453.domNode,"dijitHidden");this.inherited(arguments);},getChildren:function(){return dojo.map(this.inherited(arguments),function(_454){return _454.declaredClass=="dijit.layout._AccordionInnerContainer"?_454.contentWidget:_454;},this);},destroy:function(){if(this._animation){this._animation.stop();}dojo.forEach(this.getChildren(),function(_455){if(_455._wrapperWidget){_455._wrapperWidget.destroy();}else{_455.destroyRecursive();}});this.inherited(arguments);},_showChild:function(_456){_456._wrapperWidget.containerNode.style.display="block";return this.inherited(arguments);},_hideChild:function(_457){_457._wrapperWidget.containerNode.style.display="none";this.inherited(arguments);},_transition:function(_458,_459,_45a){if(dojo.isIE<8){_45a=false;}if(this._animation){this._animation.stop(true);delete this._animation;}var self=this;if(_458){_458._wrapperWidget.set("selected",true);var d=this._showChild(_458);if(this.doLayout&&_458.resize){_458.resize(this._containerContentBox);}}if(_459){_459._wrapperWidget.set("selected",false);if(!_45a){this._hideChild(_459);}}if(_45a){var _45b=_458._wrapperWidget.containerNode,_45c=_459._wrapperWidget.containerNode;var _45d=_458._wrapperWidget.containerNode,_45e=dojo._getMarginExtents(_45d),_45f=dojo._getPadBorderExtents(_45d),_460=_45e.h+_45f.h;_45c.style.height=(self._verticalSpace-_460)+"px";this._animation=new dojo.Animation({node:_45b,duration:this.duration,curve:[1,this._verticalSpace-_460-1],onAnimate:function(_461){_461=Math.floor(_461);_45b.style.height=_461+"px";_45c.style.height=(self._verticalSpace-_460-_461)+"px";},onEnd:function(){delete self._animation;_45b.style.height="auto";_459._wrapperWidget.containerNode.style.display="none";_45c.style.height="auto";self._hideChild(_459);}});this._animation.onStop=this._animation.onEnd;this._animation.play();}return d;},_onKeyPress:function(e,_462){if(this.disabled||e.altKey||!(_462||e.ctrlKey)){return;}var k=dojo.keys,c=e.charOrCode;if((_462&&(c==k.LEFT_ARROW||c==k.UP_ARROW))||(e.ctrlKey&&c==k.PAGE_UP)){this._adjacent(false)._buttonWidget._onTitleClick();dojo.stopEvent(e);}else{if((_462&&(c==k.RIGHT_ARROW||c==k.DOWN_ARROW))||(e.ctrlKey&&(c==k.PAGE_DOWN||c==k.TAB))){this._adjacent(true)._buttonWidget._onTitleClick();dojo.stopEvent(e);}}}});dojo.declare("dijit.layout._AccordionInnerContainer",[dijit._Widget,dijit._CssStateMixin],{baseClass:"dijitAccordionInnerContainer",isContainer:true,isLayoutContainer:true,buildRendering:function(){this.domNode=dojo.place("<div class='"+this.baseClass+"'>",this.contentWidget.domNode,"after");var _463=this.contentWidget,cls=dojo.getObject(this.buttonWidget);this.button=_463._buttonWidget=(new cls({contentWidget:_463,label:_463.title,title:_463.tooltip,dir:_463.dir,lang:_463.lang,iconClass:_463.iconClass,id:_463.id+"_button",parent:this.parent})).placeAt(this.domNode);this.containerNode=dojo.place("<div class='dijitAccordionChildWrapper' style='display:none'>",this.domNode);dojo.place(this.contentWidget.domNode,this.containerNode);},postCreate:function(){this.inherited(arguments);var _464=this.button;this._contentWidgetWatches=[this.contentWidget.watch("title",dojo.hitch(this,function(name,_465,_466){_464.set("label",_466);})),this.contentWidget.watch("tooltip",dojo.hitch(this,function(name,_467,_468){_464.set("title",_468);})),this.contentWidget.watch("iconClass",dojo.hitch(this,function(name,_469,_46a){_464.set("iconClass",_46a);}))];},_setSelectedAttr:function(_46b){this._set("selected",_46b);this.button.set("selected",_46b);if(_46b){var cw=this.contentWidget;if(cw.onSelected){cw.onSelected();}}},startup:function(){this.contentWidget.startup();},destroy:function(){this.button.destroyRecursive();dojo.forEach(this._contentWidgetWatches||[],function(w){w.unwatch();});delete this.contentWidget._buttonWidget;delete this.contentWidget._wrapperWidget;this.inherited(arguments);},destroyDescendants:function(){this.contentWidget.destroyRecursive();}});dojo.declare("dijit.layout._AccordionButton",[dijit._Widget,dijit._Templated,dijit._CssStateMixin],{templateString:dojo.cache("dijit.layout","templates/AccordionButton.html","<div dojoAttachEvent='onclick:_onTitleClick' class='dijitAccordionTitle'>\n\t<div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='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\" dojoAttachPoint='iconNode' style=\"vertical-align: middle\" role=\"presentation\"/>\n\t\t<span role=\"presentation\" dojoAttachPoint='titleTextNode' class='dijitAccordionText'></span>\n\t</div>\n</div>\n"),attributeMap:dojo.mixin(dojo.clone(dijit.layout.ContentPane.prototype.attributeMap),{label:{node:"titleTextNode",type:"innerHTML"},title:{node:"titleTextNode",type:"attribute",attribute:"title"},iconClass:{node:"iconNode",type:"class"}}),baseClass:"dijitAccordionTitle",getParent:function(){return this.parent;},buildRendering:function(){this.inherited(arguments);var _46c=this.id.replace(" ","_");dojo.attr(this.titleTextNode,"id",_46c+"_title");dijit.setWaiState(this.focusNode,"labelledby",dojo.attr(this.titleTextNode,"id"));dojo.setSelectable(this.domNode,false);},getTitleHeight:function(){return dojo._getMarginSize(this.domNode).h;},_onTitleClick:function(){var _46d=this.getParent();_46d.selectChild(this.contentWidget,true);dijit.focus(this.focusNode);},_onTitleKeyPress:function(evt){return this.getParent()._onKeyPress(evt,this.contentWidget);},_setSelectedAttr:function(_46e){this._set("selected",_46e);dijit.setWaiState(this.focusNode,"expanded",_46e);dijit.setWaiState(this.focusNode,"selected",_46e);this.focusNode.setAttribute("tabIndex",_46e?"0":"-1");}});}if(!dojo._hasResource["dijit.layout.BorderContainer"]){dojo._hasResource["dijit.layout.BorderContainer"]=true;dojo.provide("dijit.layout.BorderContainer");dojo.declare("dijit.layout.BorderContainer",dijit.layout._LayoutWidget,{design:"headline",gutters:true,liveSplitters:true,persist:false,baseClass:"dijitBorderContainer",_splitterClass:"dijit.layout._Splitter",postMixInProperties:function(){if(!this.gutters){this.baseClass+="NoGutter";}this.inherited(arguments);},startup:function(){if(this._started){return;}dojo.forEach(this.getChildren(),this._setupChild,this);this.inherited(arguments);},_setupChild:function(_46f){var _470=_46f.region;if(_470){this.inherited(arguments);dojo.addClass(_46f.domNode,this.baseClass+"Pane");var ltr=this.isLeftToRight();if(_470=="leading"){_470=ltr?"left":"right";}if(_470=="trailing"){_470=ltr?"right":"left";}if(_470!="center"&&(_46f.splitter||this.gutters)&&!_46f._splitterWidget){var _471=dojo.getObject(_46f.splitter?this._splitterClass:"dijit.layout._Gutter");var _472=new _471({id:_46f.id+"_splitter",container:this,child:_46f,region:_470,live:this.liveSplitters});_472.isSplitter=true;_46f._splitterWidget=_472;dojo.place(_472.domNode,_46f.domNode,"after");_472.startup();}_46f.region=_470;}},layout:function(){this._layoutChildren();},addChild:function(_473,_474){this.inherited(arguments);if(this._started){this.layout();}},removeChild:function(_475){var _476=_475.region;var _477=_475._splitterWidget;if(_477){_477.destroy();delete _475._splitterWidget;}this.inherited(arguments);if(this._started){this._layoutChildren();}dojo.removeClass(_475.domNode,this.baseClass+"Pane");dojo.style(_475.domNode,{top:"auto",bottom:"auto",left:"auto",right:"auto",position:"static"});dojo.style(_475.domNode,_476=="top"||_476=="bottom"?"width":"height","auto");},getChildren:function(){return dojo.filter(this.inherited(arguments),function(_478){return !_478.isSplitter;});},getSplitter:function(_479){return dojo.filter(this.getChildren(),function(_47a){return _47a.region==_479;})[0]._splitterWidget;},resize:function(_47b,_47c){if(!this.cs||!this.pe){var node=this.domNode;this.cs=dojo.getComputedStyle(node);this.pe=dojo._getPadExtents(node,this.cs);this.pe.r=dojo._toPixelValue(node,this.cs.paddingRight);this.pe.b=dojo._toPixelValue(node,this.cs.paddingBottom);dojo.style(node,"padding","0px");}this.inherited(arguments);},_layoutChildren:function(_47d,_47e){if(!this._borderBox||!this._borderBox.h){return;}var _47f=dojo.map(this.getChildren(),function(_480,idx){return {pane:_480,weight:[_480.region=="center"?Infinity:0,_480.layoutPriority,(this.design=="sidebar"?1:-1)*(/top|bottom/.test(_480.region)?1:-1),idx]};},this);_47f.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;});var _481=[];dojo.forEach(_47f,function(_482){var pane=_482.pane;_481.push(pane);if(pane._splitterWidget){_481.push(pane._splitterWidget);}});var dim={l:this.pe.l,t:this.pe.t,w:this._borderBox.w-this.pe.w,h:this._borderBox.h-this.pe.h};dijit.layout.layoutChildren(this.domNode,dim,_481,_47d,_47e);},destroyRecursive:function(){dojo.forEach(this.getChildren(),function(_483){var _484=_483._splitterWidget;if(_484){_484.destroy();}delete _483._splitterWidget;});this.inherited(arguments);}});dojo.extend(dijit._Widget,{region:"",layoutPriority:0,splitter:false,minSize:0,maxSize:Infinity});dojo.declare("dijit.layout._Splitter",[dijit._Widget,dijit._Templated],{live:true,templateString:"<div class=\"dijitSplitter\" dojoAttachEvent=\"onkeypress:_onKeyPress,onmousedown:_startDrag,onmouseenter:_onMouse,onmouseleave:_onMouse\" tabIndex=\"0\" role=\"separator\"><div class=\"dijitSplitterThumb\"></div></div>",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);dojo.addClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V"));if(this.container.persist){var _485=dojo.cookie(this._cookieName);if(_485){this.child.domNode.style[this.horizontal?"height":"width"]=_485;}}},_computeMaxSize:function(){var dim=this.horizontal?"h":"w",_486=dojo.marginBox(this.child.domNode)[dim],_487=dojo.filter(this.container.getChildren(),function(_488){return _488.region=="center";})[0],_489=dojo.marginBox(_487.domNode)[dim];return Math.min(this.child.maxSize,_486+_489);},_startDrag:function(e){if(!this.cover){this.cover=dojo.doc.createElement("div");dojo.addClass(this.cover,"dijitSplitterCover");dojo.place(this.cover,this.child.domNode,"after");}dojo.addClass(this.cover,"dijitSplitterCoverActive");if(this.fake){dojo.destroy(this.fake);}if(!(this._resize=this.live)){(this.fake=this.domNode.cloneNode(true)).removeAttribute("id");dojo.addClass(this.domNode,"dijitSplitterShadow");dojo.place(this.fake,this.domNode,"after");}dojo.addClass(this.domNode,"dijitSplitterActive dijitSplitter"+(this.horizontal?"H":"V")+"Active");if(this.fake){dojo.removeClass(this.fake,"dijitSplitterHover dijitSplitter"+(this.horizontal?"H":"V")+"Hover");}var _48a=this._factor,_48b=this.horizontal,axis=_48b?"pageY":"pageX",_48c=e[axis],_48d=this.domNode.style,dim=_48b?"h":"w",_48e=dojo.marginBox(this.child.domNode)[dim],max=this._computeMaxSize(),min=this.child.minSize||20,_48f=this.region,_490=_48f=="top"||_48f=="bottom"?"top":"left",_491=parseInt(_48d[_490],10),_492=this._resize,_493=dojo.hitch(this.container,"_layoutChildren",this.child.id),de=dojo.doc;this._handlers=(this._handlers||[]).concat([dojo.connect(de,"onmousemove",this._drag=function(e,_494){var _495=e[axis]-_48c,_496=_48a*_495+_48e,_497=Math.max(Math.min(_496,max),min);if(_492||_494){_493(_497);}_48d[_490]=_495+_491+_48a*(_497-_496)+"px";}),dojo.connect(de,"ondragstart",dojo.stopEvent),dojo.connect(dojo.body(),"onselectstart",dojo.stopEvent),dojo.connect(de,"onmouseup",this,"_stopDrag")]);dojo.stopEvent(e);},_onMouse:function(e){var o=(e.type=="mouseover"||e.type=="mouseenter");dojo.toggleClass(this.domNode,"dijitSplitterHover",o);dojo.toggleClass(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Hover",o);},_stopDrag:function(e){try{if(this.cover){dojo.removeClass(this.cover,"dijitSplitterCoverActive");}if(this.fake){dojo.destroy(this.fake);}dojo.removeClass(this.domNode,"dijitSplitterActive dijitSplitter"+(this.horizontal?"H":"V")+"Active dijitSplitterShadow");this._drag(e);this._drag(e,true);}finally{this._cleanupHandlers();delete this._drag;}if(this.container.persist){dojo.cookie(this._cookieName,this.child.domNode.style[this.horizontal?"height":"width"],{expires:365});}},_cleanupHandlers:function(){dojo.forEach(this._handlers,dojo.disconnect);delete this._handlers;},_onKeyPress:function(e){this._resize=true;var _498=this.horizontal;var tick=1;var dk=dojo.keys;switch(e.charOrCode){case _498?dk.UP_ARROW:dk.LEFT_ARROW:tick*=-1;case _498?dk.DOWN_ARROW:dk.RIGHT_ARROW:break;default:return;}var _499=dojo._getMarginSize(this.child.domNode)[_498?"h":"w"]+this._factor*tick;this.container._layoutChildren(this.child.id,Math.max(Math.min(_499,this._computeMaxSize()),this.child.minSize));dojo.stopEvent(e);},destroy:function(){this._cleanupHandlers();delete this.child;delete this.container;delete this.cover;delete this.fake;this.inherited(arguments);}});dojo.declare("dijit.layout._Gutter",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dijitGutter\" role=\"presentation\"></div>",postMixInProperties:function(){this.inherited(arguments);this.horizontal=/top|bottom/.test(this.region);},buildRendering:function(){this.inherited(arguments);dojo.addClass(this.domNode,"dijitGutter"+(this.horizontal?"H":"V"));}});}if(!dojo._hasResource["dijit.layout._TabContainerBase"]){dojo._hasResource["dijit.layout._TabContainerBase"]=true;dojo.provide("dijit.layout._TabContainerBase");dojo.declare("dijit.layout._TabContainerBase",[dijit.layout.StackContainer,dijit._Templated],{tabPosition:"top",baseClass:"dijitTabContainer",tabStrip:false,nested:false,templateString:dojo.cache("dijit.layout","templates/TabContainer.html","<div class=\"dijitTabContainer\">\n\t<div class=\"dijitTabListWrapper\" dojoAttachPoint=\"tablistNode\"></div>\n\t<div dojoAttachPoint=\"tablistSpacer\" class=\"dijitTabSpacer ${baseClass}-spacer\"></div>\n\t<div class=\"dijitTabPaneWrapper ${baseClass}-container\" dojoAttachPoint=\"containerNode\"></div>\n</div>\n"),postMixInProperties:function(){this.baseClass+=this.tabPosition.charAt(0).toUpperCase()+this.tabPosition.substr(1).replace(/-.*/,"");this.srcNodeRef&&dojo.style(this.srcNodeRef,"visibility","hidden");this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);this.tablist=this._makeController(this.tablistNode);if(!this.doLayout){dojo.addClass(this.domNode,"dijitTabContainerNoLayout");}if(this.nested){dojo.addClass(this.domNode,"dijitTabContainerNested");dojo.addClass(this.tablist.containerNode,"dijitTabContainerTabListNested");dojo.addClass(this.tablistSpacer,"dijitTabContainerSpacerNested");dojo.addClass(this.containerNode,"dijitTabPaneWrapperNested");}else{dojo.addClass(this.domNode,"tabStrip-"+(this.tabStrip?"enabled":"disabled"));}},_setupChild:function(tab){dojo.addClass(tab.domNode,"dijitTabPane");this.inherited(arguments);},startup:function(){if(this._started){return;}this.tablist.startup();this.inherited(arguments);},layout:function(){if(!this._contentBox||typeof (this._contentBox.l)=="undefined"){return;}var sc=this.selectedChildWidget;if(this.doLayout){var _49a=this.tabPosition.replace(/-h/,"");this.tablist.layoutAlign=_49a;var _49b=[this.tablist,{domNode:this.tablistSpacer,layoutAlign:_49a},{domNode:this.containerNode,layoutAlign:"client"}];dijit.layout.layoutChildren(this.domNode,this._contentBox,_49b);this._containerContentBox=dijit.layout.marginBox2contentBox(this.containerNode,_49b[2]);if(sc&&sc.resize){sc.resize(this._containerContentBox);}}else{if(this.tablist.resize){var s=this.tablist.domNode.style;s.width="0";var _49c=dojo.contentBox(this.domNode).w;s.width="";this.tablist.resize({w:_49c});}if(sc&&sc.resize){sc.resize();}}},destroy:function(){if(this.tablist){this.tablist.destroy();}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.layout.TabController"]){dojo._hasResource["dijit.layout.TabController"]=true;dojo.provide("dijit.layout.TabController");dojo.declare("dijit.layout.TabController",dijit.layout.StackController,{templateString:"<div role='tablist' dojoAttachEvent='onkeypress:onkeypress'></div>",tabPosition:"top",buttonWidget:"dijit.layout._TabButton",_rectifyRtlTabList:function(){if(0>=this.tabPosition.indexOf("-h")){return;}if(!this.pane2button){return;}var _49d=0;for(var pane in this.pane2button){var ow=this.pane2button[pane].innerDiv.scrollWidth;_49d=Math.max(_49d,ow);}for(pane in this.pane2button){this.pane2button[pane].innerDiv.style.width=_49d+"px";}}});dojo.declare("dijit.layout._TabButton",dijit.layout._StackButton,{baseClass:"dijitTab",cssStateNodes:{closeNode:"dijitTabCloseButton"},templateString:dojo.cache("dijit.layout","templates/_TabButton.html","<div role=\"presentation\" dojoAttachPoint=\"titleNode\" dojoAttachEvent='onclick:onClick'>\n <div role=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n <div role=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent'>\n \t<div role=\"presentation\" dojoAttachPoint='focusNode'>\n\t\t <img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitTabButtonIcon\" dojoAttachPoint='iconNode' />\n\t\t <span dojoAttachPoint='containerNode' class='tabLabel'></span>\n\t\t <span class=\"dijitInline dijitTabCloseButton dijitTabCloseIcon\" dojoAttachPoint='closeNode'\n\t\t \t\tdojoAttachEvent='onclick: onClickCloseButton' role=\"presentation\">\n\t\t <span dojoAttachPoint='closeText' class='dijitTabCloseText'>[x]</span\n\t\t ></span>\n\t\t\t</div>\n </div>\n </div>\n</div>\n"),scrollOnFocus:false,buildRendering:function(){this.inherited(arguments);dojo.setSelectable(this.containerNode,false);},startup:function(){this.inherited(arguments);var n=this.domNode;setTimeout(function(){n.className=n.className;},1);},_setCloseButtonAttr:function(disp){this._set("closeButton",disp);dojo.toggleClass(this.innerDiv,"dijitClosable",disp);this.closeNode.style.display=disp?"":"none";if(disp){var _49e=dojo.i18n.getLocalization("dijit","common");if(this.closeNode){dojo.attr(this.closeNode,"title",_49e.itemClose);}var _49e=dojo.i18n.getLocalization("dijit","common");this._closeMenu=new dijit.Menu({id:this.id+"_Menu",dir:this.dir,lang:this.lang,targetNodeIds:[this.domNode]});this._closeMenu.addChild(new dijit.MenuItem({label:_49e.itemClose,dir:this.dir,lang:this.lang,onClick:dojo.hitch(this,"onClickCloseButton")}));}else{if(this._closeMenu){this._closeMenu.destroyRecursive();delete this._closeMenu;}}},_setLabelAttr:function(_49f){this.inherited(arguments);if(this.showLabel==false&&!this.params.title){this.iconNode.alt=dojo.trim(this.containerNode.innerText||this.containerNode.textContent||"");}},destroy:function(){if(this._closeMenu){this._closeMenu.destroyRecursive();delete this._closeMenu;}this.inherited(arguments);}});}if(!dojo._hasResource["dijit.layout.ScrollingTabController"]){dojo._hasResource["dijit.layout.ScrollingTabController"]=true;dojo.provide("dijit.layout.ScrollingTabController");dojo.declare("dijit.layout.ScrollingTabController",dijit.layout.TabController,{templateString:dojo.cache("dijit.layout","templates/ScrollingTabController.html","<div class=\"dijitTabListContainer-${tabPosition}\" style=\"visibility:hidden\">\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerMenuButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_menuBtn\" containerId=\"${containerId}\" iconClass=\"dijitTabStripMenuIcon\"\n\t\t\tdropDownPosition=\"below-alt, above-alt\"\n\t\t\tdojoAttachPoint=\"_menuBtn\" showLabel=\"false\">▼</div>\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_leftBtn\" iconClass=\"dijitTabStripSlideLeftIcon\"\n\t\t\tdojoAttachPoint=\"_leftBtn\" dojoAttachEvent=\"onClick: doSlideLeft\" showLabel=\"false\">◀</div>\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_rightBtn\" iconClass=\"dijitTabStripSlideRightIcon\"\n\t\t\tdojoAttachPoint=\"_rightBtn\" dojoAttachEvent=\"onClick: doSlideRight\" showLabel=\"false\">▶</div>\n\t<div class='dijitTabListWrapper' dojoAttachPoint='tablistWrapper'>\n\t\t<div role='tablist' dojoAttachEvent='onkeypress:onkeypress'\n\t\t\t\tdojoAttachPoint='containerNode' class='nowrapTabStrip'></div>\n\t</div>\n</div>\n"),useMenu:true,useSlider:true,tabStripClass:"",widgetsInTemplate:true,_minScroll:5,attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{"class":"containerNode"}),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";dojo.addClass(n,"tabStrip-disabled");}dojo.addClass(this.tablistWrapper,this.tabStripClass);},onStartup:function(){this.inherited(arguments);dojo.style(this.domNode,"visibility","visible");this._postStartup=true;},onAddChild:function(page,_4a0){this.inherited(arguments);dojo.forEach(["label","iconClass"],function(attr){this.pane2watches[page.id].push(this.pane2button[page.id].watch(attr,dojo.hitch(this,function(name,_4a1,_4a2){if(this._postStartup&&this._dim){this.resize(this._dim);}})));},this);dojo.style(this.containerNode,"width",(dojo.style(this.containerNode,"width")+200)+"px");},onRemoveChild:function(page,_4a3){var _4a4=this.pane2button[page.id];if(this._selectedTab===_4a4.domNode){this._selectedTab=null;}this.inherited(arguments);},_initButtons:function(){this._btnWidth=0;this._buttons=dojo.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+=dojo._getMarginSize(btn).w;return true;}else{dojo.style(btn,"display","none");return false;}},this);},_getTabsWidth:function(){var _4a5=this.getChildren();if(_4a5.length){var _4a6=_4a5[this.isLeftToRight()?0:_4a5.length-1].domNode,_4a7=_4a5[this.isLeftToRight()?_4a5.length-1:0].domNode;return _4a7.offsetLeft+dojo.style(_4a7,"width")-_4a6.offsetLeft;}else{return 0;}},_enableBtn:function(_4a8){var _4a9=this._getTabsWidth();_4a8=_4a8||dojo.style(this.scrollNode,"width");return _4a9>0&&_4a8<_4a9;},resize:function(dim){if(this.domNode.offsetWidth==0){return;}this._dim=dim;this.scrollNode.style.height="auto";this._contentBox=dijit.layout.marginBox2contentBox(this.domNode,{h:0,w:dim.w});this._contentBox.h=this.scrollNode.offsetHeight;dojo.contentBox(this.domNode,this._contentBox);var _4aa=this._enableBtn(this._contentBox.w);this._buttons.style("display",_4aa?"":"none");this._leftBtn.layoutAlign="left";this._rightBtn.layoutAlign="right";this._menuBtn.layoutAlign=this.isLeftToRight()?"right":"left";dijit.layout.layoutChildren(this.domNode,this._contentBox,[this._menuBtn,this._leftBtn,this._rightBtn,{domNode:this.scrollNode,layoutAlign:"client"}]);if(this._selectedTab){if(this._anim&&this._anim.status()=="playing"){this._anim.stop();}var w=this.scrollNode,sl=this._convertToScrollLeft(this._getScrollForSelectedTab());w.scrollLeft=sl;}this._setButtonClass(this._getScroll());this._postResize=true;return {h:this._contentBox.h,w:dim.w};},_getScroll:function(){var sl=(this.isLeftToRight()||dojo.isIE<8||(dojo.isIE&&dojo.isQuirks)||dojo.isWebKit)?this.scrollNode.scrollLeft:dojo.style(this.containerNode,"width")-dojo.style(this.scrollNode,"width")+(dojo.isIE==8?-1:1)*this.scrollNode.scrollLeft;return sl;},_convertToScrollLeft:function(val){if(this.isLeftToRight()||dojo.isIE<8||(dojo.isIE&&dojo.isQuirks)||dojo.isWebKit){return val;}else{var _4ab=dojo.style(this.containerNode,"width")-dojo.style(this.scrollNode,"width");return (dojo.isIE==8?-1:1)*(val-_4ab);}},onSelectChild:function(page){var tab=this.pane2button[page.id];if(!tab||!page){return;}var node=tab.domNode;if(this._postResize&&node!=this._selectedTab){this._selectedTab=node;var sl=this._getScroll();if(sl>node.offsetLeft||sl+dojo.style(this.scrollNode,"width")<node.offsetLeft+dojo.style(node,"width")){this.createSmoothScroll().play();}}this.inherited(arguments);},_getScrollBounds:function(){var _4ac=this.getChildren(),_4ad=dojo.style(this.scrollNode,"width"),_4ae=dojo.style(this.containerNode,"width"),_4af=_4ae-_4ad,_4b0=this._getTabsWidth();if(_4ac.length&&_4b0>_4ad){return {min:this.isLeftToRight()?0:_4ac[_4ac.length-1].domNode.offsetLeft,max:this.isLeftToRight()?(_4ac[_4ac.length-1].domNode.offsetLeft+dojo.style(_4ac[_4ac.length-1].domNode,"width"))-_4ad:_4af};}else{var _4b1=this.isLeftToRight()?0:_4af;return {min:_4b1,max:_4b1};}},_getScrollForSelectedTab:function(){var w=this.scrollNode,n=this._selectedTab,_4b2=dojo.style(this.scrollNode,"width"),_4b3=this._getScrollBounds();var pos=(n.offsetLeft+dojo.style(n,"width")/2)-_4b2/2;pos=Math.min(Math.max(pos,_4b3.min),_4b3.max);return pos;},createSmoothScroll:function(x){if(arguments.length>0){var _4b4=this._getScrollBounds();x=Math.min(Math.max(x,_4b4.min),_4b4.max);}else{x=this._getScrollForSelectedTab();}if(this._anim&&this._anim.status()=="playing"){this._anim.stop();}var self=this,w=this.scrollNode,anim=new dojo._Animation({beforeBegin:function(){if(this.curve){delete this.curve;}var oldS=w.scrollLeft,newS=self._convertToScrollLeft(x);anim.curve=new dojo._Line(oldS,newS);},onAnimate:function(val){w.scrollLeft=val;}});this._anim=anim;this._setButtonClass(x);return anim;},_getBtnNode:function(e){var n=e.target;while(n&&!dojo.hasClass(n,"tabStripButton")){n=n.parentNode;}return n;},doSlideRight:function(e){this.doSlide(1,this._getBtnNode(e));},doSlideLeft:function(e){this.doSlide(-1,this._getBtnNode(e));},doSlide:function(_4b5,node){if(node&&dojo.hasClass(node,"dijitTabDisabled")){return;}var _4b6=dojo.style(this.scrollNode,"width");var d=(_4b6*0.75)*_4b5;var to=this._getScroll()+d;this._setButtonClass(to);this.createSmoothScroll(to).play();},_setButtonClass:function(_4b7){var _4b8=this._getScrollBounds();this._leftBtn.set("disabled",_4b7<=_4b8.min);this._rightBtn.set("disabled",_4b7>=_4b8.max);}});dojo.declare("dijit.layout._ScrollingTabControllerButtonMixin",null,{baseClass:"dijitTab tabStripButton",templateString:dojo.cache("dijit.layout","templates/_ScrollingTabControllerButton.html","<div dojoAttachEvent=\"onclick:_onButtonClick\">\n\t<div role=\"presentation\" class=\"dijitTabInnerDiv\" dojoattachpoint=\"innerDiv,focusNode\">\n\t\t<div role=\"presentation\" class=\"dijitTabContent dijitButtonContents\" dojoattachpoint=\"tabContent\">\n\t\t\t<img role=\"presentation\" alt=\"\" src=\"${_blankGif}\" class=\"dijitTabStripIcon\" dojoAttachPoint=\"iconNode\"/>\n\t\t\t<span dojoAttachPoint=\"containerNode,titleNode\" class=\"dijitButtonText\"></span>\n\t\t</div>\n\t</div>\n</div>\n"),tabIndex:"",isFocusable:function(){return false;}});dojo.declare("dijit.layout._ScrollingTabControllerButton",[dijit.form.Button,dijit.layout._ScrollingTabControllerButtonMixin]);dojo.declare("dijit.layout._ScrollingTabControllerMenuButton",[dijit.form.Button,dijit._HasDropDown,dijit.layout._ScrollingTabControllerButtonMixin],{containerId:"",tabIndex:"-1",isLoaded:function(){return false;},loadDropDown:function(_4b9){this.dropDown=new dijit.Menu({id:this.containerId+"_menu",dir:this.dir,lang:this.lang});var _4ba=dijit.byId(this.containerId);dojo.forEach(_4ba.getChildren(),function(page){var _4bb=new dijit.MenuItem({id:page.id+"_stcMi",label:page.title,iconClass:page.iconClass,dir:page.dir,lang:page.lang,onClick:function(){_4ba.selectChild(page);}});this.dropDown.addChild(_4bb);},this);_4b9();},closeDropDown:function(_4bc){this.inherited(arguments);if(this.dropDown){this.dropDown.destroyRecursive();delete this.dropDown;}}});}if(!dojo._hasResource["dijit.layout.TabContainer"]){dojo._hasResource["dijit.layout.TabContainer"]=true;dojo.provide("dijit.layout.TabContainer");dojo.declare("dijit.layout.TabContainer",dijit.layout._TabContainerBase,{useMenu:true,useSlider:true,controllerWidget:"",_makeController:function(_4bd){var cls=this.baseClass+"-tabs"+(this.doLayout?"":" dijitTabNoLayout"),_4be=dojo.getObject(this.controllerWidget);return new _4be({id:this.id+"_tablist",dir:this.dir,lang:this.lang,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},_4bd);},postMixInProperties:function(){this.inherited(arguments);if(!this.controllerWidget){this.controllerWidget=(this.tabPosition=="top"||this.tabPosition=="bottom")&&!this.nested?"dijit.layout.ScrollingTabController":"dijit.layout.TabController";}}});}if(!dojo._hasResource["dojo.number"]){dojo._hasResource["dojo.number"]=true;dojo.provide("dojo.number");dojo.getObject("number",true,dojo);dojo.number.format=function(_4bf,_4c0){_4c0=dojo.mixin({},_4c0||{});var _4c1=dojo.i18n.normalizeLocale(_4c0.locale),_4c2=dojo.i18n.getLocalization("dojo.cldr","number",_4c1);_4c0.customs=_4c2;var _4c3=_4c0.pattern||_4c2[(_4c0.type||"decimal")+"Format"];if(isNaN(_4bf)||Math.abs(_4bf)==Infinity){return null;}return dojo.number._applyPattern(_4bf,_4c3,_4c0);};dojo.number._numberPatternRE=/[#0,]*[#0](?:\.0*#*)?/;dojo.number._applyPattern=function(_4c4,_4c5,_4c6){_4c6=_4c6||{};var _4c7=_4c6.customs.group,_4c8=_4c6.customs.decimal,_4c9=_4c5.split(";"),_4ca=_4c9[0];_4c5=_4c9[(_4c4<0)?1:0]||("-"+_4ca);if(_4c5.indexOf("%")!=-1){_4c4*=100;}else{if(_4c5.indexOf("‰")!=-1){_4c4*=1000;}else{if(_4c5.indexOf("¤")!=-1){_4c7=_4c6.customs.currencyGroup||_4c7;_4c8=_4c6.customs.currencyDecimal||_4c8;_4c5=_4c5.replace(/\u00a4{1,3}/,function(_4cb){var prop=["symbol","currency","displayName"][_4cb.length-1];return _4c6[prop]||_4c6.currency||"";});}else{if(_4c5.indexOf("E")!=-1){throw new Error("exponential notation not supported");}}}}var _4cc=dojo.number._numberPatternRE;var _4cd=_4ca.match(_4cc);if(!_4cd){throw new Error("unable to find a number expression in pattern: "+_4c5);}if(_4c6.fractional===false){_4c6.places=0;}return _4c5.replace(_4cc,dojo.number._formatAbsolute(_4c4,_4cd[0],{decimal:_4c8,group:_4c7,places:_4c6.places,round:_4c6.round}));};dojo.number.round=function(_4ce,_4cf,_4d0){var _4d1=10/(_4d0||10);return (_4d1*+_4ce).toFixed(_4cf)/_4d1;};if((0.9).toFixed()==0){(function(){var _4d2=dojo.number.round;dojo.number.round=function(v,p,m){var d=Math.pow(10,-p||0),a=Math.abs(v);if(!v||a>=d||a*Math.pow(10,p+1)<5){d=0;}return _4d2(v,p,m)+(v>0?d:-d);};})();}dojo.number._formatAbsolute=function(_4d3,_4d4,_4d5){_4d5=_4d5||{};if(_4d5.places===true){_4d5.places=0;}if(_4d5.places===Infinity){_4d5.places=6;}var _4d6=_4d4.split("."),_4d7=typeof _4d5.places=="string"&&_4d5.places.indexOf(","),_4d8=_4d5.places;if(_4d7){_4d8=_4d5.places.substring(_4d7+1);}else{if(!(_4d8>=0)){_4d8=(_4d6[1]||[]).length;}}if(!(_4d5.round<0)){_4d3=dojo.number.round(_4d3,_4d8,_4d5.round);}var _4d9=String(Math.abs(_4d3)).split("."),_4da=_4d9[1]||"";if(_4d6[1]||_4d5.places){if(_4d7){_4d5.places=_4d5.places.substring(0,_4d7);}var pad=_4d5.places!==undefined?_4d5.places:(_4d6[1]&&_4d6[1].lastIndexOf("0")+1);if(pad>_4da.length){_4d9[1]=dojo.string.pad(_4da,pad,"0",true);}if(_4d8<_4da.length){_4d9[1]=_4da.substr(0,_4d8);}}else{if(_4d9[1]){_4d9.pop();}}var _4db=_4d6[0].replace(",","");pad=_4db.indexOf("0");if(pad!=-1){pad=_4db.length-pad;if(pad>_4d9[0].length){_4d9[0]=dojo.string.pad(_4d9[0],pad);}if(_4db.indexOf("#")==-1){_4d9[0]=_4d9[0].substr(_4d9[0].length-pad);}}var _4dc=_4d6[0].lastIndexOf(","),_4dd,_4de;if(_4dc!=-1){_4dd=_4d6[0].length-_4dc-1;var _4df=_4d6[0].substr(0,_4dc);_4dc=_4df.lastIndexOf(",");if(_4dc!=-1){_4de=_4df.length-_4dc-1;}}var _4e0=[];for(var _4e1=_4d9[0];_4e1;){var off=_4e1.length-_4dd;_4e0.push((off>0)?_4e1.substr(off):_4e1);_4e1=(off>0)?_4e1.slice(0,off):"";if(_4de){_4dd=_4de;delete _4de;}}_4d9[0]=_4e0.reverse().join(_4d5.group||",");return _4d9.join(_4d5.decimal||".");};dojo.number.regexp=function(_4e2){return dojo.number._parseInfo(_4e2).regexp;};dojo.number._parseInfo=function(_4e3){_4e3=_4e3||{};var _4e4=dojo.i18n.normalizeLocale(_4e3.locale),_4e5=dojo.i18n.getLocalization("dojo.cldr","number",_4e4),_4e6=_4e3.pattern||_4e5[(_4e3.type||"decimal")+"Format"],_4e7=_4e5.group,_4e8=_4e5.decimal,_4e9=1;if(_4e6.indexOf("%")!=-1){_4e9/=100;}else{if(_4e6.indexOf("‰")!=-1){_4e9/=1000;}else{var _4ea=_4e6.indexOf("¤")!=-1;if(_4ea){_4e7=_4e5.currencyGroup||_4e7;_4e8=_4e5.currencyDecimal||_4e8;}}}var _4eb=_4e6.split(";");if(_4eb.length==1){_4eb.push("-"+_4eb[0]);}var re=dojo.regexp.buildGroupRE(_4eb,function(_4ec){_4ec="(?:"+dojo.regexp.escapeString(_4ec,".")+")";return _4ec.replace(dojo.number._numberPatternRE,function(_4ed){var _4ee={signed:false,separator:_4e3.strict?_4e7:[_4e7,""],fractional:_4e3.fractional,decimal:_4e8,exponent:false},_4ef=_4ed.split("."),_4f0=_4e3.places;if(_4ef.length==1&&_4e9!=1){_4ef[1]="###";}if(_4ef.length==1||_4f0===0){_4ee.fractional=false;}else{if(_4f0===undefined){_4f0=_4e3.pattern?_4ef[1].lastIndexOf("0")+1:Infinity;}if(_4f0&&_4e3.fractional==undefined){_4ee.fractional=true;}if(!_4e3.places&&(_4f0<_4ef[1].length)){_4f0+=","+_4ef[1].length;}_4ee.places=_4f0;}var _4f1=_4ef[0].split(",");if(_4f1.length>1){_4ee.groupSize=_4f1.pop().length;if(_4f1.length>1){_4ee.groupSize2=_4f1.pop().length;}}return "("+dojo.number._realNumberRegexp(_4ee)+")";});},true);if(_4ea){re=re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g,function(_4f2,_4f3,_4f4,_4f5){var prop=["symbol","currency","displayName"][_4f4.length-1],_4f6=dojo.regexp.escapeString(_4e3[prop]||_4e3.currency||"");_4f3=_4f3?"[\\s\\xa0]":"";_4f5=_4f5?"[\\s\\xa0]":"";if(!_4e3.strict){if(_4f3){_4f3+="*";}if(_4f5){_4f5+="*";}return "(?:"+_4f3+_4f6+_4f5+")?";}return _4f3+_4f6+_4f5;});}return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_4e7,decimal:_4e8,factor:_4e9};};dojo.number.parse=function(_4f7,_4f8){var info=dojo.number._parseInfo(_4f8),_4f9=(new RegExp("^"+info.regexp+"$")).exec(_4f7);if(!_4f9){return NaN;}var _4fa=_4f9[1];if(!_4f9[1]){if(!_4f9[2]){return NaN;}_4fa=_4f9[2];info.factor*=-1;}_4fa=_4fa.replace(new RegExp("["+info.group+"\\s\\xa0"+"]","g"),"").replace(info.decimal,".");return _4fa*info.factor;};dojo.number._realNumberRegexp=function(_4fb){_4fb=_4fb||{};if(!("places" in _4fb)){_4fb.places=Infinity;}if(typeof _4fb.decimal!="string"){_4fb.decimal=".";}if(!("fractional" in _4fb)||/^0/.test(_4fb.places)){_4fb.fractional=[true,false];}if(!("exponent" in _4fb)){_4fb.exponent=[true,false];}if(!("eSigned" in _4fb)){_4fb.eSigned=[true,false];}var _4fc=dojo.number._integerRegexp(_4fb),_4fd=dojo.regexp.buildGroupRE(_4fb.fractional,function(q){var re="";if(q&&(_4fb.places!==0)){re="\\"+_4fb.decimal;if(_4fb.places==Infinity){re="(?:"+re+"\\d+)?";}else{re+="\\d{"+_4fb.places+"}";}}return re;},true);var _4fe=dojo.regexp.buildGroupRE(_4fb.exponent,function(q){if(q){return "([eE]"+dojo.number._integerRegexp({signed:_4fb.eSigned})+")";}return "";});var _4ff=_4fc+_4fd;if(_4fd){_4ff="(?:(?:"+_4ff+")|(?:"+_4fd+"))";}return _4ff+_4fe;};dojo.number._integerRegexp=function(_500){_500=_500||{};if(!("signed" in _500)){_500.signed=[true,false];}if(!("separator" in _500)){_500.separator="";}else{if(!("groupSize" in _500)){_500.groupSize=3;}}var _501=dojo.regexp.buildGroupRE(_500.signed,function(q){return q?"[-+]":"";},true);var _502=dojo.regexp.buildGroupRE(_500.separator,function(sep){if(!sep){return "(?:\\d+)";}sep=dojo.regexp.escapeString(sep);if(sep==" "){sep="\\s";}else{if(sep==" "){sep="\\s\\xa0";}}var grp=_500.groupSize,grp2=_500.groupSize2;if(grp2){var _503="(?:0|[1-9]\\d{0,"+(grp2-1)+"}(?:["+sep+"]\\d{"+grp2+"})*["+sep+"]\\d{"+grp+"})";return ((grp-grp2)>0)?"(?:"+_503+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_503;}return "(?:0|[1-9]\\d{0,"+(grp-1)+"}(?:["+sep+"]\\d{"+grp+"})*)";},true);return _501+_502;};}if(!dojo._hasResource["dijit.ProgressBar"]){dojo._hasResource["dijit.ProgressBar"]=true;dojo.provide("dijit.ProgressBar");dojo.declare("dijit.ProgressBar",[dijit._Widget,dijit._Templated],{progress:"0",value:"",maximum:100,places:0,indeterminate:false,label:"",name:"",templateString:dojo.cache("dijit","templates/ProgressBar.html","<div class=\"dijitProgressBar dijitProgressBarEmpty\" role=\"progressbar\"\n\t><div dojoAttachPoint=\"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 dojoAttachPoint=\"labelNode\" class=\"dijitProgressBarLabel\" id=\"${id}_label\"></div\n\t><img dojoAttachPoint=\"indeterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\" alt=\"\"\n/></div>\n"),_indeterminateHighContrastImagePath:dojo.moduleUrl("dijit","themes/a11y/indeterminate_progress.gif"),postMixInProperties:function(){this.inherited(arguments);if(!("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(_504){dojo.mixin(this,_504||{});var tip=this.internalProgress,ap=this.domNode;var _505=1;if(this.indeterminate){dijit.removeWaiState(ap,"valuenow");dijit.removeWaiState(ap,"valuemin");dijit.removeWaiState(ap,"valuemax");}else{if(String(this.progress).indexOf("%")!=-1){_505=Math.min(parseFloat(this.progress)/100,1);this.progress=_505*this.maximum;}else{this.progress=Math.min(this.progress,this.maximum);_505=this.progress/this.maximum;}dijit.setWaiState(ap,"describedby",this.labelNode.id);dijit.setWaiState(ap,"valuenow",this.progress);dijit.setWaiState(ap,"valuemin",0);dijit.setWaiState(ap,"valuemax",this.maximum);}this.labelNode.innerHTML=this.report(_505);dojo.toggleClass(this.domNode,"dijitProgressBarIndeterminate",this.indeterminate);tip.style.width=(_505*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(_506){this._set("label",_506);this.update();},_setIndeterminateAttr:function(_507){this.indeterminate=_507;this.update();},report:function(_508){return this.label?this.label:(this.indeterminate?" ":dojo.number.format(_508,{type:"percent",places:this.places,locale:this.lang}));},onChange:function(){}});}if(!dojo._hasResource["dijit.ToolbarSeparator"]){dojo._hasResource["dijit.ToolbarSeparator"]=true;dojo.provide("dijit.ToolbarSeparator");dojo.declare("dijit.ToolbarSeparator",[dijit._Widget,dijit._Templated],{templateString:"<div class=\"dijitToolbarSeparator dijitInline\" role=\"presentation\"></div>",buildRendering:function(){this.inherited(arguments);dojo.setSelectable(this.domNode,false);},isFocusable:function(){return false;}});}if(!dojo._hasResource["dijit.Toolbar"]){dojo._hasResource["dijit.Toolbar"]=true;dojo.provide("dijit.Toolbar");dojo.declare("dijit.Toolbar",[dijit._Widget,dijit._Templated,dijit._KeyNavContainer],{templateString:"<div class=\"dijit\" role=\"toolbar\" tabIndex=\"${tabIndex}\" dojoAttachPoint=\"containerNode\">"+"</div>",baseClass:"dijitToolbar",postCreate:function(){this.inherited(arguments);this.connectKeyNavHandlers(this.isLeftToRight()?[dojo.keys.LEFT_ARROW]:[dojo.keys.RIGHT_ARROW],this.isLeftToRight()?[dojo.keys.RIGHT_ARROW]:[dojo.keys.LEFT_ARROW]);},startup:function(){if(this._started){return;}this.startupKeyNavChildren();this.inherited(arguments);}});}if(!dojo._hasResource["dojo.DeferredList"]){dojo._hasResource["dojo.DeferredList"]=true;dojo.provide("dojo.DeferredList");dojo.DeferredList=function(list,_509,_50a,_50b,_50c){var _50d=[];dojo.Deferred.call(this);var self=this;if(list.length===0&&!_509){this.resolve([0,[]]);}var _50e=0;dojo.forEach(list,function(item,i){item.then(function(_50f){if(_509){self.resolve([i,_50f]);}else{_510(true,_50f);}},function(_511){if(_50a){self.reject(_511);}else{_510(false,_511);}if(_50b){return null;}throw _511;});function _510(_512,_513){_50d[i]=[_512,_513];_50e++;if(_50e===list.length){self.resolve(_50d);}};});};dojo.DeferredList.prototype=new dojo.Deferred();dojo.DeferredList.prototype.gatherResults=function(_514){var d=new dojo.DeferredList(_514,false,true,false);d.addCallback(function(_515){var ret=[];dojo.forEach(_515,function(_516){ret.push(_516[1]);});return ret;});return d;};}if(!dojo._hasResource["dijit.tree.TreeStoreModel"]){dojo._hasResource["dijit.tree.TreeStoreModel"]=true;dojo.provide("dijit.tree.TreeStoreModel");dojo.declare("dijit.tree.TreeStoreModel",null,{store:null,childrenAttrs:["children"],newItemIdAttr:"id",labelAttr:"",root:null,query:null,deferItemLoadingUntilExpand:false,constructor:function(args){dojo.mixin(this,args);this.connects=[];var _517=this.store;if(!_517.getFeatures()["dojo.data.api.Identity"]){throw new Error("dijit.Tree: store must support dojo.data.Identity");}if(_517.getFeatures()["dojo.data.api.Notification"]){this.connects=this.connects.concat([dojo.connect(_517,"onNew",this,"onNewItem"),dojo.connect(_517,"onDelete",this,"onDeleteItem"),dojo.connect(_517,"onSet",this,"onSetItem")]);}},destroy:function(){dojo.forEach(this.connects,dojo.disconnect);},getRoot:function(_518,_519){if(this.root){_518(this.root);}else{this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_51a){if(_51a.length!=1){throw new Error(this.declaredClass+": query "+dojo.toJson(this.query)+" returned "+_51a.length+" items, but must return exactly one item");}this.root=_51a[0];_518(this.root);}),onError:_519});}},mayHaveChildren:function(item){return dojo.some(this.childrenAttrs,function(attr){return this.store.hasAttribute(item,attr);},this);},getChildren:function(_51b,_51c,_51d){var _51e=this.store;if(!_51e.isItemLoaded(_51b)){var _51f=dojo.hitch(this,arguments.callee);_51e.loadItem({item:_51b,onItem:function(_520){_51f(_520,_51c,_51d);},onError:_51d});return;}var _521=[];for(var i=0;i<this.childrenAttrs.length;i++){var vals=_51e.getValues(_51b,this.childrenAttrs[i]);_521=_521.concat(vals);}var _522=0;if(!this.deferItemLoadingUntilExpand){dojo.forEach(_521,function(item){if(!_51e.isItemLoaded(item)){_522++;}});}if(_522==0){_51c(_521);}else{dojo.forEach(_521,function(item,idx){if(!_51e.isItemLoaded(item)){_51e.loadItem({item:item,onItem:function(item){_521[idx]=item;if(--_522==0){_51c(_521);}},onError:_51d});}});}},isItem:function(_523){return this.store.isItem(_523);},fetchItemByIdentity:function(_524){this.store.fetchItemByIdentity(_524);},getIdentity:function(item){return this.store.getIdentity(item);},getLabel:function(item){if(this.labelAttr){return this.store.getValue(item,this.labelAttr);}else{return this.store.getLabel(item);}},newItem:function(args,_525,_526){var _527={parent:_525,attribute:this.childrenAttrs[0]},_528;if(this.newItemIdAttr&&args[this.newItemIdAttr]){this.fetchItemByIdentity({identity:args[this.newItemIdAttr],scope:this,onItem:function(item){if(item){this.pasteItem(item,null,_525,true,_526);}else{_528=this.store.newItem(args,_527);if(_528&&(_526!=undefined)){this.pasteItem(_528,_525,_525,false,_526);}}}});}else{_528=this.store.newItem(args,_527);if(_528&&(_526!=undefined)){this.pasteItem(_528,_525,_525,false,_526);}}},pasteItem:function(_529,_52a,_52b,_52c,_52d){var _52e=this.store,_52f=this.childrenAttrs[0];if(_52a){dojo.forEach(this.childrenAttrs,function(attr){if(_52e.containsValue(_52a,attr,_529)){if(!_52c){var _530=dojo.filter(_52e.getValues(_52a,attr),function(x){return x!=_529;});_52e.setValues(_52a,attr,_530);}_52f=attr;}});}if(_52b){if(typeof _52d=="number"){var _531=_52e.getValues(_52b,_52f).slice();_531.splice(_52d,0,_529);_52e.setValues(_52b,_52f,_531);}else{_52e.setValues(_52b,_52f,_52e.getValues(_52b,_52f).concat(_529));}}},onChange:function(item){},onChildrenChange:function(_532,_533){},onDelete:function(_534,_535){},onNewItem:function(item,_536){if(!_536){return;}this.getChildren(_536.item,dojo.hitch(this,function(_537){this.onChildrenChange(_536.item,_537);}));},onDeleteItem:function(item){this.onDelete(item);},onSetItem:function(item,_538,_539,_53a){if(dojo.indexOf(this.childrenAttrs,_538)!=-1){this.getChildren(item,dojo.hitch(this,function(_53b){this.onChildrenChange(item,_53b);}));}else{this.onChange(item);}}});}if(!dojo._hasResource["dijit.tree.ForestStoreModel"]){dojo._hasResource["dijit.tree.ForestStoreModel"]=true;dojo.provide("dijit.tree.ForestStoreModel");dojo.declare("dijit.tree.ForestStoreModel",dijit.tree.TreeStoreModel,{rootId:"$root$",rootLabel:"ROOT",query:null,constructor:function(_53c){this.root={store:this,root:true,id:_53c.rootId,label:_53c.rootLabel,children:_53c.rootChildren};},mayHaveChildren:function(item){return item===this.root||this.inherited(arguments);},getChildren:function(_53d,_53e,_53f){if(_53d===this.root){if(this.root.children){_53e(this.root.children);}else{this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_540){this.root.children=_540;_53e(_540);}),onError:_53f});}}else{this.inherited(arguments);}},isItem:function(_541){return (_541===this.root)?true:this.inherited(arguments);},fetchItemByIdentity:function(_542){if(_542.identity==this.root.id){var _543=_542.scope?_542.scope:dojo.global;if(_542.onItem){_542.onItem.call(_543,this.root);}}else{this.inherited(arguments);}},getIdentity:function(item){return (item===this.root)?this.root.id:this.inherited(arguments);},getLabel:function(item){return (item===this.root)?this.root.label:this.inherited(arguments);},newItem:function(args,_544,_545){if(_544===this.root){this.onNewRootItem(args);return this.store.newItem(args);}else{return this.inherited(arguments);}},onNewRootItem:function(args){},pasteItem:function(_546,_547,_548,_549,_54a){if(_547===this.root){if(!_549){this.onLeaveRoot(_546);}}dijit.tree.TreeStoreModel.prototype.pasteItem.call(this,_546,_547===this.root?null:_547,_548===this.root?null:_548,_549,_54a);if(_548===this.root){this.onAddToRoot(_546);}},onAddToRoot:function(item){console.log(this,": item ",item," added to root");},onLeaveRoot:function(item){console.log(this,": item ",item," removed from root");},_requeryTop:function(){var _54b=this.root.children||[];this.store.fetch({query:this.query,onComplete:dojo.hitch(this,function(_54c){this.root.children=_54c;if(_54b.length!=_54c.length||dojo.some(_54b,function(item,idx){return _54c[idx]!=item;})){this.onChildrenChange(this.root,_54c);}})});},onNewItem:function(item,_54d){this._requeryTop();this.inherited(arguments);},onDeleteItem:function(item){if(dojo.indexOf(this.root.children,item)!=-1){this._requeryTop();}this.inherited(arguments);},onSetItem:function(item,_54e,_54f,_550){this._requeryTop();this.inherited(arguments);}});}if(!dojo._hasResource["dojo.dnd.Container"]){dojo._hasResource["dojo.dnd.Container"]=true;dojo.provide("dojo.dnd.Container");dojo.declare("dojo.dnd.Container",null,{skipForm:false,constructor:function(node,_551){this.node=dojo.byId(node);if(!_551){_551={};}this.creator=_551.creator||null;this.skipForm=_551.skipForm;this.parent=_551.dropParent&&dojo.byId(_551.dropParent);this.map={};this.current=null;this.containerState="";dojo.addClass(this.node,"dojoDndContainer");if(!(_551&&_551._skipStartup)){this.startup();}this.events=[dojo.connect(this.node,"onmouseover",this,"onMouseOver"),dojo.connect(this.node,"onmouseout",this,"onMouseOut"),dojo.connect(this.node,"ondragstart",this,"onSelectStart"),dojo.connect(this.node,"onselectstart",this,"onSelectStart")];},creator:function(){},getItem:function(key){return this.map[key];},setItem:function(key,data){this.map[key]=data;},delItem:function(key){delete this.map[key];},forInItems:function(f,o){o=o||dojo.global;var m=this.map,e=dojo.dnd._empty;for(var i in m){if(i in e){continue;}f.call(o,m[i],i,this);}return o;},clearItems:function(){this.map={};},getAllNodes:function(){return dojo.query("> .dojoDndItem",this.parent);},sync:function(){var map={};this.getAllNodes().forEach(function(node){if(node.id){var item=this.getItem(node.id);if(item){map[node.id]=item;return;}}else{node.id=dojo.dnd.getUniqueId();}var type=node.getAttribute("dndType"),data=node.getAttribute("dndData");map[node.id]={data:data||node.innerHTML,type:type?type.split(/\s*,\s*/):["text"]};},this);this.map=map;return this;},insertNodes:function(data,_552,_553){if(!this.parent.firstChild){_553=null;}else{if(_552){if(!_553){_553=this.parent.firstChild;}}else{if(_553){_553=_553.nextSibling;}}}if(_553){for(var i=0;i<data.length;++i){var t=this._normalizedCreator(data[i]);this.setItem(t.node.id,{data:t.data,type:t.type});this.parent.insertBefore(t.node,_553);}}else{for(var i=0;i<data.length;++i){var t=this._normalizedCreator(data[i]);this.setItem(t.node.id,{data:t.data,type:t.type});this.parent.appendChild(t.node);}}return this;},destroy:function(){dojo.forEach(this.events,dojo.disconnect);this.clearItems();this.node=this.parent=this.current=null;},markupFactory:function(_554,node){_554._skipStartup=true;return new dojo.dnd.Container(node,_554);},startup:function(){if(!this.parent){this.parent=this.node;if(this.parent.tagName.toLowerCase()=="table"){var c=this.parent.getElementsByTagName("tbody");if(c&&c.length){this.parent=c[0];}}}this.defaultCreator=dojo.dnd._defaultCreator(this.parent);this.sync();},onMouseOver:function(e){var n=e.relatedTarget;while(n){if(n==this.node){break;}try{n=n.parentNode;}catch(x){n=null;}}if(!n){this._changeState("Container","Over");this.onOverEvent();}n=this._getChildByEvent(e);if(this.current==n){return;}if(this.current){this._removeItemClass(this.current,"Over");}if(n){this._addItemClass(n,"Over");}this.current=n;},onMouseOut:function(e){for(var n=e.relatedTarget;n;){if(n==this.node){return;}try{n=n.parentNode;}catch(x){n=null;}}if(this.current){this._removeItemClass(this.current,"Over");this.current=null;}this._changeState("Container","");this.onOutEvent();},onSelectStart:function(e){if(!this.skipForm||!dojo.dnd.isFormElement(e)){dojo.stopEvent(e);}},onOverEvent:function(){},onOutEvent:function(){},_changeState:function(type,_555){var _556="dojoDnd"+type;var _557=type.toLowerCase()+"State";dojo.replaceClass(this.node,_556+_555,_556+this[_557]);this[_557]=_555;},_addItemClass:function(node,type){dojo.addClass(node,"dojoDndItem"+type);},_removeItemClass:function(node,type){dojo.removeClass(node,"dojoDndItem"+type);},_getChildByEvent:function(e){var node=e.target;if(node){for(var _558=node.parentNode;_558;node=_558,_558=node.parentNode){if(_558==this.parent&&dojo.hasClass(node,"dojoDndItem")){return node;}}}return null;},_normalizedCreator:function(item,hint){var t=(this.creator||this.defaultCreator).call(this,item,hint);if(!dojo.isArray(t.type)){t.type=["text"];}if(!t.node.id){t.node.id=dojo.dnd.getUniqueId();}dojo.addClass(t.node,"dojoDndItem");return t;}});dojo.dnd._createNode=function(tag){if(!tag){return dojo.dnd._createSpan;}return function(text){return dojo.create(tag,{innerHTML:text});};};dojo.dnd._createTrTd=function(text){var tr=dojo.create("tr");dojo.create("td",{innerHTML:text},tr);return tr;};dojo.dnd._createSpan=function(text){return dojo.create("span",{innerHTML:text});};dojo.dnd._defaultCreatorNodes={ul:"li",ol:"li",div:"div",p:"div"};dojo.dnd._defaultCreator=function(node){var tag=node.tagName.toLowerCase();var c=tag=="tbody"||tag=="thead"?dojo.dnd._createTrTd:dojo.dnd._createNode(dojo.dnd._defaultCreatorNodes[tag]);return function(item,hint){var _559=item&&dojo.isObject(item),data,type,n;if(_559&&item.tagName&&item.nodeType&&item.getAttribute){data=item.getAttribute("dndData")||item.innerHTML;type=item.getAttribute("dndType");type=type?type.split(/\s*,\s*/):["text"];n=item;}else{data=(_559&&item.data)?item.data:item;type=(_559&&item.type)?item.type:["text"];n=(hint=="avatar"?dojo.dnd._createSpan:c)(String(data));}if(!n.id){n.id=dojo.dnd.getUniqueId();}return {node:n,data:data,type:type};};};}if(!dojo._hasResource["dijit.tree._dndContainer"]){dojo._hasResource["dijit.tree._dndContainer"]=true;dojo.provide("dijit.tree._dndContainer");dojo.getObject("tree",true,dojo);dijit.tree._compareNodes=function(n1,n2){if(n1===n2){return 0;}if("sourceIndex" in document.documentElement){return n1.sourceIndex-n2.sourceIndex;}else{if("compareDocumentPosition" in document.documentElement){return n1.compareDocumentPosition(n2)&2?1:-1;}else{if(document.createRange){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");}}}};dojo.declare("dijit.tree._dndContainer",null,{constructor:function(tree,_55a){this.tree=tree;this.node=tree.domNode;dojo.mixin(this,_55a);this.map={};this.current=null;this.containerState="";dojo.addClass(this.node,"dojoDndContainer");this.events=[dojo.connect(this.node,"onmouseenter",this,"onOverEvent"),dojo.connect(this.node,"onmouseleave",this,"onOutEvent"),dojo.connect(this.tree,"_onNodeMouseEnter",this,"onMouseOver"),dojo.connect(this.tree,"_onNodeMouseLeave",this,"onMouseOut"),dojo.connect(this.node,"ondragstart",dojo,"stopEvent"),dojo.connect(this.node,"onselectstart",dojo,"stopEvent")];},getItem:function(key){var _55b=this.selection[key],ret={data:_55b,type:["treeNode"]};return ret;},destroy:function(){dojo.forEach(this.events,dojo.disconnect);this.node=this.parent=null;},onMouseOver:function(_55c,evt){this.current=_55c;},onMouseOut:function(_55d,evt){this.current=null;},_changeState:function(type,_55e){var _55f="dojoDnd"+type;var _560=type.toLowerCase()+"State";dojo.replaceClass(this.node,_55f+_55e,_55f+this[_560]);this[_560]=_55e;},_addItemClass:function(node,type){dojo.addClass(node,"dojoDndItem"+type);},_removeItemClass:function(node,type){dojo.removeClass(node,"dojoDndItem"+type);},onOverEvent:function(){this._changeState("Container","Over");},onOutEvent:function(){this._changeState("Container","");}});}if(!dojo._hasResource["dijit.tree._dndSelector"]){dojo._hasResource["dijit.tree._dndSelector"]=true;dojo.provide("dijit.tree._dndSelector");dojo.declare("dijit.tree._dndSelector",dijit.tree._dndContainer,{constructor:function(tree,_561){this.selection={};this.anchor=null;dijit.setWaiState(this.tree.domNode,"multiselect",!this.singular);this.events.push(dojo.connect(this.tree.domNode,"onmousedown",this,"onMouseDown"),dojo.connect(this.tree.domNode,"onmouseup",this,"onMouseUp"),dojo.connect(this.tree.domNode,"onmousemove",this,"onMouseMove"));},singular:false,getSelectedTreeNodes:function(){var _562=[],sel=this.selection;for(var i in sel){_562.push(sel[i]);}return _562;},selectNone:function(){this.setSelection([]);return this;},destroy:function(){this.inherited(arguments);this.selection=this.anchor=null;},addTreeNode:function(node,_563){this.setSelection(this.getSelectedTreeNodes().concat([node]));if(_563){this.anchor=node;}return node;},removeTreeNode:function(node){this.setSelection(this._setDifference(this.getSelectedTreeNodes(),[node]));return node;},isTreeNodeSelected:function(node){return node.id&&!!this.selection[node.id];},setSelection:function(_564){var _565=this.getSelectedTreeNodes();dojo.forEach(this._setDifference(_565,_564),dojo.hitch(this,function(node){node.setSelected(false);if(this.anchor==node){delete this.anchor;}delete this.selection[node.id];}));dojo.forEach(this._setDifference(_564,_565),dojo.hitch(this,function(node){node.setSelected(true);this.selection[node.id]=node;}));this._updateSelectionProperties();},_setDifference:function(xs,ys){dojo.forEach(ys,function(y){y.__exclude__=true;});var ret=dojo.filter(xs,function(x){return !x.__exclude__;});dojo.forEach(ys,function(y){delete y["__exclude__"];});return ret;},_updateSelectionProperties:function(){var _566=this.getSelectedTreeNodes();var _567=[],_568=[];dojo.forEach(_566,function(node){_568.push(node);_567.push(node.getTreePath());});var _569=dojo.map(_568,function(node){return node.item;});this.tree._set("paths",_567);this.tree._set("path",_567[0]||[]);this.tree._set("selectedNodes",_568);this.tree._set("selectedNode",_568[0]||null);this.tree._set("selectedItems",_569);this.tree._set("selectedItem",_569[0]||null);},onMouseDown:function(e){if(!this.current||this.tree.isExpandoNode(e.target,this.current)){return;}if(e.button==dojo.mouseButtons.RIGHT){return;}dojo.stopEvent(e);var _56a=this.current,copy=dojo.isCopyKey(e),id=_56a.id;if(!this.singular&&!e.shiftKey&&this.selection[id]){this._doDeselect=true;return;}else{this._doDeselect=false;}this.userSelect(_56a,copy,e.shiftKey);},onMouseUp:function(e){if(!this._doDeselect){return;}this._doDeselect=false;this.userSelect(this.current,dojo.isCopyKey(e),e.shiftKey);},onMouseMove:function(e){this._doDeselect=false;},userSelect:function(node,_56b,_56c){if(this.singular){if(this.anchor==node&&_56b){this.selectNone();}else{this.setSelection([node]);this.anchor=node;}}else{if(_56c&&this.anchor){var cr=dijit.tree._compareNodes(this.anchor.rowNode,node.rowNode),_56d,end,_56e=this.anchor;if(cr<0){_56d=_56e;end=node;}else{_56d=node;end=_56e;}nodes=[];while(_56d!=end){nodes.push(_56d);_56d=this.tree._getNextNode(_56d);}nodes.push(end);this.setSelection(nodes);}else{if(this.selection[node.id]&&_56b){this.removeTreeNode(node);}else{if(_56b){this.addTreeNode(node,true);}else{this.setSelection([node]);this.anchor=node;}}}}},forInSelectedItems:function(f,o){o=o||dojo.global;for(var id in this.selection){f.call(o,this.getItem(id),id,this);}}});}if(!dojo._hasResource["dijit.Tree"]){dojo._hasResource["dijit.Tree"]=true;dojo.provide("dijit.Tree");dojo.declare("dijit._TreeNode",[dijit._Widget,dijit._Templated,dijit._Container,dijit._Contained,dijit._CssStateMixin],{item:null,isTreeNode:true,label:"",isExpandable:null,isExpanded:false,state:"UNCHECKED",templateString:dojo.cache("dijit","templates/TreeNode.html","<div class=\"dijitTreeNode\" role=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" class=\"dijitTreeRow\" role=\"presentation\" dojoAttachEvent=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\n\t\t><img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" role=\"presentation\"\n\t\t/><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" role=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"contentNode\"\n\t\t\tclass=\"dijitTreeContent\" role=\"presentation\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"iconNode\" class=\"dijitIcon dijitTreeIcon\" role=\"presentation\"\n\t\t\t/><span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" role=\"treeitem\" tabindex=\"-1\" aria-selected=\"false\" dojoAttachEvent=\"onfocus:_onLabelFocus\"></span>\n\t\t</span\n\t></div>\n\t<div dojoAttachPoint=\"containerNode\" class=\"dijitTreeContainer\" role=\"presentation\" style=\"display: none;\"></div>\n</div>\n"),baseClass:"dijitTreeNode",cssStateNodes:{rowNode:"dijitTreeRow",labelNode:"dijitTreeLabel"},attributeMap:dojo.delegate(dijit._Widget.prototype.attributeMap,{label:{node:"labelNode",type:"innerText"},tooltip:{node:"rowNode",type:"attribute",attribute:"title"}}),buildRendering:function(){this.inherited(arguments);this._setExpando();this._updateItemClasses(this.item);if(this.isExpandable){dijit.setWaiState(this.labelNode,"expanded",this.isExpanded);}this.setSelected(false);},_setIndentAttr:function(_56f){var _570=(Math.max(_56f,0)*this.tree._nodePixelIndent)+"px";dojo.style(this.domNode,"backgroundPosition",_570+" 0px");dojo.style(this.rowNode,this.isLeftToRight()?"paddingLeft":"paddingRight",_570);dojo.forEach(this.getChildren(),function(_571){_571.set("indent",_56f+1);});this._set("indent",_56f);},markProcessing:function(){this.state="LOADING";this._setExpando(true);},unmarkProcessing:function(){this._setExpando(false);},_updateItemClasses:function(item){var tree=this.tree,_572=tree.model;if(tree._v10Compat&&item===_572.root){item=null;}this._applyClassAndStyle(item,"icon","Icon");this._applyClassAndStyle(item,"label","Label");this._applyClassAndStyle(item,"row","Row");},_applyClassAndStyle:function(item,_573,_574){var _575="_"+_573+"Class";var _576=_573+"Node";var _577=this[_575];this[_575]=this.tree["get"+_574+"Class"](item,this.isExpanded);dojo.replaceClass(this[_576],this[_575]||"",_577||"");dojo.style(this[_576],this.tree["get"+_574+"Style"](item,this.isExpanded)||{});},_updateLayout:function(){var _578=this.getParent();if(!_578||_578.rowNode.style.display=="none"){dojo.addClass(this.domNode,"dijitTreeIsRoot");}else{dojo.toggleClass(this.domNode,"dijitTreeIsLast",!this.getNextSibling());}},_setExpando:function(_579){var _57a=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"],_57b=["*","-","+","*"],idx=_579?0:(this.isExpandable?(this.isExpanded?1:2):3);dojo.replaceClass(this.expandoNode,_57a[idx],_57a);this.expandoNodeText.innerHTML=_57b[idx];},expand:function(){if(this._expandDeferred){return this._expandDeferred;}this._wipeOut&&this._wipeOut.stop();this.isExpanded=true;dijit.setWaiState(this.labelNode,"expanded","true");if(this.tree.showRoot||this!==this.tree.rootNode){dijit.setWaiRole(this.containerNode,"group");}dojo.addClass(this.contentNode,"dijitTreeContentExpanded");this._setExpando();this._updateItemClasses(this.item);if(this==this.tree.rootNode){dijit.setWaiState(this.tree.domNode,"expanded","true");}var def,_57c=dojo.fx.wipeIn({node:this.containerNode,duration:dijit.defaultDuration,onEnd:function(){def.callback(true);}});def=(this._expandDeferred=new dojo.Deferred(function(){_57c.stop();}));_57c.play();return def;},collapse:function(){if(!this.isExpanded){return;}if(this._expandDeferred){this._expandDeferred.cancel();delete this._expandDeferred;}this.isExpanded=false;dijit.setWaiState(this.labelNode,"expanded","false");if(this==this.tree.rootNode){dijit.setWaiState(this.tree.domNode,"expanded","false");}dojo.removeClass(this.contentNode,"dijitTreeContentExpanded");this._setExpando();this._updateItemClasses(this.item);if(!this._wipeOut){this._wipeOut=dojo.fx.wipeOut({node:this.containerNode,duration:dijit.defaultDuration});}this._wipeOut.play();},indent:0,setChildItems:function(_57d){var tree=this.tree,_57e=tree.model,defs=[];dojo.forEach(this.getChildren(),function(_57f){dijit._Container.prototype.removeChild.call(this,_57f);},this);this.state="LOADED";if(_57d&&_57d.length>0){this.isExpandable=true;dojo.forEach(_57d,function(item){var id=_57e.getIdentity(item),_580=tree._itemNodesMap[id],node;if(_580){for(var i=0;i<_580.length;i++){if(_580[i]&&!_580[i].getParent()){node=_580[i];node.set("indent",this.indent+1);break;}}}if(!node){node=this.tree._createTreeNode({item:item,tree:tree,isExpandable:_57e.mayHaveChildren(item),label:tree.getLabel(item),tooltip:tree.getTooltip(item),dir:tree.dir,lang:tree.lang,indent:this.indent+1});if(_580){_580.push(node);}else{tree._itemNodesMap[id]=[node];}}this.addChild(node);if(this.tree.autoExpand||this.tree._state(item)){defs.push(tree._expandNode(node));}},this);dojo.forEach(this.getChildren(),function(_581,idx){_581._updateLayout();});}else{this.isExpandable=false;}if(this._setExpando){this._setExpando(false);}this._updateItemClasses(this.item);if(this==tree.rootNode){var fc=this.tree.showRoot?this:this.getChildren()[0];if(fc){fc.setFocusable(true);tree.lastFocused=fc;}else{tree.domNode.setAttribute("tabIndex","0");}}return new dojo.DeferredList(defs);},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(node){this.inherited(arguments);var _582=this.getChildren();if(_582.length==0){this.isExpandable=false;this.collapse();}dojo.forEach(_582,function(_583){_583._updateLayout();});},makeExpandable:function(){this.isExpandable=true;this._setExpando(false);},_onLabelFocus:function(evt){this.tree._onNodeFocus(this);},setSelected:function(_584){dijit.setWaiState(this.labelNode,"selected",_584);dojo.toggleClass(this.rowNode,"dijitTreeRowSelected",_584);},setFocusable:function(_585){this.labelNode.setAttribute("tabIndex",_585?"0":"-1");},_onClick:function(evt){this.tree._onClick(this,evt);},_onDblClick:function(evt){this.tree._onDblClick(this,evt);},_onMouseEnter:function(evt){this.tree._onNodeMouseEnter(this,evt);},_onMouseLeave:function(evt){this.tree._onNodeMouseLeave(this,evt);}});dojo.declare("dijit.Tree",[dijit._Widget,dijit._Templated],{store:null,model:null,query:null,label:"",showRoot:true,childrenAttr:["children"],paths:[],path:[],selectedItems:null,selectedItem:null,openOnClick:false,openOnDblClick:false,templateString:dojo.cache("dijit","templates/Tree.html","<div class=\"dijitTree dijitTreeContainer\" role=\"tree\"\n\tdojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<div class=\"dijitInline dijitTreeIndent\" style=\"position: absolute; top: -9999px\" dojoAttachPoint=\"indentDetector\"></div>\n</div>\n"),persist:true,autoExpand:false,dndController:"dijit.tree._dndSelector",dndParams:["onDndDrop","itemCreator","onDndCancel","checkAcceptance","checkItemAcceptance","dragThreshold","betweenThreshold"],onDndDrop:null,itemCreator:null,onDndCancel:null,checkAcceptance:null,checkItemAcceptance:null,dragThreshold:5,betweenThreshold:0,_nodePixelIndent:19,_publish:function(_586,_587){dojo.publish(this.id,[dojo.mixin({tree:this,event:_586},_587||{})]);},postMixInProperties:function(){this.tree=this;if(this.autoExpand){this.persist=false;}this._itemNodesMap={};if(!this.cookieName){this.cookieName=this.id+"SaveStateCookie";}this._loadDeferred=new dojo.Deferred();this.inherited(arguments);},postCreate:function(){this._initState();if(!this.model){this._store2model();}this.connect(this.model,"onChange","_onItemChange");this.connect(this.model,"onChildrenChange","_onItemChildrenChange");this.connect(this.model,"onDelete","_onItemDelete");this._load();this.inherited(arguments);if(this.dndController){if(dojo.isString(this.dndController)){this.dndController=dojo.getObject(this.dndController);}var _588={};for(var i=0;i<this.dndParams.length;i++){if(this[this.dndParams[i]]){_588[this.dndParams[i]]=this[this.dndParams[i]];}}this.dndController=new this.dndController(this,_588);}},_store2model:function(){this._v10Compat=true;dojo.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");var _589={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};if(this.params.mayHaveChildren){_589.mayHaveChildren=dojo.hitch(this,"mayHaveChildren");}if(this.params.getItemChildren){_589.getChildren=dojo.hitch(this,function(item,_58a,_58b){this.getItemChildren((this._v10Compat&&item===this.model.root)?null:item,_58a,_58b);});}this.model=new dijit.tree.ForestStoreModel(_589);this.showRoot=Boolean(this.label);},onLoad:function(){},_load:function(){this.model.getRoot(dojo.hitch(this,function(item){var rn=(this.rootNode=this.tree._createTreeNode({item:item,tree:this,isExpandable:true,label:this.label||this.getLabel(item),indent:this.showRoot?0:-1}));if(!this.showRoot){rn.rowNode.style.display="none";dijit.setWaiRole(this.domNode,"presentation");dijit.setWaiRole(rn.labelNode,"presentation");dijit.setWaiRole(rn.containerNode,"tree");}this.domNode.appendChild(rn.domNode);var _58c=this.model.getIdentity(item);if(this._itemNodesMap[_58c]){this._itemNodesMap[_58c].push(rn);}else{this._itemNodesMap[_58c]=[rn];}rn._updateLayout();this._expandNode(rn).addCallback(dojo.hitch(this,function(){this._loadDeferred.callback(true);this.onLoad();}));}),function(err){console.error(this,": error loading root: ",err);});},getNodesByItem:function(item){if(!item){return [];}var _58d=dojo.isString(item)?item:this.model.getIdentity(item);return [].concat(this._itemNodesMap[_58d]);},_setSelectedItemAttr:function(item){this.set("selectedItems",[item]);},_setSelectedItemsAttr:function(_58e){var tree=this;this._loadDeferred.addCallback(dojo.hitch(this,function(){var _58f=dojo.map(_58e,function(item){return (!item||dojo.isString(item))?item:tree.model.getIdentity(item);});var _590=[];dojo.forEach(_58f,function(id){_590=_590.concat(tree._itemNodesMap[id]||[]);});this.set("selectedNodes",_590);}));},_setPathAttr:function(path){if(path.length){return this.set("paths",[path]);}else{return this.set("paths",[]);}},_setPathsAttr:function(_591){var tree=this;return new dojo.DeferredList(dojo.map(_591,function(path){var d=new dojo.Deferred();path=dojo.map(path,function(item){return dojo.isString(item)?item:tree.model.getIdentity(item);});if(path.length){tree._loadDeferred.addCallback(function(){_592(path,[tree.rootNode],d);});}else{d.errback("Empty path");}return d;})).addCallback(_593);function _592(path,_594,def){var _595=path.shift();var _596=dojo.filter(_594,function(node){return node.getIdentity()==_595;})[0];if(!!_596){if(path.length){tree._expandNode(_596).addCallback(function(){_592(path,_596.getChildren(),def);});}else{def.callback(_596);}}else{def.errback("Could not expand path at "+_595);}};function _593(_597){tree.set("selectedNodes",dojo.map(dojo.filter(_597,function(x){return x[0];}),function(x){return x[1];}));};},_setSelectedNodeAttr:function(node){this.set("selectedNodes",[node]);},_setSelectedNodesAttr:function(_598){this._loadDeferred.addCallback(dojo.hitch(this,function(){this.dndController.setSelection(_598);}));},mayHaveChildren:function(item){},getItemChildren:function(_599,_59a){},getLabel:function(item){return this.model.getLabel(item);},getIconClass:function(item,_59b){return (!item||this.model.mayHaveChildren(item))?(_59b?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";},getLabelClass:function(item,_59c){},getRowClass:function(item,_59d){},getIconStyle:function(item,_59e){},getLabelStyle:function(item,_59f){},getRowStyle:function(item,_5a0){},getTooltip:function(item){return "";},_onKeyPress:function(e){if(e.altKey){return;}var dk=dojo.keys;var _5a1=dijit.getEnclosingWidget(e.target);if(!_5a1){return;}var key=e.charOrCode;if(typeof key=="string"&&key!=" "){if(!e.altKey&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey){this._onLetterKeyNav({node:_5a1,key:key.toLowerCase()});dojo.stopEvent(e);}}else{if(this._curSearch){clearTimeout(this._curSearch.timer);delete this._curSearch;}var map=this._keyHandlerMap;if(!map){map={};map[dk.ENTER]="_onEnterKey";map[dk.SPACE]=map[" "]="_onEnterKey";map[this.isLeftToRight()?dk.LEFT_ARROW:dk.RIGHT_ARROW]="_onLeftArrow";map[this.isLeftToRight()?dk.RIGHT_ARROW:dk.LEFT_ARROW]="_onRightArrow";map[dk.UP_ARROW]="_onUpArrow";map[dk.DOWN_ARROW]="_onDownArrow";map[dk.HOME]="_onHomeKey";map[dk.END]="_onEndKey";this._keyHandlerMap=map;}if(this._keyHandlerMap[key]){this[this._keyHandlerMap[key]]({node:_5a1,item:_5a1.item,evt:e});dojo.stopEvent(e);}}},_onEnterKey:function(_5a2){this._publish("execute",{item:_5a2.item,node:_5a2.node});this.dndController.userSelect(_5a2.node,dojo.isCopyKey(_5a2.evt),_5a2.evt.shiftKey);this.onClick(_5a2.item,_5a2.node,_5a2.evt);},_onDownArrow:function(_5a3){var node=this._getNextNode(_5a3.node);if(node&&node.isTreeNode){this.focusNode(node);}},_onUpArrow:function(_5a4){var node=_5a4.node;var _5a5=node.getPreviousSibling();if(_5a5){node=_5a5;while(node.isExpandable&&node.isExpanded&&node.hasChildren()){var _5a6=node.getChildren();node=_5a6[_5a6.length-1];}}else{var _5a7=node.getParent();if(!(!this.showRoot&&_5a7===this.rootNode)){node=_5a7;}}if(node&&node.isTreeNode){this.focusNode(node);}},_onRightArrow:function(_5a8){var node=_5a8.node;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(_5a9){var node=_5a9.node;if(node.isExpandable&&node.isExpanded){this._collapseNode(node);}else{var _5aa=node.getParent();if(_5aa&&_5aa.isTreeNode&&!(!this.showRoot&&_5aa===this.rootNode)){this.focusNode(_5aa);}}},_onHomeKey:function(){var node=this._getRootOrFirstNode();if(node){this.focusNode(node);}},_onEndKey:function(_5ab){var node=this.rootNode;while(node.isExpanded){var c=node.getChildren();node=c[c.length-1];}if(node&&node.isTreeNode){this.focusNode(node);}},multiCharSearchDuration:250,_onLetterKeyNav:function(_5ac){var cs=this._curSearch;if(cs){cs.pattern=cs.pattern+_5ac.key;clearTimeout(cs.timer);}else{cs=this._curSearch={pattern:_5ac.key,startNode:_5ac.node};}var self=this;cs.timer=setTimeout(function(){delete self._curSearch;},this.multiCharSearchDuration);var node=cs.startNode;do{node=this._getNextNode(node);if(!node){node=this._getRootOrFirstNode();}}while(node!==cs.startNode&&(node.label.toLowerCase().substr(0,cs.pattern.length)!=cs.pattern));if(node&&node.isTreeNode){if(node!==cs.startNode){this.focusNode(node);}}},isExpandoNode:function(node,_5ad){return dojo.isDescendant(node,_5ad.expandoNode);},_onClick:function(_5ae,e){var _5af=e.target,_5b0=this.isExpandoNode(_5af,_5ae);if((this.openOnClick&&_5ae.isExpandable)||_5b0){if(_5ae.isExpandable){this._onExpandoClick({node:_5ae});}}else{this._publish("execute",{item:_5ae.item,node:_5ae,evt:e});this.onClick(_5ae.item,_5ae,e);this.focusNode(_5ae);}dojo.stopEvent(e);},_onDblClick:function(_5b1,e){var _5b2=e.target,_5b3=(_5b2==_5b1.expandoNode||_5b2==_5b1.expandoNodeText);if((this.openOnDblClick&&_5b1.isExpandable)||_5b3){if(_5b1.isExpandable){this._onExpandoClick({node:_5b1});}}else{this._publish("execute",{item:_5b1.item,node:_5b1,evt:e});this.onDblClick(_5b1.item,_5b1,e);this.focusNode(_5b1);}dojo.stopEvent(e);},_onExpandoClick:function(_5b4){var node=_5b4.node;this.focusNode(node);if(node.isExpanded){this._collapseNode(node);}else{this._expandNode(node);}},onClick:function(item,node,evt){},onDblClick:function(item,node,evt){},onOpen:function(item,node){},onClose:function(item,node){},_getNextNode:function(node){if(node.isExpandable&&node.isExpanded&&node.hasChildren()){return node.getChildren()[0];}else{while(node&&node.isTreeNode){var _5b5=node.getNextSibling();if(_5b5){return _5b5;}node=node.getParent();}return null;}},_getRootOrFirstNode:function(){return this.showRoot?this.rootNode:this.rootNode.getChildren()[0];},_collapseNode:function(node){if(node._expandNodeDeferred){delete node._expandNodeDeferred;}if(node.isExpandable){if(node.state=="LOADING"){return;}node.collapse();this.onClose(node.item,node);if(node.item){this._state(node.item,false);this._saveState();}}},_expandNode:function(node,_5b6){if(node._expandNodeDeferred&&!_5b6){return node._expandNodeDeferred;}var _5b7=this.model,item=node.item,_5b8=this;switch(node.state){case "UNCHECKED":node.markProcessing();var def=(node._expandNodeDeferred=new dojo.Deferred());_5b7.getChildren(item,function(_5b9){node.unmarkProcessing();var scid=node.setChildItems(_5b9);var ed=_5b8._expandNode(node,true);scid.addCallback(function(){ed.addCallback(function(){def.callback();});});},function(err){console.error(_5b8,": error loading root children: ",err);});break;default:def=(node._expandNodeDeferred=node.expand());this.onOpen(node.item,node);if(item){this._state(item,true);this._saveState();}}return def;},focusNode:function(node){dijit.focus(node.labelNode);},_onNodeFocus:function(node){if(node&&node!=this.lastFocused){if(this.lastFocused&&!this.lastFocused._destroyed){this.lastFocused.setFocusable(false);}node.setFocusable(true);this.lastFocused=node;}},_onNodeMouseEnter:function(node){},_onNodeMouseLeave:function(node){},_onItemChange:function(item){var _5ba=this.model,_5bb=_5ba.getIdentity(item),_5bc=this._itemNodesMap[_5bb];if(_5bc){var _5bd=this.getLabel(item),_5be=this.getTooltip(item);dojo.forEach(_5bc,function(node){node.set({item:item,label:_5bd,tooltip:_5be});node._updateItemClasses(item);});}},_onItemChildrenChange:function(_5bf,_5c0){var _5c1=this.model,_5c2=_5c1.getIdentity(_5bf),_5c3=this._itemNodesMap[_5c2];if(_5c3){dojo.forEach(_5c3,function(_5c4){_5c4.setChildItems(_5c0);});}},_onItemDelete:function(item){var _5c5=this.model,_5c6=_5c5.getIdentity(item),_5c7=this._itemNodesMap[_5c6];if(_5c7){dojo.forEach(_5c7,function(node){this.dndController.removeTreeNode(node);var _5c8=node.getParent();if(_5c8){_5c8.removeChild(node);}node.destroyRecursive();},this);delete this._itemNodesMap[_5c6];}},_initState:function(){if(this.persist){var _5c9=dojo.cookie(this.cookieName);this._openedItemIds={};if(_5c9){dojo.forEach(_5c9.split(","),function(item){this._openedItemIds[item]=true;},this);}}},_state:function(item,_5ca){if(!this.persist){return false;}var id=this.model.getIdentity(item);if(arguments.length===1){return this._openedItemIds[id];}if(_5ca){this._openedItemIds[id]=true;}else{delete this._openedItemIds[id];}},_saveState:function(){if(!this.persist){return;}var ary=[];for(var id in this._openedItemIds){ary.push(id);}dojo.cookie(this.cookieName,ary.join(","),{expires:365});},destroy:function(){if(this._curSearch){clearTimeout(this._curSearch.timer);delete this._curSearch;}if(this.rootNode){this.rootNode.destroyRecursive();}if(this.dndController&&!dojo.isString(this.dndController)){this.dndController.destroy();}this.rootNode=null;this.inherited(arguments);},destroyRecursive:function(){this.destroy();},resize:function(_5cb){if(_5cb){dojo.marginBox(this.domNode,_5cb);}this._nodePixelIndent=dojo._getMarginSize(this.tree.indentDetector).w;if(this.tree.rootNode){this.tree.rootNode.set("indent",this.showRoot?0:-1);}},_createTreeNode:function(args){return new dijit._TreeNode(args);}});}if(!dojo._hasResource["dojo.dnd.Avatar"]){dojo._hasResource["dojo.dnd.Avatar"]=true;dojo.provide("dojo.dnd.Avatar");dojo.declare("dojo.dnd.Avatar",null,{constructor:function(_5cc){this.manager=_5cc;this.construct();},construct:function(){this.isA11y=dojo.hasClass(dojo.body(),"dijit_a11y");var a=dojo.create("table",{"class":"dojoDndAvatar",style:{position:"absolute",zIndex:"1999",margin:"0px"}}),_5cd=this.manager.source,node,b=dojo.create("tbody",null,a),tr=dojo.create("tr",null,b),td=dojo.create("td",null,tr),icon=this.isA11y?dojo.create("span",{id:"a11yIcon",innerHTML:this.manager.copy?"+":"<"},td):null,span=dojo.create("span",{innerHTML:_5cd.generateText?this._generateText():""},td),k=Math.min(5,this.manager.nodes.length),i=0;dojo.attr(tr,{"class":"dojoDndAvatarHeader",style:{opacity:0.9}});for(;i<k;++i){if(_5cd.creator){node=_5cd._normalizedCreator(_5cd.getItem(this.manager.nodes[i].id).data,"avatar").node;}else{node=this.manager.nodes[i].cloneNode(true);if(node.tagName.toLowerCase()=="tr"){var _5ce=dojo.create("table"),_5cf=dojo.create("tbody",null,_5ce);_5cf.appendChild(node);node=_5ce;}}node.id="";tr=dojo.create("tr",null,b);td=dojo.create("td",null,tr);td.appendChild(node);dojo.attr(tr,{"class":"dojoDndAvatarItem",style:{opacity:(9-i)/10}});}this.node=a;},destroy:function(){dojo.destroy(this.node);this.node=false;},update:function(){dojo[(this.manager.canDropFlag?"add":"remove")+"Class"](this.node,"dojoDndAvatarCanDrop");if(this.isA11y){var icon=dojo.byId("a11yIcon");var text="+";if(this.manager.canDropFlag&&!this.manager.copy){text="< ";}else{if(!this.manager.canDropFlag&&!this.manager.copy){text="o";}else{if(!this.manager.canDropFlag){text="x";}}}icon.innerHTML=text;}dojo.query(("tr.dojoDndAvatarHeader td span"+(this.isA11y?" span":"")),this.node).forEach(function(node){node.innerHTML=this._generateText();},this);},_generateText:function(){return this.manager.nodes.length.toString();}});}if(!dojo._hasResource["dojo.dnd.Manager"]){dojo._hasResource["dojo.dnd.Manager"]=true;dojo.provide("dojo.dnd.Manager");dojo.declare("dojo.dnd.Manager",null,{constructor:function(){this.avatar=null;this.source=null;this.nodes=[];this.copy=true;this.target=null;this.canDropFlag=false;this.events=[];},OFFSET_X:16,OFFSET_Y:16,overSource:function(_5d0){if(this.avatar){this.target=(_5d0&&_5d0.targetState!="Disabled")?_5d0:null;this.canDropFlag=Boolean(this.target);this.avatar.update();}dojo.publish("/dnd/source/over",[_5d0]);},outSource:function(_5d1){if(this.avatar){if(this.target==_5d1){this.target=null;this.canDropFlag=false;this.avatar.update();dojo.publish("/dnd/source/over",[null]);}}else{dojo.publish("/dnd/source/over",[null]);}},startDrag:function(_5d2,_5d3,copy){this.source=_5d2;this.nodes=_5d3;this.copy=Boolean(copy);this.avatar=this.makeAvatar();dojo.body().appendChild(this.avatar.node);dojo.publish("/dnd/start",[_5d2,_5d3,this.copy]);this.events=[dojo.connect(dojo.doc,"onmousemove",this,"onMouseMove"),dojo.connect(dojo.doc,"onmouseup",this,"onMouseUp"),dojo.connect(dojo.doc,"onkeydown",this,"onKeyDown"),dojo.connect(dojo.doc,"onkeyup",this,"onKeyUp"),dojo.connect(dojo.doc,"ondragstart",dojo.stopEvent),dojo.connect(dojo.body(),"onselectstart",dojo.stopEvent)];var c="dojoDnd"+(copy?"Copy":"Move");dojo.addClass(dojo.body(),c);},canDrop:function(flag){var _5d4=Boolean(this.target&&flag);if(this.canDropFlag!=_5d4){this.canDropFlag=_5d4;this.avatar.update();}},stopDrag:function(){dojo.removeClass(dojo.body(),["dojoDndCopy","dojoDndMove"]);dojo.forEach(this.events,dojo.disconnect);this.events=[];this.avatar.destroy();this.avatar=null;this.source=this.target=null;this.nodes=[];},makeAvatar:function(){return new dojo.dnd.Avatar(this);},updateAvatar:function(){this.avatar.update();},onMouseMove:function(e){var a=this.avatar;if(a){dojo.dnd.autoScrollNodes(e);var s=a.node.style;s.left=(e.pageX+this.OFFSET_X)+"px";s.top=(e.pageY+this.OFFSET_Y)+"px";var copy=Boolean(this.source.copyState(dojo.isCopyKey(e)));if(this.copy!=copy){this._setCopyStatus(copy);}}},onMouseUp:function(e){if(this.avatar){if(this.target&&this.canDropFlag){var copy=Boolean(this.source.copyState(dojo.isCopyKey(e))),_5d5=[this.source,this.nodes,copy,this.target,e];dojo.publish("/dnd/drop/before",_5d5);dojo.publish("/dnd/drop",_5d5);}else{dojo.publish("/dnd/cancel");}this.stopDrag();}},onKeyDown:function(e){if(this.avatar){switch(e.keyCode){case dojo.keys.CTRL:var copy=Boolean(this.source.copyState(true));if(this.copy!=copy){this._setCopyStatus(copy);}break;case dojo.keys.ESCAPE:dojo.publish("/dnd/cancel");this.stopDrag();break;}}},onKeyUp:function(e){if(this.avatar&&e.keyCode==dojo.keys.CTRL){var copy=Boolean(this.source.copyState(false));if(this.copy!=copy){this._setCopyStatus(copy);}}},_setCopyStatus:function(copy){this.copy=copy;this.source._markDndStatus(this.copy);this.updateAvatar();dojo.replaceClass(dojo.body(),"dojoDnd"+(this.copy?"Copy":"Move"),"dojoDnd"+(this.copy?"Move":"Copy"));}});dojo.dnd._manager=null;dojo.dnd.manager=function(){if(!dojo.dnd._manager){dojo.dnd._manager=new dojo.dnd.Manager();}return dojo.dnd._manager;};}if(!dojo._hasResource["dijit.tree.dndSource"]){dojo._hasResource["dijit.tree.dndSource"]=true;dojo.provide("dijit.tree.dndSource");dojo.declare("dijit.tree.dndSource",dijit.tree._dndSelector,{isSource:true,accept:["text","treeNode"],copyOnly:false,dragThreshold:5,betweenThreshold:0,constructor:function(tree,_5d6){if(!_5d6){_5d6={};}dojo.mixin(this,_5d6);this.isSource=typeof _5d6.isSource=="undefined"?true:_5d6.isSource;var type=_5d6.accept instanceof Array?_5d6.accept:["text","treeNode"];this.accept=null;if(type.length){this.accept={};for(var i=0;i<type.length;++i){this.accept[type[i]]=1;}}this.isDragging=false;this.mouseDown=false;this.targetAnchor=null;this.targetBox=null;this.dropPosition="";this._lastX=0;this._lastY=0;this.sourceState="";if(this.isSource){dojo.addClass(this.node,"dojoDndSource");}this.targetState="";if(this.accept){dojo.addClass(this.node,"dojoDndTarget");}this.topics=[dojo.subscribe("/dnd/source/over",this,"onDndSourceOver"),dojo.subscribe("/dnd/start",this,"onDndStart"),dojo.subscribe("/dnd/drop",this,"onDndDrop"),dojo.subscribe("/dnd/cancel",this,"onDndCancel")];},checkAcceptance:function(_5d7,_5d8){return true;},copyState:function(_5d9){return this.copyOnly||_5d9;},destroy:function(){this.inherited("destroy",arguments);dojo.forEach(this.topics,dojo.unsubscribe);this.targetAnchor=null;},_onDragMouse:function(e){var m=dojo.dnd.manager(),_5da=this.targetAnchor,_5db=this.current,_5dc=this.dropPosition;var _5dd="Over";if(_5db&&this.betweenThreshold>0){if(!this.targetBox||_5da!=_5db){this.targetBox=dojo.position(_5db.rowNode,true);}if((e.pageY-this.targetBox.y)<=this.betweenThreshold){_5dd="Before";}else{if((e.pageY-this.targetBox.y)>=(this.targetBox.h-this.betweenThreshold)){_5dd="After";}}}if(_5db!=_5da||_5dd!=_5dc){if(_5da){this._removeItemClass(_5da.rowNode,_5dc);}if(_5db){this._addItemClass(_5db.rowNode,_5dd);}if(!_5db){m.canDrop(false);}else{if(_5db==this.tree.rootNode&&_5dd!="Over"){m.canDrop(false);}else{if(m.source==this&&(_5db.id in this.selection)){m.canDrop(false);}else{if(this.checkItemAcceptance(_5db.rowNode,m.source,_5dd.toLowerCase())&&!this._isParentChildDrop(m.source,_5db.rowNode)){m.canDrop(true);}else{m.canDrop(false);}}}}this.targetAnchor=_5db;this.dropPosition=_5dd;}},onMouseMove:function(e){if(this.isDragging&&this.targetState=="Disabled"){return;}this.inherited(arguments);var m=dojo.dnd.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 _5de=this.getSelectedTreeNodes();if(_5de.length){if(_5de.length>1){var seen=this.selection,i=0,r=[],n,p;nextitem:while((n=_5de[i++])){for(p=n.getParent();p&&p!==this.tree;p=p.getParent()){if(seen[p.id]){continue nextitem;}}r.push(n);}_5de=r;}_5de=dojo.map(_5de,function(n){return n.domNode;});m.startDrag(this,_5de,this.copyState(dojo.isCopyKey(e)));}}}},onMouseDown:function(e){this.mouseDown=true;this.mouseButton=e.button;this._lastX=e.pageX;this._lastY=e.pageY;this.inherited(arguments);},onMouseUp:function(e){if(this.mouseDown){this.mouseDown=false;this.inherited(arguments);}},onMouseOut:function(){this.inherited(arguments);this._unmarkTargetAnchor();},checkItemAcceptance:function(_5df,_5e0,_5e1){return true;},onDndSourceOver:function(_5e2){if(this!=_5e2){this.mouseDown=false;this._unmarkTargetAnchor();}else{if(this.isDragging){var m=dojo.dnd.manager();m.canDrop(false);}}},onDndStart:function(_5e3,_5e4,copy){if(this.isSource){this._changeState("Source",this==_5e3?(copy?"Copied":"Moved"):"");}var _5e5=this.checkAcceptance(_5e3,_5e4);this._changeState("Target",_5e5?"":"Disabled");if(this==_5e3){dojo.dnd.manager().overSource(this);}this.isDragging=true;},itemCreator:function(_5e6,_5e7,_5e8){return dojo.map(_5e6,function(node){return {"id":node.id,"name":node.textContent||node.innerText||""};});},onDndDrop:function(_5e9,_5ea,copy){if(this.containerState=="Over"){var tree=this.tree,_5eb=tree.model,_5ec=this.targetAnchor,_5ed=false;this.isDragging=false;var _5ee=_5ec;var _5ef;var _5f0;_5ef=(_5ee&&_5ee.item)||tree.item;if(this.dropPosition=="Before"||this.dropPosition=="After"){_5ef=(_5ee.getParent()&&_5ee.getParent().item)||tree.item;_5f0=_5ee.getIndexInParent();if(this.dropPosition=="After"){_5f0=_5ee.getIndexInParent()+1;}}else{_5ef=(_5ee&&_5ee.item)||tree.item;}var _5f1;dojo.forEach(_5ea,function(node,idx){var _5f2=_5e9.getItem(node.id);if(dojo.indexOf(_5f2.type,"treeNode")!=-1){var _5f3=_5f2.data,_5f4=_5f3.item,_5f5=_5f3.getParent().item;}if(_5e9==this){if(typeof _5f0=="number"){if(_5ef==_5f5&&_5f3.getIndexInParent()<_5f0){_5f0-=1;}}_5eb.pasteItem(_5f4,_5f5,_5ef,copy,_5f0);}else{if(_5eb.isItem(_5f4)){_5eb.pasteItem(_5f4,_5f5,_5ef,copy,_5f0);}else{if(!_5f1){_5f1=this.itemCreator(_5ea,_5ec.rowNode,_5e9);}_5eb.newItem(_5f1[idx],_5ef,_5f0);}}},this);this.tree._expandNode(_5ee);}this.onDndCancel();},onDndCancel:function(){this._unmarkTargetAnchor();this.isDragging=false;this.mouseDown=false;delete this.mouseButton;this._changeState("Source","");this._changeState("Target","");},onOverEvent:function(){this.inherited(arguments);dojo.dnd.manager().overSource(this);},onOutEvent:function(){this._unmarkTargetAnchor();var m=dojo.dnd.manager();if(this.isDragging){m.canDrop(false);}m.outSource(this);this.inherited(arguments);},_isParentChildDrop:function(_5f6,_5f7){if(!_5f6.tree||_5f6.tree!=this.tree){return false;}var root=_5f6.tree.domNode;var ids=_5f6.selection;var node=_5f7.parentNode;while(node!=root&&!ids[node.id]){node=node.parentNode;}return node.id&&ids[node.id];},_unmarkTargetAnchor:function(){if(!this.targetAnchor){return;}this._removeItemClass(this.targetAnchor.rowNode,this.dropPosition);this.targetAnchor=null;this.targetBox=null;this.dropPosition=null;},_markDndStatus:function(copy){this._changeState("Source",copy?"Copied":"Moved");}});}if(!dojo._hasResource["dojo.data.ItemFileReadStore"]){dojo._hasResource["dojo.data.ItemFileReadStore"]=true;dojo.provide("dojo.data.ItemFileReadStore");dojo.declare("dojo.data.ItemFileReadStore",null,{constructor:function(_5f8){this._arrayOfAllItems=[];this._arrayOfTopLevelItems=[];this._loadFinished=false;this._jsonFileUrl=_5f8.url;this._ccUrl=_5f8.url;this.url=_5f8.url;this._jsonData=_5f8.data;this.data=null;this._datatypeMap=_5f8.typeMap||{};if(!this._datatypeMap["Date"]){this._datatypeMap["Date"]={type:Date,deserialize:function(_5f9){return dojo.date.stamp.fromISOString(_5f9);}};}this._features={"dojo.data.api.Read":true,"dojo.data.api.Identity":true};this._itemsByIdentity=null;this._storeRefPropName="_S";this._itemNumPropName="_0";this._rootItemPropName="_RI";this._reverseRefMap="_RRM";this._loadInProgress=false;this._queuedFetches=[];if(_5f8.urlPreventCache!==undefined){this.urlPreventCache=_5f8.urlPreventCache?true:false;}if(_5f8.hierarchical!==undefined){this.hierarchical=_5f8.hierarchical?true:false;}if(_5f8.clearOnClose){this.clearOnClose=true;}if("failOk" in _5f8){this.failOk=_5f8.failOk?true:false;}},url:"",_ccUrl:"",data:null,typeMap:null,clearOnClose:false,urlPreventCache:false,failOk:false,hierarchical:true,_assertIsItem:function(item){if(!this.isItem(item)){throw new Error("dojo.data.ItemFileReadStore: Invalid item argument.");}},_assertIsAttribute:function(_5fa){if(typeof _5fa!=="string"){throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");}},getValue:function(item,_5fb,_5fc){var _5fd=this.getValues(item,_5fb);return (_5fd.length>0)?_5fd[0]:_5fc;},getValues:function(item,_5fe){this._assertIsItem(item);this._assertIsAttribute(_5fe);return (item[_5fe]||[]).slice(0);},getAttributes:function(item){this._assertIsItem(item);var _5ff=[];for(var key in item){if((key!==this._storeRefPropName)&&(key!==this._itemNumPropName)&&(key!==this._rootItemPropName)&&(key!==this._reverseRefMap)){_5ff.push(key);}}return _5ff;},hasAttribute:function(item,_600){this._assertIsItem(item);this._assertIsAttribute(_600);return (_600 in item);},containsValue:function(item,_601,_602){var _603=undefined;if(typeof _602==="string"){_603=dojo.data.util.filter.patternToRegExp(_602,false);}return this._containsValue(item,_601,_602,_603);},_containsValue:function(item,_604,_605,_606){return dojo.some(this.getValues(item,_604),function(_607){if(_607!==null&&!dojo.isObject(_607)&&_606){if(_607.toString().match(_606)){return true;}}else{if(_605===_607){return true;}}});},isItem:function(_608){if(_608&&_608[this._storeRefPropName]===this){if(this._arrayOfAllItems[_608[this._itemNumPropName]]===_608){return true;}}return false;},isItemLoaded:function(_609){return this.isItem(_609);},loadItem:function(_60a){this._assertIsItem(_60a.item);},getFeatures:function(){return this._features;},getLabel:function(item){if(this._labelAttr&&this.isItem(item)){return this.getValue(item,this._labelAttr);}return undefined;},getLabelAttributes:function(item){if(this._labelAttr){return [this._labelAttr];}return null;},_fetchItems:function(_60b,_60c,_60d){var self=this,_60e=function(_60f,_610){var _611=[],i,key;if(_60f.query){var _612,_613=_60f.queryOptions?_60f.queryOptions.ignoreCase:false;var _614={};for(key in _60f.query){_612=_60f.query[key];if(typeof _612==="string"){_614[key]=dojo.data.util.filter.patternToRegExp(_612,_613);}else{if(_612 instanceof RegExp){_614[key]=_612;}}}for(i=0;i<_610.length;++i){var _615=true;var _616=_610[i];if(_616===null){_615=false;}else{for(key in _60f.query){_612=_60f.query[key];if(!self._containsValue(_616,key,_612,_614[key])){_615=false;}}}if(_615){_611.push(_616);}}_60c(_611,_60f);}else{for(i=0;i<_610.length;++i){var item=_610[i];if(item!==null){_611.push(item);}}_60c(_611,_60f);}};if(this._loadFinished){_60e(_60b,this._getItemsArray(_60b.queryOptions));}else{if(this._jsonFileUrl!==this._ccUrl){dojo.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){if(this._loadInProgress){this._queuedFetches.push({args:_60b,filter:_60e});}else{this._loadInProgress=true;var _617={url:self._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};var _618=dojo.xhrGet(_617);_618.addCallback(function(data){try{self._getItemsFromLoadedData(data);self._loadFinished=true;self._loadInProgress=false;_60e(_60b,self._getItemsArray(_60b.queryOptions));self._handleQueuedFetches();}catch(e){self._loadFinished=true;self._loadInProgress=false;_60d(e,_60b);}});_618.addErrback(function(_619){self._loadInProgress=false;_60d(_619,_60b);});var _61a=null;if(_60b.abort){_61a=_60b.abort;}_60b.abort=function(){var df=_618;if(df&&df.fired===-1){df.cancel();df=null;}if(_61a){_61a.call(_60b);}};}}else{if(this._jsonData){try{this._loadFinished=true;this._getItemsFromLoadedData(this._jsonData);this._jsonData=null;_60e(_60b,this._getItemsArray(_60b.queryOptions));}catch(e){_60d(e,_60b);}}else{_60d(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."),_60b);}}}},_handleQueuedFetches:function(){if(this._queuedFetches.length>0){for(var i=0;i<this._queuedFetches.length;i++){var _61b=this._queuedFetches[i],_61c=_61b.args,_61d=_61b.filter;if(_61d){_61d(_61c,this._getItemsArray(_61c.queryOptions));}else{this.fetchItemByIdentity(_61c);}}this._queuedFetches=[];}},_getItemsArray:function(_61e){if(_61e&&_61e.deep){return this._arrayOfAllItems;}return this._arrayOfTopLevelItems;},close:function(_61f){if(this.clearOnClose&&this._loadFinished&&!this._loadInProgress){if(((this._jsonFileUrl==""||this._jsonFileUrl==null)&&(this.url==""||this.url==null))&&this.data==null){console.debug("dojo.data.ItemFileReadStore: WARNING! Data reload "+" information has not been provided."+" Please set 'url' or 'data' to the appropriate value before"+" the next fetch");}this._arrayOfAllItems=[];this._arrayOfTopLevelItems=[];this._loadFinished=false;this._itemsByIdentity=null;this._loadInProgress=false;this._queuedFetches=[];}},_getItemsFromLoadedData:function(_620){var _621=false,self=this;function _622(_623){var _624=((_623!==null)&&(typeof _623==="object")&&(!dojo.isArray(_623)||_621)&&(!dojo.isFunction(_623))&&(_623.constructor==Object||dojo.isArray(_623))&&(typeof _623._reference==="undefined")&&(typeof _623._type==="undefined")&&(typeof _623._value==="undefined")&&self.hierarchical);return _624;};function _625(_626){self._arrayOfAllItems.push(_626);for(var _627 in _626){var _628=_626[_627];if(_628){if(dojo.isArray(_628)){var _629=_628;for(var k=0;k<_629.length;++k){var _62a=_629[k];if(_622(_62a)){_625(_62a);}}}else{if(_622(_628)){_625(_628);}}}}};this._labelAttr=_620.label;var i,item;this._arrayOfAllItems=[];this._arrayOfTopLevelItems=_620.items;for(i=0;i<this._arrayOfTopLevelItems.length;++i){item=this._arrayOfTopLevelItems[i];if(dojo.isArray(item)){_621=true;}_625(item);item[this._rootItemPropName]=true;}var _62b={},key;for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];for(key in item){if(key!==this._rootItemPropName){var _62c=item[key];if(_62c!==null){if(!dojo.isArray(_62c)){item[key]=[_62c];}}else{item[key]=[null];}}_62b[key]=key;}}while(_62b[this._storeRefPropName]){this._storeRefPropName+="_";}while(_62b[this._itemNumPropName]){this._itemNumPropName+="_";}while(_62b[this._reverseRefMap]){this._reverseRefMap+="_";}var _62d;var _62e=_620.identifier;if(_62e){this._itemsByIdentity={};this._features["dojo.data.api.Identity"]=_62e;for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];_62d=item[_62e];var _62f=_62d[0];if(!Object.hasOwnProperty.call(this._itemsByIdentity,_62f)){this._itemsByIdentity[_62f]=item;}else{if(this._jsonFileUrl){throw new Error("dojo.data.ItemFileReadStore: The json data as specified by: ["+this._jsonFileUrl+"] is malformed. Items within the list have identifier: ["+_62e+"]. Value collided: ["+_62f+"]");}else{if(this._jsonData){throw new Error("dojo.data.ItemFileReadStore: The json data provided by the creation arguments is malformed. Items within the list have identifier: ["+_62e+"]. Value collided: ["+_62f+"]");}}}}}else{this._features["dojo.data.api.Identity"]=Number;}for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];item[this._storeRefPropName]=this;item[this._itemNumPropName]=i;}for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];for(key in item){_62d=item[key];for(var j=0;j<_62d.length;++j){_62c=_62d[j];if(_62c!==null&&typeof _62c=="object"){if(("_type" in _62c)&&("_value" in _62c)){var type=_62c._type;var _630=this._datatypeMap[type];if(!_630){throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '"+type+"'");}else{if(dojo.isFunction(_630)){_62d[j]=new _630(_62c._value);}else{if(dojo.isFunction(_630.deserialize)){_62d[j]=_630.deserialize(_62c._value);}else{throw new Error("dojo.data.ItemFileReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function");}}}}if(_62c._reference){var _631=_62c._reference;if(!dojo.isObject(_631)){_62d[j]=this._getItemByIdentity(_631);}else{for(var k=0;k<this._arrayOfAllItems.length;++k){var _632=this._arrayOfAllItems[k],_633=true;for(var _634 in _631){if(_632[_634]!=_631[_634]){_633=false;}}if(_633){_62d[j]=_632;}}}if(this.referenceIntegrity){var _635=_62d[j];if(this.isItem(_635)){this._addReferenceToMap(_635,item,key);}}}else{if(this.isItem(_62c)){if(this.referenceIntegrity){this._addReferenceToMap(_62c,item,key);}}}}}}}},_addReferenceToMap:function(_636,_637,_638){},getIdentity:function(item){var _639=this._features["dojo.data.api.Identity"];if(_639===Number){return item[this._itemNumPropName];}else{var _63a=item[_639];if(_63a){return _63a[0];}}return null;},fetchItemByIdentity:function(_63b){var item,_63c;if(!this._loadFinished){var self=this;if(this._jsonFileUrl!==this._ccUrl){dojo.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null&&this._jsonData==null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){if(this._loadInProgress){this._queuedFetches.push({args:_63b});}else{this._loadInProgress=true;var _63d={url:self._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};var _63e=dojo.xhrGet(_63d);_63e.addCallback(function(data){var _63f=_63b.scope?_63b.scope:dojo.global;try{self._getItemsFromLoadedData(data);self._loadFinished=true;self._loadInProgress=false;item=self._getItemByIdentity(_63b.identity);if(_63b.onItem){_63b.onItem.call(_63f,item);}self._handleQueuedFetches();}catch(error){self._loadInProgress=false;if(_63b.onError){_63b.onError.call(_63f,error);}}});_63e.addErrback(function(_640){self._loadInProgress=false;if(_63b.onError){var _641=_63b.scope?_63b.scope:dojo.global;_63b.onError.call(_641,_640);}});}}else{if(this._jsonData){self._getItemsFromLoadedData(self._jsonData);self._jsonData=null;self._loadFinished=true;item=self._getItemByIdentity(_63b.identity);if(_63b.onItem){_63c=_63b.scope?_63b.scope:dojo.global;_63b.onItem.call(_63c,item);}}}}else{item=this._getItemByIdentity(_63b.identity);if(_63b.onItem){_63c=_63b.scope?_63b.scope:dojo.global;_63b.onItem.call(_63c,item);}}},_getItemByIdentity:function(_642){var item=null;if(this._itemsByIdentity&&Object.hasOwnProperty.call(this._itemsByIdentity,_642)){item=this._itemsByIdentity[_642];}else{if(Object.hasOwnProperty.call(this._arrayOfAllItems,_642)){item=this._arrayOfAllItems[_642];}}if(item===undefined){item=null;}return item;},getIdentityAttributes:function(item){var _643=this._features["dojo.data.api.Identity"];if(_643===Number){return null;}else{return [_643];}},_forceLoad:function(){var self=this;if(this._jsonFileUrl!==this._ccUrl){dojo.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){var _644={url:this._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk,sync:true};var _645=dojo.xhrGet(_644);_645.addCallback(function(data){try{if(self._loadInProgress!==true&&!self._loadFinished){self._getItemsFromLoadedData(data);self._loadFinished=true;}else{if(self._loadInProgress){throw new Error("dojo.data.ItemFileReadStore: Unable to perform a synchronous load, an async load is in progress.");}}}catch(e){console.log(e);throw e;}});_645.addErrback(function(_646){throw _646;});}else{if(this._jsonData){self._getItemsFromLoadedData(self._jsonData);self._jsonData=null;self._loadFinished=true;}}}});dojo.extend(dojo.data.ItemFileReadStore,dojo.data.util.simpleFetch);}if(!dojo._hasResource["dojo.data.ItemFileWriteStore"]){dojo._hasResource["dojo.data.ItemFileWriteStore"]=true;dojo.provide("dojo.data.ItemFileWriteStore");dojo.declare("dojo.data.ItemFileWriteStore",dojo.data.ItemFileReadStore,{constructor:function(_647){this._features["dojo.data.api.Write"]=true;this._features["dojo.data.api.Notification"]=true;this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};if(!this._datatypeMap["Date"].serialize){this._datatypeMap["Date"].serialize=function(obj){return dojo.date.stamp.toISOString(obj,{zulu:true});};}if(_647&&(_647.referenceIntegrity===false)){this.referenceIntegrity=false;}this._saveInProgress=false;},referenceIntegrity:true,_assert:function(_648){if(!_648){throw new Error("assertion failed in ItemFileWriteStore");}},_getIdentifierAttribute:function(){var _649=this.getFeatures()["dojo.data.api.Identity"];return _649;},newItem:function(_64a,_64b){this._assert(!this._saveInProgress);if(!this._loadFinished){this._forceLoad();}if(typeof _64a!="object"&&typeof _64a!="undefined"){throw new Error("newItem() was passed something other than an object");}var _64c=null;var _64d=this._getIdentifierAttribute();if(_64d===Number){_64c=this._arrayOfAllItems.length;}else{_64c=_64a[_64d];if(typeof _64c==="undefined"){throw new Error("newItem() was not passed an identity for the new item");}if(dojo.isArray(_64c)){throw new Error("newItem() was not passed an single-valued identity");}}if(this._itemsByIdentity){this._assert(typeof this._itemsByIdentity[_64c]==="undefined");}this._assert(typeof this._pending._newItems[_64c]==="undefined");this._assert(typeof this._pending._deletedItems[_64c]==="undefined");var _64e={};_64e[this._storeRefPropName]=this;_64e[this._itemNumPropName]=this._arrayOfAllItems.length;if(this._itemsByIdentity){this._itemsByIdentity[_64c]=_64e;_64e[_64d]=[_64c];}this._arrayOfAllItems.push(_64e);var _64f=null;if(_64b&&_64b.parent&&_64b.attribute){_64f={item:_64b.parent,attribute:_64b.attribute,oldValue:undefined};var _650=this.getValues(_64b.parent,_64b.attribute);if(_650&&_650.length>0){var _651=_650.slice(0,_650.length);if(_650.length===1){_64f.oldValue=_650[0];}else{_64f.oldValue=_650.slice(0,_650.length);}_651.push(_64e);this._setValueOrValues(_64b.parent,_64b.attribute,_651,false);_64f.newValue=this.getValues(_64b.parent,_64b.attribute);}else{this._setValueOrValues(_64b.parent,_64b.attribute,_64e,false);_64f.newValue=_64e;}}else{_64e[this._rootItemPropName]=true;this._arrayOfTopLevelItems.push(_64e);}this._pending._newItems[_64c]=_64e;for(var key in _64a){if(key===this._storeRefPropName||key===this._itemNumPropName){throw new Error("encountered bug in ItemFileWriteStore.newItem");}var _652=_64a[key];if(!dojo.isArray(_652)){_652=[_652];}_64e[key]=_652;if(this.referenceIntegrity){for(var i=0;i<_652.length;i++){var val=_652[i];if(this.isItem(val)){this._addReferenceToMap(val,_64e,key);}}}}this.onNew(_64e,_64f);return _64e;},_removeArrayElement:function(_653,_654){var _655=dojo.indexOf(_653,_654);if(_655!=-1){_653.splice(_655,1);return true;}return false;},deleteItem:function(item){this._assert(!this._saveInProgress);this._assertIsItem(item);var _656=item[this._itemNumPropName];var _657=this.getIdentity(item);if(this.referenceIntegrity){var _658=this.getAttributes(item);if(item[this._reverseRefMap]){item["backup_"+this._reverseRefMap]=dojo.clone(item[this._reverseRefMap]);}dojo.forEach(_658,function(_659){dojo.forEach(this.getValues(item,_659),function(_65a){if(this.isItem(_65a)){if(!item["backupRefs_"+this._reverseRefMap]){item["backupRefs_"+this._reverseRefMap]=[];}item["backupRefs_"+this._reverseRefMap].push({id:this.getIdentity(_65a),attr:_659});this._removeReferenceFromMap(_65a,item,_659);}},this);},this);var _65b=item[this._reverseRefMap];if(_65b){for(var _65c in _65b){var _65d=null;if(this._itemsByIdentity){_65d=this._itemsByIdentity[_65c];}else{_65d=this._arrayOfAllItems[_65c];}if(_65d){for(var _65e in _65b[_65c]){var _65f=this.getValues(_65d,_65e)||[];var _660=dojo.filter(_65f,function(_661){return !(this.isItem(_661)&&this.getIdentity(_661)==_657);},this);this._removeReferenceFromMap(item,_65d,_65e);if(_660.length<_65f.length){this._setValueOrValues(_65d,_65e,_660,true);}}}}}}this._arrayOfAllItems[_656]=null;item[this._storeRefPropName]=null;if(this._itemsByIdentity){delete this._itemsByIdentity[_657];}this._pending._deletedItems[_657]=item;if(item[this._rootItemPropName]){this._removeArrayElement(this._arrayOfTopLevelItems,item);}this.onDelete(item);return true;},setValue:function(item,_662,_663){return this._setValueOrValues(item,_662,_663,true);},setValues:function(item,_664,_665){return this._setValueOrValues(item,_664,_665,true);},unsetAttribute:function(item,_666){return this._setValueOrValues(item,_666,[],true);},_setValueOrValues:function(item,_667,_668,_669){this._assert(!this._saveInProgress);this._assertIsItem(item);this._assert(dojo.isString(_667));this._assert(typeof _668!=="undefined");var _66a=this._getIdentifierAttribute();if(_667==_66a){throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier.");}var _66b=this._getValueOrValues(item,_667);var _66c=this.getIdentity(item);if(!this._pending._modifiedItems[_66c]){var _66d={};for(var key in item){if((key===this._storeRefPropName)||(key===this._itemNumPropName)||(key===this._rootItemPropName)){_66d[key]=item[key];}else{if(key===this._reverseRefMap){_66d[key]=dojo.clone(item[key]);}else{_66d[key]=item[key].slice(0,item[key].length);}}}this._pending._modifiedItems[_66c]=_66d;}var _66e=false;if(dojo.isArray(_668)&&_668.length===0){_66e=delete item[_667];_668=undefined;if(this.referenceIntegrity&&_66b){var _66f=_66b;if(!dojo.isArray(_66f)){_66f=[_66f];}for(var i=0;i<_66f.length;i++){var _670=_66f[i];if(this.isItem(_670)){this._removeReferenceFromMap(_670,item,_667);}}}}else{var _671;if(dojo.isArray(_668)){var _672=_668;_671=_668.slice(0,_668.length);}else{_671=[_668];}if(this.referenceIntegrity){if(_66b){var _66f=_66b;if(!dojo.isArray(_66f)){_66f=[_66f];}var map={};dojo.forEach(_66f,function(_673){if(this.isItem(_673)){var id=this.getIdentity(_673);map[id.toString()]=true;}},this);dojo.forEach(_671,function(_674){if(this.isItem(_674)){var id=this.getIdentity(_674);if(map[id.toString()]){delete map[id.toString()];}else{this._addReferenceToMap(_674,item,_667);}}},this);for(var rId in map){var _675;if(this._itemsByIdentity){_675=this._itemsByIdentity[rId];}else{_675=this._arrayOfAllItems[rId];}this._removeReferenceFromMap(_675,item,_667);}}else{for(var i=0;i<_671.length;i++){var _670=_671[i];if(this.isItem(_670)){this._addReferenceToMap(_670,item,_667);}}}}item[_667]=_671;_66e=true;}if(_669){this.onSet(item,_667,_66b,_668);}return _66e;},_addReferenceToMap:function(_676,_677,_678){var _679=this.getIdentity(_677);var _67a=_676[this._reverseRefMap];if(!_67a){_67a=_676[this._reverseRefMap]={};}var _67b=_67a[_679];if(!_67b){_67b=_67a[_679]={};}_67b[_678]=true;},_removeReferenceFromMap:function(_67c,_67d,_67e){var _67f=this.getIdentity(_67d);var _680=_67c[this._reverseRefMap];var _681;if(_680){for(_681 in _680){if(_681==_67f){delete _680[_681][_67e];if(this._isEmpty(_680[_681])){delete _680[_681];}}}if(this._isEmpty(_680)){delete _67c[this._reverseRefMap];}}},_dumpReferenceMap:function(){var i;for(i=0;i<this._arrayOfAllItems.length;i++){var item=this._arrayOfAllItems[i];if(item&&item[this._reverseRefMap]){console.log("Item: ["+this.getIdentity(item)+"] is referenced by: "+dojo.toJson(item[this._reverseRefMap]));}}},_getValueOrValues:function(item,_682){var _683=undefined;if(this.hasAttribute(item,_682)){var _684=this.getValues(item,_682);if(_684.length==1){_683=_684[0];}else{_683=_684;}}return _683;},_flatten:function(_685){if(this.isItem(_685)){var item=_685;var _686=this.getIdentity(item);var _687={_reference:_686};return _687;}else{if(typeof _685==="object"){for(var type in this._datatypeMap){var _688=this._datatypeMap[type];if(dojo.isObject(_688)&&!dojo.isFunction(_688)){if(_685 instanceof _688.type){if(!_688.serialize){throw new Error("ItemFileWriteStore: No serializer defined for type mapping: ["+type+"]");}return {_type:type,_value:_688.serialize(_685)};}}else{if(_685 instanceof _688){return {_type:type,_value:_685.toString()};}}}}return _685;}},_getNewFileContentString:function(){var _689={};var _68a=this._getIdentifierAttribute();if(_68a!==Number){_689.identifier=_68a;}if(this._labelAttr){_689.label=this._labelAttr;}_689.items=[];for(var i=0;i<this._arrayOfAllItems.length;++i){var item=this._arrayOfAllItems[i];if(item!==null){var _68b={};for(var key in item){if(key!==this._storeRefPropName&&key!==this._itemNumPropName&&key!==this._reverseRefMap&&key!==this._rootItemPropName){var _68c=key;var _68d=this.getValues(item,_68c);if(_68d.length==1){_68b[_68c]=this._flatten(_68d[0]);}else{var _68e=[];for(var j=0;j<_68d.length;++j){_68e.push(this._flatten(_68d[j]));_68b[_68c]=_68e;}}}}_689.items.push(_68b);}}var _68f=true;return dojo.toJson(_689,_68f);},_isEmpty:function(_690){var _691=true;if(dojo.isObject(_690)){var i;for(i in _690){_691=false;break;}}else{if(dojo.isArray(_690)){if(_690.length>0){_691=false;}}}return _691;},save:function(_692){this._assert(!this._saveInProgress);this._saveInProgress=true;var self=this;var _693=function(){self._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};self._saveInProgress=false;if(_692&&_692.onComplete){var _694=_692.scope||dojo.global;_692.onComplete.call(_694);}};var _695=function(err){self._saveInProgress=false;if(_692&&_692.onError){var _696=_692.scope||dojo.global;_692.onError.call(_696,err);}};if(this._saveEverything){var _697=this._getNewFileContentString();this._saveEverything(_693,_695,_697);}if(this._saveCustom){this._saveCustom(_693,_695);}if(!this._saveEverything&&!this._saveCustom){_693();}},revert:function(){this._assert(!this._saveInProgress);var _698;for(_698 in this._pending._modifiedItems){var _699=this._pending._modifiedItems[_698];var _69a=null;if(this._itemsByIdentity){_69a=this._itemsByIdentity[_698];}else{_69a=this._arrayOfAllItems[_698];}_699[this._storeRefPropName]=this;for(key in _69a){delete _69a[key];}dojo.mixin(_69a,_699);}var _69b;for(_698 in this._pending._deletedItems){_69b=this._pending._deletedItems[_698];_69b[this._storeRefPropName]=this;var _69c=_69b[this._itemNumPropName];if(_69b["backup_"+this._reverseRefMap]){_69b[this._reverseRefMap]=_69b["backup_"+this._reverseRefMap];delete _69b["backup_"+this._reverseRefMap];}this._arrayOfAllItems[_69c]=_69b;if(this._itemsByIdentity){this._itemsByIdentity[_698]=_69b;}if(_69b[this._rootItemPropName]){this._arrayOfTopLevelItems.push(_69b);}}for(_698 in this._pending._deletedItems){_69b=this._pending._deletedItems[_698];if(_69b["backupRefs_"+this._reverseRefMap]){dojo.forEach(_69b["backupRefs_"+this._reverseRefMap],function(_69d){var _69e;if(this._itemsByIdentity){_69e=this._itemsByIdentity[_69d.id];}else{_69e=this._arrayOfAllItems[_69d.id];}this._addReferenceToMap(_69e,_69b,_69d.attr);},this);delete _69b["backupRefs_"+this._reverseRefMap];}}for(_698 in this._pending._newItems){var _69f=this._pending._newItems[_698];_69f[this._storeRefPropName]=null;this._arrayOfAllItems[_69f[this._itemNumPropName]]=null;if(_69f[this._rootItemPropName]){this._removeArrayElement(this._arrayOfTopLevelItems,_69f);}if(this._itemsByIdentity){delete this._itemsByIdentity[_698];}}this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};return true;},isDirty:function(item){if(item){var _6a0=this.getIdentity(item);return new Boolean(this._pending._newItems[_6a0]||this._pending._modifiedItems[_6a0]||this._pending._deletedItems[_6a0]).valueOf();}else{if(!this._isEmpty(this._pending._newItems)||!this._isEmpty(this._pending._modifiedItems)||!this._isEmpty(this._pending._deletedItems)){return true;}return false;}},onSet:function(item,_6a1,_6a2,_6a3){},onNew:function(_6a4,_6a5){},onDelete:function(_6a6){},close:function(_6a7){if(this.clearOnClose){if(!this.isDirty()){this.inherited(arguments);}else{throw new Error("dojo.data.ItemFileWriteStore: There are unsaved changes present in the store. Please save or revert the changes before invoking close.");}}}});}dojo.i18n._preloadLocalizations("dojo.nls.tt-rss-layer",["ROOT","ar","ca","cs","da","de","de-de","el","en","en-gb","en-us","es","es-es","fi","fi-fi","fr","fr-fr","he","he-il","hu","it","it-it","ja","ja-jp","ko","ko-kr","nb","nl","nl-nl","pl","pt","pt-br","pt-pt","ru","sk","sl","sv","th","tr","xx","zh","zh-cn","zh-tw"]); +//>>built +require({cache:{"dijit/form/TextBox":function(){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","dojo/dom-construct","dojo/dom-style","dojo/_base/kernel","dojo/_base/lang","dojo/_base/sniff","dojo/_base/window","./_FormValueWidget","./_TextBoxMixin","dojo/text!./templates/TextBox.html",".."],function(_1,_2,_3,_4,_5,_6,_7,_8,_9,_a,_b){var _c=_1([_8,_9],{templateString:_a,_singleNodeTemplate:"<input class=\"dijit dijitReset dijitLeft dijitInputField\" data-dojo-attach-point=\"textbox,focusNode\" autocomplete=\"off\" type=\"${type}\" ${!nameAttrSetting} />",_buttonInputDisabled:_6("ie")?"disabled":"",baseClass:"dijitTextBox",postMixInProperties:function(){var _d=this.type.toLowerCase();if(this.templateString&&this.templateString.toLowerCase()=="input"||((_d=="hidden"||_d=="file")&&this.templateString==this.constructor.prototype.templateString)){this.templateString=this._singleNodeTemplate;}this.inherited(arguments);},_onInput:function(e){this.inherited(arguments);if(this.intermediateChanges){var _e=this;setTimeout(function(){_e._handleOnChange(_e.get("value"),false);},0);}},_setPlaceHolderAttr:function(v){this._set("placeHolder",v);if(!this._phspan){this._attachPoints.push("_phspan");this._phspan=_2.create("span",{className:"dijitPlaceHolder dijitInputField"},this.textbox,"after");}this._phspan.innerHTML="";this._phspan.appendChild(document.createTextNode(v));this._updatePlaceHolder();},_updatePlaceHolder:function(){if(this._phspan){this._phspan.style.display=(this.placeHolder&&!this.focused&&!this.textbox.value)?"":"none";}},_setValueAttr:function(_f,_10,_11){this.inherited(arguments);this._updatePlaceHolder();},getDisplayedValue:function(){_4.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use set('displayedValue') instead.","","2.0");return this.get("displayedValue");},setDisplayedValue:function(_12){_4.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.","","2.0");this.set("displayedValue",_12);},_onBlur:function(e){if(this.disabled){return;}this.inherited(arguments);this._updatePlaceHolder();},_onFocus:function(by){if(this.disabled||this.readOnly){return;}this.inherited(arguments);this._updatePlaceHolder();}});if(_6("ie")){_c=_1(_c,{declaredClass:"dijit.form.TextBox",_isTextSelected:function(){var _13=_7.doc.selection.createRange();var _14=_13.parentElement();return _14==this.textbox&&_13.text.length==0;},postCreate:function(){this.inherited(arguments);setTimeout(_5.hitch(this,function(){try{var s=_3.getComputedStyle(this.domNode);if(s){var ff=s.fontFamily;if(ff){var _15=this.domNode.getElementsByTagName("INPUT");if(_15){for(var i=0;i<_15.length;i++){_15[i].style.fontFamily=ff;}}}}}catch(e){}}),0);}});_b._setSelectionRange=_9._setSelectionRange=function(_16,_17,_18){if(_16.createTextRange){var r=_16.createTextRange();r.collapse(true);r.moveStart("character",-99999);r.moveStart("character",_17);r.moveEnd("character",_18-_17);r.select();}};}else{if(_6("mozilla")){_c=_1(_c,{declaredClass:"dijit.form.TextBox",_onBlur:function(e){this.inherited(arguments);if(this.selectOnClick){this.textbox.selectionStart=this.textbox.selectionEnd=undefined;}}});}else{_c.prototype.declaredClass="dijit.form.TextBox";}}_5.setObject("dijit.form.TextBox",_c);return _c;});},"dijit/_base/scroll":function(){define("dijit/_base/scroll",["dojo/window",".."],function(_19,_1a){_1a.scrollIntoView=function(_1b,pos){_19.scrollIntoView(_1b,pos);};});},"dijit/_TemplatedMixin":function(){define("dijit/_TemplatedMixin",["dojo/_base/lang","dojo/touch","./_WidgetBase","dojo/string","dojo/cache","dojo/_base/array","dojo/_base/declare","dojo/dom-construct","dojo/_base/sniff","dojo/_base/unload","dojo/_base/window"],function(_1c,_1d,_1e,_1f,_20,_21,_22,_23,has,_24,win){var _25=_22("dijit._TemplatedMixin",null,{templateString:null,templatePath:null,_skipNodeCache:false,_earlyTemplatedStartup:false,constructor:function(){this._attachPoints=[];this._attachEvents=[];},_stringRepl:function(_26){var _27=this.declaredClass,_28=this;return _1f.substitute(_26,this,function(_29,key){if(key.charAt(0)=="!"){_29=_1c.getObject(key.substr(1),false,_28);}if(typeof _29=="undefined"){throw new Error(_27+" template:"+key);}if(_29==null){return "";}return key.charAt(0)=="!"?_29:_29.toString().replace(/"/g,""");},this);},buildRendering:function(){if(!this.templateString){this.templateString=_20(this.templatePath,{sanitize:true});}var _2a=_25.getCachedTemplate(this.templateString,this._skipNodeCache);var _2b;if(_1c.isString(_2a)){_2b=_23.toDom(this._stringRepl(_2a));if(_2b.nodeType!=1){throw new Error("Invalid template: "+_2a);}}else{_2b=_2a.cloneNode(true);}this.domNode=_2b;this.inherited(arguments);this._attachTemplateNodes(_2b,function(n,p){return n.getAttribute(p);});this._beforeFillContent();this._fillContent(this.srcNodeRef);},_beforeFillContent:function(){},_fillContent:function(_2c){var _2d=this.containerNode;if(_2c&&_2d){while(_2c.hasChildNodes()){_2d.appendChild(_2c.firstChild);}}},_attachTemplateNodes:function(_2e,_2f){var _30=_1c.isArray(_2e)?_2e:(_2e.all||_2e.getElementsByTagName("*"));var x=_1c.isArray(_2e)?0:-1;for(;x<_30.length;x++){var _31=(x==-1)?_2e:_30[x];if(this.widgetsInTemplate&&(_2f(_31,"dojoType")||_2f(_31,"data-dojo-type"))){continue;}var _32=_2f(_31,"dojoAttachPoint")||_2f(_31,"data-dojo-attach-point");if(_32){var _33,_34=_32.split(/\s*,\s*/);while((_33=_34.shift())){if(_1c.isArray(this[_33])){this[_33].push(_31);}else{this[_33]=_31;}this._attachPoints.push(_33);}}var _35=_2f(_31,"dojoAttachEvent")||_2f(_31,"data-dojo-attach-event");if(_35){var _36,_37=_35.split(/\s*,\s*/);var _38=_1c.trim;while((_36=_37.shift())){if(_36){var _39=null;if(_36.indexOf(":")!=-1){var _3a=_36.split(":");_36=_38(_3a[0]);_39=_38(_3a[1]);}else{_36=_38(_36);}if(!_39){_39=_36;}this._attachEvents.push(this.connect(_31,_1d[_36]||_36,_39));}}}}},destroyRendering:function(){_21.forEach(this._attachPoints,function(_3b){delete this[_3b];},this);this._attachPoints=[];_21.forEach(this._attachEvents,this.disconnect,this);this._attachEvents=[];this.inherited(arguments);}});_25._templateCache={};_25.getCachedTemplate=function(_3c,_3d){var _3e=_25._templateCache;var key=_3c;var _3f=_3e[key];if(_3f){try{if(!_3f.ownerDocument||_3f.ownerDocument==win.doc){return _3f;}}catch(e){}_23.destroy(_3f);}_3c=_1f.trim(_3c);if(_3d||_3c.match(/\$\{([^\}]+)\}/g)){return (_3e[key]=_3c);}else{var _40=_23.toDom(_3c);if(_40.nodeType!=1){throw new Error("Invalid template: "+_3c);}return (_3e[key]=_40);}};if(has("ie")){_24.addOnWindowUnload(function(){var _41=_25._templateCache;for(var key in _41){var _42=_41[key];if(typeof _42=="object"){_23.destroy(_42);}delete _41[key];}});}_1c.extend(_1e,{dojoAttachEvent:"",dojoAttachPoint:""});return _25;});},"dijit/_CssStateMixin":function(){define("dijit/_CssStateMixin",["dojo/touch","dojo/_base/array","dojo/_base/declare","dojo/dom-class","dojo/_base/lang","dojo/_base/window"],function(_43,_44,_45,_46,_47,win){return _45("dijit._CssStateMixin",[],{cssStateNodes:{},hovering:false,active:false,_applyAttributes:function(){this.inherited(arguments);_44.forEach(["onmouseenter","onmouseleave",_43.press],function(e){this.connect(this.domNode,e,"_cssMouseEvent");},this);_44.forEach(["disabled","readOnly","checked","selected","focused","state","hovering","active"],function(_48){this.watch(_48,_47.hitch(this,"_setStateClass"));},this);for(var ap in this.cssStateNodes){this._trackMouseState(this[ap],this.cssStateNodes[ap]);}this._setStateClass();},_cssMouseEvent:function(_49){if(!this.disabled){switch(_49.type){case "mouseenter":case "mouseover":this._set("hovering",true);this._set("active",this._mouseDown);break;case "mouseleave":case "mouseout":this._set("hovering",false);this._set("active",false);break;case "mousedown":case "touchpress":this._set("active",true);this._mouseDown=true;var _4a=this.connect(win.body(),_43.release,function(){this._mouseDown=false;this._set("active",false);this.disconnect(_4a);});break;}}},_setStateClass:function(){var _4b=this.baseClass.split(" ");function _4c(_4d){_4b=_4b.concat(_44.map(_4b,function(c){return c+_4d;}),"dijit"+_4d);};if(!this.isLeftToRight()){_4c("Rtl");}var _4e=this.checked=="mixed"?"Mixed":(this.checked?"Checked":"");if(this.checked){_4c(_4e);}if(this.state){_4c(this.state);}if(this.selected){_4c("Selected");}if(this.disabled){_4c("Disabled");}else{if(this.readOnly){_4c("ReadOnly");}else{if(this.active){_4c("Active");}else{if(this.hovering){_4c("Hover");}}}}if(this.focused){_4c("Focused");}var tn=this.stateNode||this.domNode,_4f={};_44.forEach(tn.className.split(" "),function(c){_4f[c]=true;});if("_stateClasses" in this){_44.forEach(this._stateClasses,function(c){delete _4f[c];});}_44.forEach(_4b,function(c){_4f[c]=true;});var _50=[];for(var c in _4f){_50.push(c);}tn.className=_50.join(" ");this._stateClasses=_4b;},_trackMouseState:function(_51,_52){var _53=false,_54=false,_55=false;var _56=this,cn=_47.hitch(this,"connect",_51);function _57(){var _58=("disabled" in _56&&_56.disabled)||("readonly" in _56&&_56.readonly);_46.toggle(_51,_52+"Hover",_53&&!_54&&!_58);_46.toggle(_51,_52+"Active",_54&&!_58);_46.toggle(_51,_52+"Focused",_55&&!_58);};cn("onmouseenter",function(){_53=true;_57();});cn("onmouseleave",function(){_53=false;_54=false;_57();});cn(_43.press,function(){_54=true;_57();});cn(_43.release,function(){_54=false;_57();});cn("onfocus",function(){_55=true;_57();});cn("onblur",function(){_55=false;_57();});this.watch("disabled",_57);this.watch("readOnly",_57);}});});},"dijit/DialogUnderlay":function(){define("dijit/DialogUnderlay",["dojo/_base/declare","dojo/dom-attr","dojo/_base/window","dojo/window","./_Widget","./_TemplatedMixin","./BackgroundIframe"],function(_59,_5a,win,_5b,_5c,_5d,_5e){return _59("dijit.DialogUnderlay",[_5c,_5d],{templateString:"<div class='dijitDialogUnderlayWrapper'><div class='dijitDialogUnderlay' data-dojo-attach-point='node'></div></div>",dialogId:"","class":"",_setDialogIdAttr:function(id){_5a.set(this.node,"id",id+"_underlay");this._set("dialogId",id);},_setClassAttr:function(_5f){this.node.className="dijitDialogUnderlay "+_5f;this._set("class",_5f);},postCreate:function(){win.body().appendChild(this.domNode);},layout:function(){var is=this.node.style,os=this.domNode.style;os.display="none";var _60=_5b.getBox();os.top=_60.t+"px";os.left=_60.l+"px";is.width=_60.w+"px";is.height=_60.h+"px";os.display="block";},show:function(){this.domNode.style.display="block";this.layout();this.bgIframe=new _5e(this.domNode);},hide:function(){this.bgIframe.destroy();delete this.bgIframe;this.domNode.style.display="none";}});});},"dijit/layout/ScrollingTabController":function(){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\">\n\t<div role=\"presentation\" class=\"dijitTabInnerDiv\" data-dojo-attach-point=\"innerDiv,focusNode\">\n\t\t<div role=\"presentation\" class=\"dijitTabContent dijitButtonContents\" data-dojo-attach-point=\"tabContent\">\n\t\t\t<img role=\"presentation\" alt=\"\" src=\"${_blankGif}\" class=\"dijitTabStripIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t\t\t<span data-dojo-attach-point=\"containerNode,titleNode\" class=\"dijitButtonText\"></span>\n\t\t</div>\n\t</div>\n</div>"}});define("dijit/layout/ScrollingTabController",["dojo/_base/array","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/fx","dojo/_base/lang","dojo/query","dojo/_base/sniff","../registry","dojo/text!./templates/ScrollingTabController.html","dojo/text!./templates/_ScrollingTabControllerButton.html","./TabController","./utils","../_WidgetsInTemplateMixin","../Menu","../MenuItem","../form/Button","../_HasDropDown","dojo/NodeList-dom"],function(_61,_62,_63,_64,_65,fx,_66,_67,has,_68,_69,_6a,_6b,_6c,_6d,_6e,_6f,_70,_71){var _72=_62("dijit.layout.ScrollingTabController",[_6b,_6d],{baseClass:"dijitTabController dijitScrollingTabController",templateString:_69,useMenu:true,useSlider:true,tabStripClass:"",widgetsInTemplate:true,_minScroll:5,_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";_63.add(n,"tabStrip-disabled");}_63.add(this.tablistWrapper,this.tabStripClass);},onStartup:function(){this.inherited(arguments);_65.set(this.domNode,"visibility","");this._postStartup=true;},onAddChild:function(_73,_74){this.inherited(arguments);_61.forEach(["label","iconClass"],function(_75){this.pane2watches[_73.id].push(this.pane2button[_73.id].watch(_75,_66.hitch(this,function(){if(this._postStartup&&this._dim){this.resize(this._dim);}})));},this);_65.set(this.containerNode,"width",(_65.get(this.containerNode,"width")+200)+"px");},onRemoveChild:function(_76,_77){var _78=this.pane2button[_76.id];if(this._selectedTab===_78.domNode){this._selectedTab=null;}this.inherited(arguments);},_initButtons:function(){this._btnWidth=0;this._buttons=_67("> .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+=_64.getMarginSize(btn).w;return true;}else{_65.set(btn,"display","none");return false;}},this);},_getTabsWidth:function(){var _79=this.getChildren();if(_79.length){var _7a=_79[this.isLeftToRight()?0:_79.length-1].domNode,_7b=_79[this.isLeftToRight()?_79.length-1:0].domNode;return _7b.offsetLeft+_65.get(_7b,"width")-_7a.offsetLeft;}else{return 0;}},_enableBtn:function(_7c){var _7d=this._getTabsWidth();_7c=_7c||_65.get(this.scrollNode,"width");return _7d>0&&_7c<_7d;},resize:function(dim){this._dim=dim;this.scrollNode.style.height="auto";var cb=this._contentBox=_6c.marginBox2contentBox(this.domNode,{h:0,w:dim.w});cb.h=this.scrollNode.offsetHeight;_64.setContentSize(this.domNode,cb);var _7e=this._enableBtn(this._contentBox.w);this._buttons.style("display",_7e?"":"none");this._leftBtn.layoutAlign="left";this._rightBtn.layoutAlign="right";this._menuBtn.layoutAlign=this.isLeftToRight()?"right":"left";_6c.layoutChildren(this.domNode,this._contentBox,[this._menuBtn,this._leftBtn,this._rightBtn,{domNode:this.scrollNode,layoutAlign:"client"}]);if(this._selectedTab){if(this._anim&&this._anim.status()=="playing"){this._anim.stop();}this.scrollNode.scrollLeft=this._convertToScrollLeft(this._getScrollForSelectedTab());}this._setButtonClass(this._getScroll());this._postResize=true;return {h:this._contentBox.h,w:dim.w};},_getScroll:function(){return (this.isLeftToRight()||has("ie")<8||(has("ie")&&has("quirks"))||has("webkit"))?this.scrollNode.scrollLeft:_65.get(this.containerNode,"width")-_65.get(this.scrollNode,"width")+(has("ie")==8?-1:1)*this.scrollNode.scrollLeft;},_convertToScrollLeft:function(val){if(this.isLeftToRight()||has("ie")<8||(has("ie")&&has("quirks"))||has("webkit")){return val;}else{var _7f=_65.get(this.containerNode,"width")-_65.get(this.scrollNode,"width");return (has("ie")==8?-1:1)*(val-_7f);}},onSelectChild:function(_80){var tab=this.pane2button[_80.id];if(!tab||!_80){return;}var _81=tab.domNode;if(_81!=this._selectedTab){this._selectedTab=_81;if(this._postResize){var sl=this._getScroll();if(sl>_81.offsetLeft||sl+_65.get(this.scrollNode,"width")<_81.offsetLeft+_65.get(_81,"width")){this.createSmoothScroll().play();}}}this.inherited(arguments);},_getScrollBounds:function(){var _82=this.getChildren(),_83=_65.get(this.scrollNode,"width"),_84=_65.get(this.containerNode,"width"),_85=_84-_83,_86=this._getTabsWidth();if(_82.length&&_86>_83){return {min:this.isLeftToRight()?0:_82[_82.length-1].domNode.offsetLeft,max:this.isLeftToRight()?(_82[_82.length-1].domNode.offsetLeft+_65.get(_82[_82.length-1].domNode,"width"))-_83:_85};}else{var _87=this.isLeftToRight()?0:_85;return {min:_87,max:_87};}},_getScrollForSelectedTab:function(){var w=this.scrollNode,n=this._selectedTab,_88=_65.get(this.scrollNode,"width"),_89=this._getScrollBounds();var pos=(n.offsetLeft+_65.get(n,"width")/2)-_88/2;pos=Math.min(Math.max(pos,_89.min),_89.max);return pos;},createSmoothScroll:function(x){if(arguments.length>0){var _8a=this._getScrollBounds();x=Math.min(Math.max(x,_8a.min),_8a.max);}else{x=this._getScrollForSelectedTab();}if(this._anim&&this._anim.status()=="playing"){this._anim.stop();}var _8b=this,w=this.scrollNode,_8c=new fx.Animation({beforeBegin:function(){if(this.curve){delete this.curve;}var _8d=w.scrollLeft,_8e=_8b._convertToScrollLeft(x);_8c.curve=new fx._Line(_8d,_8e);},onAnimate:function(val){w.scrollLeft=val;}});this._anim=_8c;this._setButtonClass(x);return _8c;},_getBtnNode:function(e){var n=e.target;while(n&&!_63.contains(n,"tabStripButton")){n=n.parentNode;}return n;},doSlideRight:function(e){this.doSlide(1,this._getBtnNode(e));},doSlideLeft:function(e){this.doSlide(-1,this._getBtnNode(e));},doSlide:function(_8f,_90){if(_90&&_63.contains(_90,"dijitTabDisabled")){return;}var _91=_65.get(this.scrollNode,"width");var d=(_91*0.75)*_8f;var to=this._getScroll()+d;this._setButtonClass(to);this.createSmoothScroll(to).play();},_setButtonClass:function(_92){var _93=this._getScrollBounds();this._leftBtn.set("disabled",_92<=_93.min);this._rightBtn.set("disabled",_92>=_93.max);}});var _94=_62("dijit.layout._ScrollingTabControllerButtonMixin",null,{baseClass:"dijitTab tabStripButton",templateString:_6a,tabIndex:"",isFocusable:function(){return false;}});_62("dijit.layout._ScrollingTabControllerButton",[_70,_94]);_62("dijit.layout._ScrollingTabControllerMenuButton",[_70,_71,_94],{containerId:"",tabIndex:"-1",isLoaded:function(){return false;},loadDropDown:function(_95){this.dropDown=new _6e({id:this.containerId+"_menu",dir:this.dir,lang:this.lang,textDir:this.textDir});var _96=_68.byId(this.containerId);_61.forEach(_96.getChildren(),function(_97){var _98=new _6f({id:_97.id+"_stcMi",label:_97.title,iconClass:_97.iconClass,dir:_97.dir,lang:_97.lang,textDir:_97.textDir,onClick:function(){_96.selectChild(_97);}});this.dropDown.addChild(_98);},this);_95();},closeDropDown:function(_99){this.inherited(arguments);if(this.dropDown){this.dropDown.destroyRecursive();delete this.dropDown;}}});return _72;});},"dijit/place":function(){define("dijit/place",["dojo/_base/array","dojo/dom-geometry","dojo/dom-style","dojo/_base/kernel","dojo/_base/window","dojo/window","."],function(_9a,_9b,_9c,_9d,win,_9e,_9f){function _a0(_a1,_a2,_a3,_a4){var _a5=_9e.getBox();if(!_a1.parentNode||String(_a1.parentNode.tagName).toLowerCase()!="body"){win.body().appendChild(_a1);}var _a6=null;_9a.some(_a2,function(_a7){var _a8=_a7.corner;var pos=_a7.pos;var _a9=0;var _aa={w:{"L":_a5.l+_a5.w-pos.x,"R":pos.x-_a5.l,"M":_a5.w}[_a8.charAt(1)],h:{"T":_a5.t+_a5.h-pos.y,"B":pos.y-_a5.t,"M":_a5.h}[_a8.charAt(0)]};if(_a3){var res=_a3(_a1,_a7.aroundCorner,_a8,_aa,_a4);_a9=typeof res=="undefined"?0:res;}var _ab=_a1.style;var _ac=_ab.display;var _ad=_ab.visibility;if(_ab.display=="none"){_ab.visibility="hidden";_ab.display="";}var mb=_9b.getMarginBox(_a1);_ab.display=_ac;_ab.visibility=_ad;var _ae={"L":pos.x,"R":pos.x-mb.w,"M":Math.max(_a5.l,Math.min(_a5.l+_a5.w,pos.x+(mb.w>>1))-mb.w)}[_a8.charAt(1)],_af={"T":pos.y,"B":pos.y-mb.h,"M":Math.max(_a5.t,Math.min(_a5.t+_a5.h,pos.y+(mb.h>>1))-mb.h)}[_a8.charAt(0)],_b0=Math.max(_a5.l,_ae),_b1=Math.max(_a5.t,_af),_b2=Math.min(_a5.l+_a5.w,_ae+mb.w),_b3=Math.min(_a5.t+_a5.h,_af+mb.h),_b4=_b2-_b0,_b5=_b3-_b1;_a9+=(mb.w-_b4)+(mb.h-_b5);if(_a6==null||_a9<_a6.overflow){_a6={corner:_a8,aroundCorner:_a7.aroundCorner,x:_b0,y:_b1,w:_b4,h:_b5,overflow:_a9,spaceAvailable:_aa};}return !_a9;});if(_a6.overflow&&_a3){_a3(_a1,_a6.aroundCorner,_a6.corner,_a6.spaceAvailable,_a4);}var l=_9b.isBodyLtr(),s=_a1.style;s.top=_a6.y+"px";s[l?"left":"right"]=(l?_a6.x:_a5.w-_a6.x-_a6.w)+"px";s[l?"right":"left"]="auto";return _a6;};return (_9f.place={at:function(_b6,pos,_b7,_b8){var _b9=_9a.map(_b7,function(_ba){var c={corner:_ba,pos:{x:pos.x,y:pos.y}};if(_b8){c.pos.x+=_ba.charAt(1)=="L"?_b8.x:-_b8.x;c.pos.y+=_ba.charAt(0)=="T"?_b8.y:-_b8.y;}return c;});return _a0(_b6,_b9);},around:function(_bb,_bc,_bd,_be,_bf){var _c0=(typeof _bc=="string"||"offsetWidth" in _bc)?_9b.position(_bc,true):_bc;if(_bc.parentNode){var _c1=_bc.parentNode;while(_c1&&_c1.nodeType==1&&_c1.nodeName!="BODY"){var _c2=_9b.position(_c1,true);var _c3=_9c.getComputedStyle(_c1).overflow;if(_c3=="hidden"||_c3=="auto"||_c3=="scroll"){var _c4=Math.min(_c0.y+_c0.h,_c2.y+_c2.h);var _c5=Math.min(_c0.x+_c0.w,_c2.x+_c2.w);_c0.x=Math.max(_c0.x,_c2.x);_c0.y=Math.max(_c0.y,_c2.y);_c0.h=_c4-_c0.y;_c0.w=_c5-_c0.x;}_c1=_c1.parentNode;}}var x=_c0.x,y=_c0.y,_c6="w" in _c0?_c0.w:(_c0.w=_c0.width),_c7="h" in _c0?_c0.h:(_9d.deprecated("place.around: dijit.place.__Rectangle: { x:"+x+", y:"+y+", height:"+_c0.height+", width:"+_c6+" } has been deprecated. Please use { x:"+x+", y:"+y+", h:"+_c0.height+", w:"+_c6+" }","","2.0"),_c0.h=_c0.height);var _c8=[];function _c9(_ca,_cb){_c8.push({aroundCorner:_ca,corner:_cb,pos:{x:{"L":x,"R":x+_c6,"M":x+(_c6>>1)}[_ca.charAt(1)],y:{"T":y,"B":y+_c7,"M":y+(_c7>>1)}[_ca.charAt(0)]}});};_9a.forEach(_bd,function(pos){var ltr=_be;switch(pos){case "above-centered":_c9("TM","BM");break;case "below-centered":_c9("BM","TM");break;case "after-centered":ltr=!ltr;case "before-centered":_c9(ltr?"ML":"MR",ltr?"MR":"ML");break;case "after":ltr=!ltr;case "before":_c9(ltr?"TL":"TR",ltr?"TR":"TL");_c9(ltr?"BL":"BR",ltr?"BR":"BL");break;case "below-alt":ltr=!ltr;case "below":_c9(ltr?"BL":"BR",ltr?"TL":"TR");_c9(ltr?"BR":"BL",ltr?"TR":"TL");break;case "above-alt":ltr=!ltr;case "above":_c9(ltr?"TL":"TR",ltr?"BL":"BR");_c9(ltr?"TR":"TL",ltr?"BR":"BL");break;default:_c9(pos.aroundCorner,pos.corner);}});var _cc=_a0(_bb,_c8,_bf,{w:_c6,h:_c7});_cc.aroundNodePos=_c0;return _cc;}});});},"dijit/_HasDropDown":function(){define("dijit/_HasDropDown",["dojo/_base/declare","dojo/_base/Deferred","dojo/_base/event","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/has","dojo/keys","dojo/_base/lang","dojo/touch","dojo/_base/window","dojo/window","./registry","./focus","./popup","./_FocusMixin"],function(_cd,_ce,_cf,dom,_d0,_d1,_d2,_d3,has,_d4,_d5,_d6,win,_d7,_d8,_d9,_da,_db){return _cd("dijit._HasDropDown",_db,{_buttonNode:null,_arrowWrapperNode:null,_popupStateNode:null,_aroundNode:null,dropDown:null,autoWidth:true,forceWidth:false,maxHeight:0,dropDownPosition:["below","above"],_stopClickEvents:true,_onDropDownMouseDown:function(e){if(this.disabled||this.readOnly){return;}e.preventDefault();this._docHandler=this.connect(win.doc,_d6.release,"_onDropDownMouseUp");this.toggleDropDown();},_onDropDownMouseUp:function(e){if(e&&this._docHandler){this.disconnect(this._docHandler);}var _dc=this.dropDown,_dd=false;if(e&&this._opened){var c=_d2.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&&!_dd){if(_d1.contains(t,"dijitPopup")){_dd=true;}else{t=t.parentNode;}}if(_dd){t=e.target;if(_dc.onItemClick){var _de;while(t&&!(_de=_d8.byNode(t))){t=t.parentNode;}if(_de&&_de.onClick&&_de.getParent){_de.getParent().onItemClick(_de,e);}}return;}}}if(this._opened){if(_dc.focus&&_dc.autoFocus!==false){window.setTimeout(_d5.hitch(_dc,"focus"),1);}}else{setTimeout(_d5.hitch(this,"focus"),0);}if(has("ios")){this._justGotMouseUp=true;setTimeout(_d5.hitch(this,function(){this._justGotMouseUp=false;}),0);}},_onDropDownClick:function(e){if(has("ios")&&!this._justGotMouseUp){this._onDropDownMouseDown(e);this._onDropDownMouseUp(e);}if(this._stopClickEvents){_cf.stop(e);}},buildRendering:function(){this.inherited(arguments);this._buttonNode=this._buttonNode||this.focusNode||this.domNode;this._popupStateNode=this._popupStateNode||this.focusNode||this._buttonNode;var _df={"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";_d1.add(this._arrowWrapperNode||this._buttonNode,"dijit"+_df+"ArrowButton");},postCreate:function(){this.inherited(arguments);this.connect(this._buttonNode,_d6.press,"_onDropDownMouseDown");this.connect(this._buttonNode,"onclick","_onDropDownClick");this.connect(this.focusNode,"onkeypress","_onKey");this.connect(this.focusNode,"onkeyup","_onKeyUp");},destroy:function(){if(this.dropDown){if(!this.dropDown._destroyed){this.dropDown.destroyRecursive();}delete this.dropDown;}this.inherited(arguments);},_onKey:function(e){if(this.disabled||this.readOnly){return;}var d=this.dropDown,_e0=e.target;if(d&&this._opened&&d.handleKey){if(d.handleKey(e)===false){_cf.stop(e);return;}}if(d&&this._opened&&e.charOrCode==_d4.ESCAPE){this.closeDropDown();_cf.stop(e);}else{if(!this._opened&&(e.charOrCode==_d4.DOWN_ARROW||((e.charOrCode==_d4.ENTER||e.charOrCode==" ")&&((_e0.tagName||"").toLowerCase()!=="input"||(_e0.type&&_e0.type.toLowerCase()!=="text"))))){this._toggleOnKeyUp=true;_cf.stop(e);}}},_onKeyUp:function(){if(this._toggleOnKeyUp){delete this._toggleOnKeyUp;this.toggleDropDown();var d=this.dropDown;if(d&&d.focus){setTimeout(_d5.hitch(d,"focus"),1);}}},_onBlur:function(){var _e1=_d9.curNode&&this.dropDown&&dom.isDescendant(_d9.curNode,this.dropDown.domNode);this.closeDropDown(_e1);this.inherited(arguments);},isLoaded:function(){return true;},loadDropDown:function(_e2){_e2();},loadAndOpenDropDown:function(){var d=new _ce(),_e3=_d5.hitch(this,function(){this.openDropDown();d.resolve(this.dropDown);});if(!this.isLoaded()){this.loadDropDown(_e3);}else{_e3();}return d;},toggleDropDown:function(){if(this.disabled||this.readOnly){return;}if(!this._opened){this.loadAndOpenDropDown();}else{this.closeDropDown();}},openDropDown:function(){var _e4=this.dropDown,_e5=_e4.domNode,_e6=this._aroundNode||this.domNode,_e7=this;if(!this._preparedNode){this._preparedNode=true;if(_e5.style.width){this._explicitDDWidth=true;}if(_e5.style.height){this._explicitDDHeight=true;}}if(this.maxHeight||this.forceWidth||this.autoWidth){var _e8={display:"",visibility:"hidden"};if(!this._explicitDDWidth){_e8.width="";}if(!this._explicitDDHeight){_e8.height="";}_d3.set(_e5,_e8);var _e9=this.maxHeight;if(_e9==-1){var _ea=_d7.getBox(),_eb=_d2.position(_e6,false);_e9=Math.floor(Math.max(_eb.y,_ea.h-(_eb.y+_eb.h)));}_da.moveOffScreen(_e4);if(_e4.startup&&!_e4._started){_e4.startup();}var mb=_d2.getMarginSize(_e5);var _ec=(_e9&&mb.h>_e9);_d3.set(_e5,{overflowX:"hidden",overflowY:_ec?"auto":"hidden"});if(_ec){mb.h=_e9;if("w" in mb){mb.w+=16;}}else{delete mb.h;}if(this.forceWidth){mb.w=_e6.offsetWidth;}else{if(this.autoWidth){mb.w=Math.max(mb.w,_e6.offsetWidth);}else{delete mb.w;}}if(_d5.isFunction(_e4.resize)){_e4.resize(mb);}else{_d2.setMarginBox(_e5,mb);}}var _ed=_da.open({parent:this,popup:_e4,around:_e6,orient:this.dropDownPosition,onExecute:function(){_e7.closeDropDown(true);},onCancel:function(){_e7.closeDropDown(true);},onClose:function(){_d0.set(_e7._popupStateNode,"popupActive",false);_d1.remove(_e7._popupStateNode,"dijitHasDropDownOpen");_e7._opened=false;}});_d0.set(this._popupStateNode,"popupActive","true");_d1.add(_e7._popupStateNode,"dijitHasDropDownOpen");this._opened=true;return _ed;},closeDropDown:function(_ee){if(this._opened){if(_ee){this.focus();}_da.close(this.dropDown);this._opened=false;}}});});},"dijit/tree/TreeStoreModel":function(){define("dijit/tree/TreeStoreModel",["dojo/_base/array","dojo/aspect","dojo/_base/declare","dojo/_base/json","dojo/_base/lang"],function(_ef,_f0,_f1,_f2,_f3){return _f1("dijit.tree.TreeStoreModel",null,{store:null,childrenAttrs:["children"],newItemIdAttr:"id",labelAttr:"",root:null,query:null,deferItemLoadingUntilExpand:false,constructor:function(_f4){_f3.mixin(this,_f4);this.connects=[];var _f5=this.store;if(!_f5.getFeatures()["dojo.data.api.Identity"]){throw new Error("dijit.Tree: store must support dojo.data.Identity");}if(_f5.getFeatures()["dojo.data.api.Notification"]){this.connects=this.connects.concat([_f0.after(_f5,"onNew",_f3.hitch(this,"onNewItem"),true),_f0.after(_f5,"onDelete",_f3.hitch(this,"onDeleteItem"),true),_f0.after(_f5,"onSet",_f3.hitch(this,"onSetItem"),true)]);}},destroy:function(){var h;while(h=this.connects.pop()){h.remove();}},getRoot:function(_f6,_f7){if(this.root){_f6(this.root);}else{this.store.fetch({query:this.query,onComplete:_f3.hitch(this,function(_f8){if(_f8.length!=1){throw new Error(this.declaredClass+": query "+_f2.stringify(this.query)+" returned "+_f8.length+" items, but must return exactly one item");}this.root=_f8[0];_f6(this.root);}),onError:_f7});}},mayHaveChildren:function(_f9){return _ef.some(this.childrenAttrs,function(_fa){return this.store.hasAttribute(_f9,_fa);},this);},getChildren:function(_fb,_fc,_fd){var _fe=this.store;if(!_fe.isItemLoaded(_fb)){var _ff=_f3.hitch(this,arguments.callee);_fe.loadItem({item:_fb,onItem:function(_100){_ff(_100,_fc,_fd);},onError:_fd});return;}var _101=[];for(var i=0;i<this.childrenAttrs.length;i++){var vals=_fe.getValues(_fb,this.childrenAttrs[i]);_101=_101.concat(vals);}var _102=0;if(!this.deferItemLoadingUntilExpand){_ef.forEach(_101,function(item){if(!_fe.isItemLoaded(item)){_102++;}});}if(_102==0){_fc(_101);}else{_ef.forEach(_101,function(item,idx){if(!_fe.isItemLoaded(item)){_fe.loadItem({item:item,onItem:function(item){_101[idx]=item;if(--_102==0){_fc(_101);}},onError:_fd});}});}},isItem:function(_103){return this.store.isItem(_103);},fetchItemByIdentity:function(_104){this.store.fetchItemByIdentity(_104);},getIdentity:function(item){return this.store.getIdentity(item);},getLabel:function(item){if(this.labelAttr){return this.store.getValue(item,this.labelAttr);}else{return this.store.getLabel(item);}},newItem:function(args,_105,_106){var _107={parent:_105,attribute:this.childrenAttrs[0]},_108;if(this.newItemIdAttr&&args[this.newItemIdAttr]){this.fetchItemByIdentity({identity:args[this.newItemIdAttr],scope:this,onItem:function(item){if(item){this.pasteItem(item,null,_105,true,_106);}else{_108=this.store.newItem(args,_107);if(_108&&(_106!=undefined)){this.pasteItem(_108,_105,_105,false,_106);}}}});}else{_108=this.store.newItem(args,_107);if(_108&&(_106!=undefined)){this.pasteItem(_108,_105,_105,false,_106);}}},pasteItem:function(_109,_10a,_10b,_10c,_10d){var _10e=this.store,_10f=this.childrenAttrs[0];if(_10a){_ef.forEach(this.childrenAttrs,function(attr){if(_10e.containsValue(_10a,attr,_109)){if(!_10c){var _110=_ef.filter(_10e.getValues(_10a,attr),function(x){return x!=_109;});_10e.setValues(_10a,attr,_110);}_10f=attr;}});}if(_10b){if(typeof _10d=="number"){var _111=_10e.getValues(_10b,_10f).slice();_111.splice(_10d,0,_109);_10e.setValues(_10b,_10f,_111);}else{_10e.setValues(_10b,_10f,_10e.getValues(_10b,_10f).concat(_109));}}},onChange:function(){},onChildrenChange:function(){},onDelete:function(){},onNewItem:function(item,_112){if(!_112){return;}this.getChildren(_112.item,_f3.hitch(this,function(_113){this.onChildrenChange(_112.item,_113);}));},onDeleteItem:function(item){this.onDelete(item);},onSetItem:function(item,_114){if(_ef.indexOf(this.childrenAttrs,_114)!=-1){this.getChildren(item,_f3.hitch(this,function(_115){this.onChildrenChange(item,_115);}));}else{this.onChange(item);}}});});},"dijit/_MenuBase":function(){define("dijit/_MenuBase",["./popup","dojo/window","./_Widget","./_KeyNavContainer","./_TemplatedMixin","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/_base/lang","dojo/_base/array"],function(pm,_116,_117,_118,_119,_11a,dom,_11b,_11c,lang,_11d){return _11a("dijit._MenuBase",[_117,_119,_118],{parentMenu:null,popupDelay:500,onExecute:function(){},onCancel:function(){},_moveToPopup:function(evt){if(this.focusedChild&&this.focusedChild.popup&&!this.focusedChild.disabled){this.focusedChild._onClick(evt);}else{var _11e=this._getTopMenu();if(_11e&&_11e._isMenuBar){_11e.focusNext();}}},_onPopupHover:function(){if(this.currentPopup&&this.currentPopup._pendingClose_timer){var _11f=this.currentPopup.parentMenu;if(_11f.focusedChild){_11f.focusedChild._setSelected(false);}_11f.focusedChild=this.currentPopup.from_item;_11f.focusedChild._setSelected(true);this._stopPendingCloseTimer(this.currentPopup);}},onItemHover:function(item){if(this.isActive){this.focusChild(item);if(this.focusedChild.popup&&!this.focusedChild.disabled&&!this.hover_timer){this.hover_timer=setTimeout(lang.hitch(this,"_openPopup"),this.popupDelay);}}if(this.focusedChild){this.focusChild(item);}this._hoveredChild=item;},_onChildBlur:function(item){this._stopPopupTimer();item._setSelected(false);var _120=item.popup;if(_120){this._stopPendingCloseTimer(_120);_120._pendingClose_timer=setTimeout(function(){_120._pendingClose_timer=null;if(_120.parentMenu){_120.parentMenu.currentPopup=null;}pm.close(_120);},this.popupDelay);}},onItemUnhover:function(item){if(this.isActive){this._stopPopupTimer();}if(this._hoveredChild==item){this._hoveredChild=null;}},_stopPopupTimer:function(){if(this.hover_timer){clearTimeout(this.hover_timer);this.hover_timer=null;}},_stopPendingCloseTimer:function(_121){if(_121._pendingClose_timer){clearTimeout(_121._pendingClose_timer);_121._pendingClose_timer=null;}},_stopFocusTimer:function(){if(this._focus_timer){clearTimeout(this._focus_timer);this._focus_timer=null;}},_getTopMenu:function(){for(var top=this;top.parentMenu;top=top.parentMenu){}return top;},onItemClick:function(item,evt){if(typeof this.isShowingNow=="undefined"){this._markActive();}this.focusChild(item);if(item.disabled){return false;}if(item.popup){this._openPopup();}else{this.onExecute();item.onClick(evt);}},_openPopup:function(){this._stopPopupTimer();var _122=this.focusedChild;if(!_122){return;}var _123=_122.popup;if(_123.isShowingNow){return;}if(this.currentPopup){this._stopPendingCloseTimer(this.currentPopup);pm.close(this.currentPopup);}_123.parentMenu=this;_123.from_item=_122;var self=this;pm.open({parent:this,popup:_123,around:_122.domNode,orient:this._orient||["after","before"],onCancel:function(){self.focusChild(_122);self._cleanUp();_122._setSelected(true);self.focusedChild=_122;},onExecute:lang.hitch(this,"_cleanUp")});this.currentPopup=_123;_123.connect(_123.domNode,"onmouseenter",lang.hitch(self,"_onPopupHover"));if(_123.focus){_123._focus_timer=setTimeout(lang.hitch(_123,function(){this._focus_timer=null;this.focus();}),0);}},_markActive:function(){this.isActive=true;_11c.replace(this.domNode,"dijitMenuActive","dijitMenuPassive");},onOpen:function(){this.isShowingNow=true;this._markActive();},_markInactive:function(){this.isActive=false;_11c.replace(this.domNode,"dijitMenuPassive","dijitMenuActive");},onClose:function(){this._stopFocusTimer();this._markInactive();this.isShowingNow=false;this.parentMenu=null;},_closeChild:function(){this._stopPopupTimer();if(this.currentPopup){if(_11d.indexOf(this._focusManager.activeStack,this.id)>=0){_11b.set(this.focusedChild.focusNode,"tabIndex",this.tabIndex);this.focusedChild.focusNode.focus();}pm.close(this.currentPopup);this.currentPopup=null;}if(this.focusedChild){this.focusedChild._setSelected(false);this.focusedChild._onUnhover();this.focusedChild=null;}},_onItemFocus:function(item){if(this._hoveredChild&&this._hoveredChild!=item){this._hoveredChild._onUnhover();}},_onBlur:function(){this._cleanUp();this.inherited(arguments);},_cleanUp:function(){this._closeChild();if(typeof this.isShowingNow=="undefined"){this._markInactive();}}});});},"dijit/focus":function(){define("dijit/focus",["dojo/aspect","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-construct","dojo/Evented","dojo/_base/lang","dojo/on","dojo/ready","dojo/_base/sniff","dojo/Stateful","dojo/_base/unload","dojo/_base/window","dojo/window","./a11y","./registry","."],function(_124,_125,dom,_126,_127,_128,lang,on,_129,has,_12a,_12b,win,_12c,a11y,_12d,_12e){var _12f=_125([_12a,_128],{curNode:null,activeStack:[],constructor:function(){var _130=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);}});_124.before(_127,"empty",_130);_124.before(_127,"destroy",_130);},registerIframe:function(_131){return this.registerWin(_131.contentWindow,_131);},registerWin:function(_132,_133){var _134=this;var _135=function(evt){_134._justMouseDowned=true;setTimeout(function(){_134._justMouseDowned=false;},0);if(has("ie")&&evt&&evt.srcElement&&evt.srcElement.parentNode==null){return;}_134._onTouchNode(_133||evt.target||evt.srcElement,"mouse");};var doc=has("ie")?_132.document.documentElement:_132.document;if(doc){if(has("ie")){_132.document.body.attachEvent("onmousedown",_135);var _136=function(evt){var tag=evt.srcElement.tagName.toLowerCase();if(tag=="#document"||tag=="body"){return;}if(a11y.isTabNavigable(evt.srcElement)){_134._onFocusNode(_133||evt.srcElement);}else{_134._onTouchNode(_133||evt.srcElement);}};doc.attachEvent("onactivate",_136);var _137=function(evt){_134._onBlurNode(_133||evt.srcElement);};doc.attachEvent("ondeactivate",_137);return {remove:function(){_132.document.detachEvent("onmousedown",_135);doc.detachEvent("onactivate",_136);doc.detachEvent("ondeactivate",_137);doc=null;}};}else{doc.body.addEventListener("mousedown",_135,true);doc.body.addEventListener("touchstart",_135,true);var _138=function(evt){_134._onFocusNode(_133||evt.target);};doc.addEventListener("focus",_138,true);var _139=function(evt){_134._onBlurNode(_133||evt.target);};doc.addEventListener("blur",_139,true);return {remove:function(){doc.body.removeEventListener("mousedown",_135,true);doc.body.removeEventListener("touchstart",_135,true);doc.removeEventListener("focus",_138,true);doc.removeEventListener("blur",_139,true);doc=null;}};}}},_onBlurNode:function(){this.set("prevNode",this.curNode);this.set("curNode",null);if(this._justMouseDowned){return;}if(this._clearActiveWidgetsTimer){clearTimeout(this._clearActiveWidgetsTimer);}this._clearActiveWidgetsTimer=setTimeout(lang.hitch(this,function(){delete this._clearActiveWidgetsTimer;this._setStack([]);this.prevNode=null;}),100);},_onTouchNode:function(node,by){if(this._clearActiveWidgetsTimer){clearTimeout(this._clearActiveWidgetsTimer);delete this._clearActiveWidgetsTimer;}var _13a=[];try{while(node){var _13b=_126.get(node,"dijitPopupParent");if(_13b){node=_12d.byId(_13b).domNode;}else{if(node.tagName&&node.tagName.toLowerCase()=="body"){if(node===win.body()){break;}node=_12c.get(node.ownerDocument).frameElement;}else{var id=node.getAttribute&&node.getAttribute("widgetId"),_13c=id&&_12d.byId(id);if(_13c&&!(by=="mouse"&&_13c.get("disabled"))){_13a.unshift(id);}node=node.parentNode;}}}}catch(e){}this._setStack(_13a,by);},_onFocusNode:function(node){if(!node){return;}if(node.nodeType==9){return;}this._onTouchNode(node);if(node==this.curNode){return;}this.set("curNode",node);},_setStack:function(_13d,by){var _13e=this.activeStack;this.set("activeStack",_13d);for(var _13f=0;_13f<Math.min(_13e.length,_13d.length);_13f++){if(_13e[_13f]!=_13d[_13f]){break;}}var _140;for(var i=_13e.length-1;i>=_13f;i--){_140=_12d.byId(_13e[i]);if(_140){_140._hasBeenBlurred=true;_140.set("focused",false);if(_140._focusManager==this){_140._onBlur(by);}this.emit("widget-blur",_140,by);}}for(i=_13f;i<_13d.length;i++){_140=_12d.byId(_13d[i]);if(_140){_140.set("focused",true);if(_140._focusManager==this){_140._onFocus(by);}this.emit("widget-focus",_140,by);}}},focus:function(node){if(node){try{node.focus();}catch(e){}}}});var _141=new _12f();_129(function(){var _142=_141.registerWin(win.doc.parentWindow||win.doc.defaultView);if(has("ie")){_12b.addOnWindowUnload(function(){_142.remove();_142=null;});}});_12e.focus=function(node){_141.focus(node);};for(var attr in _141){if(!/^_/.test(attr)){_12e.focus[attr]=typeof _141[attr]=="function"?lang.hitch(_141,attr):_141[attr];}}_141.watch(function(attr,_143,_144){_12e.focus[attr]=_144;});return _141;});},"dojo/i18n":function(){define("dojo/i18n",["./_base/kernel","require","./has","./_base/array","./_base/config","./_base/lang","./_base/xhr","./json"],function(dojo,_145,has,_146,_147,lang,xhr,json){has.add("dojo-preload-i18n-Api",1);true||has.add("dojo-v1x-i18n-Api",1);var _148=dojo.i18n={},_149=/(^.*(^|\/)nls)(\/|$)([^\/]*)\/?([^\/]*)/,_14a=function(root,_14b,_14c,_14d){for(var _14e=[_14c+_14d],_14f=_14b.split("-"),_150="",i=0;i<_14f.length;i++){_150+=(_150?"-":"")+_14f[i];if(!root||root[_150]){_14e.push(_14c+_150+"/"+_14d);}}return _14e;},_151={},_152=dojo.getL10nName=function(_153,_154,_155){_155=_155?_155.toLowerCase():dojo.locale;_153="dojo/i18n!"+_153.replace(/\./g,"/");_154=_154.replace(/\./g,"/");return (/root/i.test(_155))?(_153+"/nls/"+_154):(_153+"/nls/"+_155+"/"+_154);},_156=function(_157,_158,_159,_15a,_15b,load){_157([_158],function(root){var _15c=lang.clone(root.root),_15d=_14a(!root._v1x&&root,_15b,_159,_15a);_157(_15d,function(){for(var i=1;i<_15d.length;i++){_15c=lang.mixin(lang.clone(_15c),arguments[i]);}var _15e=_158+"/"+_15b;_151[_15e]=_15c;load();});});},_15f=function(id,_160){return /^\./.test(id)?_160(id):id;},_161=function(_162){var list=_147.extraLocale||[];list=lang.isArray(list)?list:[list];list.push(_162);return list;},load=function(id,_163,load){if(has("dojo-preload-i18n-Api")){var _164=id.split("*"),_165=_164[1]=="preload";if(_165){if(!_151[id]){_151[id]=1;_166(_164[2],json.parse(_164[3]),1);}load(1);}if(_165||_167(id,_163,load)){return;}}var _168=_149.exec(id),_169=_168[1]+"/",_16a=_168[5]||_168[4],_16b=_169+_16a,_16c=(_168[5]&&_168[4]),_16d=_16c||dojo.locale,_16e=_16b+"/"+_16d,_16f=_16c?[_16d]:_161(_16d),_170=_16f.length,_171=function(){if(!--_170){load(lang.delegate(_151[_16e]));}};_146.forEach(_16f,function(_172){var _173=_16b+"/"+_172;if(has("dojo-preload-i18n-Api")){_174(_173);}if(!_151[_173]){_156(_163,_16b,_169,_16a,_172,_171);}else{_171();}});};if(has("dojo-unit-tests")){var _175=_148.unitTests=[];}if(has("dojo-preload-i18n-Api")||1){var _176=_148.normalizeLocale=function(_177){var _178=_177?_177.toLowerCase():dojo.locale;return _178=="root"?"ROOT":_178;},isXd=function(mid){return (1&&1)?_145.isXdUrl(_145.toUrl(mid+".js")):true;},_179=0,_17a=[],_166=_148._preloadLocalizations=function(_17b,_17c,_17d){function _17e(_17f,func){var _180=_17f.split("-");while(_180.length){if(func(_180.join("-"))){return true;}_180.pop();}return func("ROOT");};function _181(_182){_182=_176(_182);_17e(_182,function(loc){if(_146.indexOf(_17c,loc)>=0){var mid=_17b.replace(/\./g,"/")+"_"+loc;_179++;(isXd(mid)||_17d?_145:_186)([mid],function(_183){for(var p in _183){_151[p+"/"+_182]=_183[p];}--_179;while(!_179&&_17a.length){load.apply(null,_17a.shift());}});return true;}return false;});};_181();_146.forEach(dojo.config.extraLocale,_181);},_167=function(id,_184,load){if(_179){_17a.push([id,_184,load]);}return _179;};}if(1){var _185=new Function("__bundle","__checkForLegacyModules","__mid","var define = function(){define.called = 1;},"+" require = function(){define.called = 1;};"+"try{"+"define.called = 0;"+"eval(__bundle);"+"if(define.called==1)"+"return 1;"+"if((__checkForLegacyModules = __checkForLegacyModules(__mid)))"+"return __checkForLegacyModules;"+"}catch(e){}"+"try{"+"return eval('('+__bundle+')');"+"}catch(e){"+"return e;"+"}"),_186=function(deps,_187){var _188=[];_146.forEach(deps,function(mid){var url=_145.toUrl(mid+".js");function load(text){var _189=_185(text,_174,mid);if(_189===1){_145([mid],function(_18a){_188.push(_151[url]=_18a);});}else{if(_189 instanceof Error){console.error("failed to evaluate i18n bundle; url="+url,_189);_189={};}_188.push(_151[url]=(/nls\/[^\/]+\/[^\/]+$/.test(url)?_189:{root:_189,_v1x:1}));}};if(_151[url]){_188.push(_151[url]);}else{var _18b=_145.syncLoadNls(mid);if(_18b){_188.push(_18b);}else{if(!xhr){try{_145.getText(url,true,load);}catch(e){_188.push(_151[url]={});}}else{xhr.get({url:url,sync:true,load:load,error:function(){_188.push(_151[url]={});}});}}}});_187&&_187.apply(null,_188);},_174=function(_18c){for(var _18d,_18e=_18c.split("/"),_18f=dojo.global[_18e[0]],i=1;_18f&&i<_18e.length-1;_18f=_18f[_18e[i++]]){}if(_18f){_18d=_18f[_18e[i]];if(!_18d){_18d=_18f[_18e[i].replace(/-/g,"_")];}if(_18d){_151[_18c]=_18d;}}return _18d;};_148.getLocalization=function(_190,_191,_192){var _193,_194=_152(_190,_191,_192).substring(10);load(_194,(!isXd(_194)?_186:_145),function(_195){_193=_195;});return _193;};if(has("dojo-unit-tests")){_175.push(function(doh){doh.register("tests.i18n.unit",function(t){var _196;_196=_185("{prop:1}");t.is({prop:1},_196);t.is(undefined,_196[1]);_196=_185("({prop:1})");t.is({prop:1},_196);t.is(undefined,_196[1]);_196=_185("{'prop-x':1}");t.is({"prop-x":1},_196);t.is(undefined,_196[1]);_196=_185("({'prop-x':1})");t.is({"prop-x":1},_196);t.is(undefined,_196[1]);_196=_185("define({'prop-x':1})");t.is(1,_196);_196=_185("this is total nonsense and should throw an error");t.is(_196 instanceof Error,true);});});}}return lang.mixin(_148,{dynamic:true,normalize:_15f,load:load,cache:_151});});},"dijit/hccss":function(){define("dijit/hccss",["require","dojo/_base/config","dojo/dom-class","dojo/dom-construct","dojo/dom-style","dojo/ready","dojo/_base/sniff","dojo/_base/window"],function(_197,_198,_199,_19a,_19b,_19c,has,win){if(has("ie")||has("mozilla")){_19c(90,function(){var div=_19a.create("div",{id:"a11yTestNode",style:{cssText:"border: 1px solid;"+"border-color:red green;"+"position: absolute;"+"height: 5px;"+"top: -999px;"+"background-image: url(\""+(_198.blankGif||_197.toUrl("dojo/resources/blank.gif"))+"\");"}},win.body());var cs=_19b.getComputedStyle(div);if(cs){var _19d=cs.backgroundImage;var _19e=(cs.borderTopColor==cs.borderRightColor)||(_19d!=null&&(_19d=="none"||_19d=="url(invalid-url:)"));if(_19e){_199.add(win.body(),"dijit_a11y");}if(has("ie")){div.outerHTML="";}else{win.body().removeChild(div);}}});}});},"dijit/tree/ForestStoreModel":function(){define("dijit/tree/ForestStoreModel",["dojo/_base/array","dojo/_base/declare","dojo/_base/lang","dojo/_base/window","./TreeStoreModel"],function(_19f,_1a0,lang,win,_1a1){return _1a0("dijit.tree.ForestStoreModel",_1a1,{rootId:"$root$",rootLabel:"ROOT",query:null,constructor:function(_1a2){this.root={store:this,root:true,id:_1a2.rootId,label:_1a2.rootLabel,children:_1a2.rootChildren};},mayHaveChildren:function(item){return item===this.root||this.inherited(arguments);},getChildren:function(_1a3,_1a4,_1a5){if(_1a3===this.root){if(this.root.children){_1a4(this.root.children);}else{this.store.fetch({query:this.query,onComplete:lang.hitch(this,function(_1a6){this.root.children=_1a6;_1a4(_1a6);}),onError:_1a5});}}else{this.inherited(arguments);}},isItem:function(_1a7){return (_1a7===this.root)?true:this.inherited(arguments);},fetchItemByIdentity:function(_1a8){if(_1a8.identity==this.root.id){var _1a9=_1a8.scope?_1a8.scope:win.global;if(_1a8.onItem){_1a8.onItem.call(_1a9,this.root);}}else{this.inherited(arguments);}},getIdentity:function(item){return (item===this.root)?this.root.id:this.inherited(arguments);},getLabel:function(item){return (item===this.root)?this.root.label:this.inherited(arguments);},newItem:function(args,_1aa,_1ab){if(_1aa===this.root){this.onNewRootItem(args);return this.store.newItem(args);}else{return this.inherited(arguments);}},onNewRootItem:function(){},pasteItem:function(_1ac,_1ad,_1ae,_1af,_1b0){if(_1ad===this.root){if(!_1af){this.onLeaveRoot(_1ac);}}this.inherited(arguments,[_1ac,_1ad===this.root?null:_1ad,_1ae===this.root?null:_1ae,_1af,_1b0]);if(_1ae===this.root){this.onAddToRoot(_1ac);}},onAddToRoot:function(item){},onLeaveRoot:function(item){},_requeryTop:function(){var _1b1=this.root.children||[];this.store.fetch({query:this.query,onComplete:lang.hitch(this,function(_1b2){this.root.children=_1b2;if(_1b1.length!=_1b2.length||_19f.some(_1b1,function(item,idx){return _1b2[idx]!=item;})){this.onChildrenChange(this.root,_1b2);}})});},onNewItem:function(item,_1b3){this._requeryTop();this.inherited(arguments);},onDeleteItem:function(item){if(_19f.indexOf(this.root.children,item)!=-1){this._requeryTop();}this.inherited(arguments);},onSetItem:function(item,_1b4,_1b5,_1b6){this._requeryTop();this.inherited(arguments);}});});},"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","dijit/form/_ComboBoxMenuMixin":function(){define("dijit/form/_ComboBoxMenuMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/i18n","dojo/_base/window","dojo/i18n!./nls/ComboBox"],function(_1b7,_1b8,_1b9,i18n,win){return _1b8("dijit.form._ComboBoxMenuMixin",null,{_messages:null,postMixInProperties:function(){this.inherited(arguments);this._messages=i18n.getLocalization("dijit.form","ComboBox",this.lang);},buildRendering:function(){this.inherited(arguments);this.previousButton.innerHTML=this._messages["previousMessage"];this.nextButton.innerHTML=this._messages["nextMessage"];},_setValueAttr:function(_1ba){this.value=_1ba;this.onChange(_1ba);},onClick:function(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);}}},onChange:function(){},onPage:function(){},onClose:function(){this._setSelectedAttr(null);},_createOption:function(item,_1bb){var _1bc=this._createMenuItem();var _1bd=_1bb(item);if(_1bd.html){_1bc.innerHTML=_1bd.label;}else{_1bc.appendChild(win.doc.createTextNode(_1bd.label));}if(_1bc.innerHTML==""){_1bc.innerHTML=" ";}this.applyTextDir(_1bc,(_1bc.innerText||_1bc.textContent||""));_1bc.item=item;return _1bc;},createOptions:function(_1be,_1bf,_1c0){this.previousButton.style.display=(_1bf.start==0)?"none":"";_1b9.set(this.previousButton,"id",this.id+"_prev");_1b7.forEach(_1be,function(item,i){var _1c1=this._createOption(item,_1c0);_1b9.set(_1c1,"id",this.id+i);this.nextButton.parentNode.insertBefore(_1c1,this.nextButton);},this);var _1c2=false;if(_1be.total&&!_1be.total.then&&_1be.total!=-1){if((_1bf.start+_1bf.count)<_1be.total){_1c2=true;}else{if((_1bf.start+_1bf.count)>_1be.total&&_1bf.count==_1be.length){_1c2=true;}}}else{if(_1bf.count==_1be.length){_1c2=true;}}this.nextButton.style.display=_1c2?"":"none";_1b9.set(this.nextButton,"id",this.id+"_next");return this.containerNode.childNodes;},clearResultList:function(){var _1c3=this.containerNode;while(_1c3.childNodes.length>2){_1c3.removeChild(_1c3.childNodes[_1c3.childNodes.length-2]);}this._setSelectedAttr(null);},highlightFirstOption:function(){this.selectFirstNode();},highlightLastOption:function(){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._getSelectedAttr();}});});},"dojo/parser":function(){define("dojo/parser",["./_base/kernel","./_base/lang","./_base/array","./_base/html","./_base/window","./_base/url","./_base/json","./aspect","./date/stamp","./query","./on","./ready"],function(dojo,_1c4,_1c5,_1c6,_1c7,_1c8,_1c9,_1ca,_1cb,_1cc,don){new Date("X");var _1cd={"dom-attributes-explicit":document.createElement("div").attributes.length<40};function has(_1ce){return _1cd[_1ce];};dojo.parser=new function(){var _1cf={};function _1d0(_1d1){var map={};for(var name in _1d1){if(name.charAt(0)=="_"){continue;}map[name.toLowerCase()]=name;}return map;};_1ca.after(_1c4,"extend",function(){_1cf={};},true);var _1d2={};this._functionFromScript=function(_1d3,_1d4){var _1d5="";var _1d6="";var _1d7=(_1d3.getAttribute(_1d4+"args")||_1d3.getAttribute("args"));if(_1d7){_1c5.forEach(_1d7.split(/\s*,\s*/),function(part,idx){_1d5+="var "+part+" = arguments["+idx+"]; ";});}var _1d8=_1d3.getAttribute("with");if(_1d8&&_1d8.length){_1c5.forEach(_1d8.split(/\s*,\s*/),function(part){_1d5+="with("+part+"){";_1d6+="}";});}return new Function(_1d5+_1d3.innerHTML+_1d6);};this.instantiate=function(_1d9,_1da,args){var _1db=[],_1da=_1da||{};args=args||{};var _1dc=(args.scope||dojo._scopeName)+"Type",_1dd="data-"+(args.scope||dojo._scopeName)+"-",_1de=_1dd+"type",_1df=_1dd+"props",_1e0=_1dd+"attach-point",_1e1=_1dd+"attach-event",_1e2=_1dd+"id";var _1e3={};_1c5.forEach([_1df,_1de,_1dc,_1e2,"jsId",_1e0,_1e1,"dojoAttachPoint","dojoAttachEvent","class","style"],function(name){_1e3[name.toLowerCase()]=name.replace(args.scope,"dojo");});_1c5.forEach(_1d9,function(obj){if(!obj){return;}var node=obj.node||obj,type=_1dc in _1da?_1da[_1dc]:obj.node?obj.type:(node.getAttribute(_1de)||node.getAttribute(_1dc)),ctor=_1d2[type]||(_1d2[type]=_1c4.getObject(type)),_1e4=ctor&&ctor.prototype;if(!ctor){throw new Error("Could not load class '"+type);}var _1e5={};if(args.defaults){_1c4.mixin(_1e5,args.defaults);}if(obj.inherited){_1c4.mixin(_1e5,obj.inherited);}var _1e6;if(has("dom-attributes-explicit")){_1e6=node.attributes;}else{var _1e7=/^input$|^img$/i.test(node.nodeName)?node:node.cloneNode(false),_1e8=_1e7.outerHTML.replace(/=[^\s"']+|="[^"]*"|='[^']*'/g,"").replace(/^\s*<[a-zA-Z0-9]*/,"").replace(/>.*$/,"");_1e6=_1c5.map(_1e8.split(/\s+/),function(name){var _1e9=name.toLowerCase();return {name:name,value:(node.nodeName=="LI"&&name=="value")||_1e9=="enctype"?node.getAttribute(_1e9):node.getAttributeNode(_1e9).value,specified:true};});}var i=0,item;while(item=_1e6[i++]){if(!item||!item.specified){continue;}var name=item.name,_1ea=name.toLowerCase(),_1eb=item.value;if(_1ea in _1e3){switch(_1e3[_1ea]){case "data-dojo-props":var _1ec=_1eb;break;case "data-dojo-id":case "jsId":var _1ed=_1eb;break;case "data-dojo-attach-point":case "dojoAttachPoint":_1e5.dojoAttachPoint=_1eb;break;case "data-dojo-attach-event":case "dojoAttachEvent":_1e5.dojoAttachEvent=_1eb;break;case "class":_1e5["class"]=node.className;break;case "style":_1e5["style"]=node.style&&node.style.cssText;break;}}else{if(!(name in _1e4)){var map=(_1cf[type]||(_1cf[type]=_1d0(_1e4)));name=map[_1ea]||name;}if(name in _1e4){switch(typeof _1e4[name]){case "string":_1e5[name]=_1eb;break;case "number":_1e5[name]=_1eb.length?Number(_1eb):NaN;break;case "boolean":_1e5[name]=_1eb.toLowerCase()!="false";break;case "function":if(_1eb===""||_1eb.search(/[^\w\.]+/i)!=-1){_1e5[name]=new Function(_1eb);}else{_1e5[name]=_1c4.getObject(_1eb,false)||new Function(_1eb);}break;default:var pVal=_1e4[name];_1e5[name]=(pVal&&"length" in pVal)?(_1eb?_1eb.split(/\s*,\s*/):[]):(pVal instanceof Date)?(_1eb==""?new Date(""):_1eb=="now"?new Date():_1cb.fromISOString(_1eb)):(pVal instanceof dojo._Url)?(dojo.baseUrl+_1eb):_1c9.fromJson(_1eb);}}else{_1e5[name]=_1eb;}}}if(_1ec){try{_1ec=_1c9.fromJson.call(args.propsThis,"{"+_1ec+"}");_1c4.mixin(_1e5,_1ec);}catch(e){throw new Error(e.toString()+" in data-dojo-props='"+_1ec+"'");}}_1c4.mixin(_1e5,_1da);var _1ee=obj.node?obj.scripts:(ctor&&(ctor._noScript||_1e4._noScript)?[]:_1cc("> script[type^='dojo/']",node));var _1ef=[],_1f0=[],_1f1=[],on=[];if(_1ee){for(i=0;i<_1ee.length;i++){var _1f2=_1ee[i];node.removeChild(_1f2);var _1f3=(_1f2.getAttribute(_1dd+"event")||_1f2.getAttribute("event")),prop=_1f2.getAttribute(_1dd+"prop"),type=_1f2.getAttribute("type"),nf=this._functionFromScript(_1f2,_1dd);if(_1f3){if(type=="dojo/connect"){_1ef.push({event:_1f3,func:nf});}else{if(type=="dojo/on"){on.push({event:_1f3,func:nf});}else{_1e5[_1f3]=nf;}}}else{if(type=="dojo/watch"){_1f1.push({prop:prop,func:nf});}else{_1f0.push(nf);}}}}var _1f4=ctor.markupFactory||_1e4.markupFactory;var _1f5=_1f4?_1f4(_1e5,node,ctor):new ctor(_1e5,node);_1db.push(_1f5);if(_1ed){_1c4.setObject(_1ed,_1f5);}for(i=0;i<_1ef.length;i++){_1ca.after(_1f5,_1ef[i].event,dojo.hitch(_1f5,_1ef[i].func),true);}for(i=0;i<_1f0.length;i++){_1f0[i].call(_1f5);}for(i=0;i<_1f1.length;i++){_1f5.watch(_1f1[i].prop,_1f1[i].func);}for(i=0;i<on.length;i++){don(_1f5,on[i].event,on[i].func);}},this);if(!_1da._started){_1c5.forEach(_1db,function(_1f6){if(!args.noStart&&_1f6&&_1c4.isFunction(_1f6.startup)&&!_1f6._started){_1f6.startup();}});}return _1db;};this.parse=function(_1f7,args){var root;if(!args&&_1f7&&_1f7.rootNode){args=_1f7;root=args.rootNode;}else{root=_1f7;}root=root?_1c6.byId(root):_1c7.body();args=args||{};var _1f8=(args.scope||dojo._scopeName)+"Type",_1f9="data-"+(args.scope||dojo._scopeName)+"-",_1fa=_1f9+"type",_1fb=_1f9+"textdir";var list=[];var node=root.firstChild;var _1fc=args&&args.inherited;if(!_1fc){function _1fd(node,attr){return (node.getAttribute&&node.getAttribute(attr))||(node!==_1c7.doc&&node!==_1c7.doc.documentElement&&node.parentNode?_1fd(node.parentNode,attr):null);};_1fc={dir:_1fd(root,"dir"),lang:_1fd(root,"lang"),textDir:_1fd(root,_1fb)};for(var key in _1fc){if(!_1fc[key]){delete _1fc[key];}}}var _1fe={inherited:_1fc};var _1ff;var _200;function _201(_202){if(!_202.inherited){_202.inherited={};var node=_202.node,_203=_201(_202.parent);var _204={dir:node.getAttribute("dir")||_203.dir,lang:node.getAttribute("lang")||_203.lang,textDir:node.getAttribute(_1fb)||_203.textDir};for(var key in _204){if(_204[key]){_202.inherited[key]=_204[key];}}}return _202.inherited;};while(true){if(!node){if(!_1fe||!_1fe.node){break;}node=_1fe.node.nextSibling;_1ff=_1fe.scripts;_200=false;_1fe=_1fe.parent;continue;}if(node.nodeType!=1){node=node.nextSibling;continue;}if(_1ff&&node.nodeName.toLowerCase()=="script"){type=node.getAttribute("type");if(type&&/^dojo\/\w/i.test(type)){_1ff.push(node);}node=node.nextSibling;continue;}if(_200){node=node.nextSibling;continue;}var type=node.getAttribute(_1fa)||node.getAttribute(_1f8);var _205=node.firstChild;if(!type&&(!_205||(_205.nodeType==3&&!_205.nextSibling))){node=node.nextSibling;continue;}var _206={node:node,scripts:_1ff,parent:_1fe};var ctor=type&&(_1d2[type]||(_1d2[type]=_1c4.getObject(type))),_207=ctor&&!ctor.prototype._noScript?[]:null;if(type){list.push({"type":type,node:node,scripts:_207,inherited:_201(_206)});}node=_205;_1ff=_207;_200=ctor&&ctor.prototype.stopParser&&!(args&&args.template);_1fe=_206;}var _208=args&&args.template?{template:true}:null;return this.instantiate(list,_208,args);};}();if(dojo.config.parseOnLoad){dojo.ready(100,dojo.parser,"parse");}return dojo.parser;});},"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\"\n/></span>\n","dojo/dnd/Manager":function(){define("dojo/dnd/Manager",["../main","../Evented","./common","./autoscroll","./Avatar"],function(dojo,_209){var _20a=dojo.declare("dojo.dnd.Manager",[_209],{constructor:function(){this.avatar=null;this.source=null;this.nodes=[];this.copy=true;this.target=null;this.canDropFlag=false;this.events=[];},OFFSET_X:16,OFFSET_Y:16,overSource:function(_20b){if(this.avatar){this.target=(_20b&&_20b.targetState!="Disabled")?_20b:null;this.canDropFlag=Boolean(this.target);this.avatar.update();}dojo.publish("/dnd/source/over",[_20b]);},outSource:function(_20c){if(this.avatar){if(this.target==_20c){this.target=null;this.canDropFlag=false;this.avatar.update();dojo.publish("/dnd/source/over",[null]);}}else{dojo.publish("/dnd/source/over",[null]);}},startDrag:function(_20d,_20e,copy){this.source=_20d;this.nodes=_20e;this.copy=Boolean(copy);this.avatar=this.makeAvatar();dojo.body().appendChild(this.avatar.node);dojo.publish("/dnd/start",[_20d,_20e,this.copy]);this.events=[dojo.connect(dojo.doc,"onmousemove",this,"onMouseMove"),dojo.connect(dojo.doc,"onmouseup",this,"onMouseUp"),dojo.connect(dojo.doc,"onkeydown",this,"onKeyDown"),dojo.connect(dojo.doc,"onkeyup",this,"onKeyUp"),dojo.connect(dojo.doc,"ondragstart",dojo.stopEvent),dojo.connect(dojo.body(),"onselectstart",dojo.stopEvent)];var c="dojoDnd"+(copy?"Copy":"Move");dojo.addClass(dojo.body(),c);},canDrop:function(flag){var _20f=Boolean(this.target&&flag);if(this.canDropFlag!=_20f){this.canDropFlag=_20f;this.avatar.update();}},stopDrag:function(){dojo.removeClass(dojo.body(),["dojoDndCopy","dojoDndMove"]);dojo.forEach(this.events,dojo.disconnect);this.events=[];this.avatar.destroy();this.avatar=null;this.source=this.target=null;this.nodes=[];},makeAvatar:function(){return new dojo.dnd.Avatar(this);},updateAvatar:function(){this.avatar.update();},onMouseMove:function(e){var a=this.avatar;if(a){dojo.dnd.autoScrollNodes(e);var s=a.node.style;s.left=(e.pageX+this.OFFSET_X)+"px";s.top=(e.pageY+this.OFFSET_Y)+"px";var copy=Boolean(this.source.copyState(dojo.isCopyKey(e)));if(this.copy!=copy){this._setCopyStatus(copy);}}},onMouseUp:function(e){if(this.avatar){if(this.target&&this.canDropFlag){var copy=Boolean(this.source.copyState(dojo.isCopyKey(e))),_210=[this.source,this.nodes,copy,this.target,e];dojo.publish("/dnd/drop/before",_210);dojo.publish("/dnd/drop",_210);}else{dojo.publish("/dnd/cancel");}this.stopDrag();}},onKeyDown:function(e){if(this.avatar){switch(e.keyCode){case dojo.keys.CTRL:var copy=Boolean(this.source.copyState(true));if(this.copy!=copy){this._setCopyStatus(copy);}break;case dojo.keys.ESCAPE:dojo.publish("/dnd/cancel");this.stopDrag();break;}}},onKeyUp:function(e){if(this.avatar&&e.keyCode==dojo.keys.CTRL){var copy=Boolean(this.source.copyState(false));if(this.copy!=copy){this._setCopyStatus(copy);}}},_setCopyStatus:function(copy){this.copy=copy;this.source._markDndStatus(this.copy);this.updateAvatar();dojo.replaceClass(dojo.body(),"dojoDnd"+(this.copy?"Copy":"Move"),"dojoDnd"+(this.copy?"Move":"Copy"));}});dojo.dnd._manager=null;_20a.manager=dojo.dnd.manager=function(){if(!dojo.dnd._manager){dojo.dnd._manager=new dojo.dnd.Manager();}return dojo.dnd._manager;};return _20a;});},"dijit/form/ToggleButton":function(){define("dijit/form/ToggleButton",["dojo/_base/declare","dojo/_base/kernel","./Button","./_ToggleButtonMixin"],function(_211,_212,_213,_214){return _211("dijit.form.ToggleButton",[_213,_214],{baseClass:"dijitToggleButton",setChecked:function(_215){_212.deprecated("setChecked("+_215+") is deprecated. Use set('checked',"+_215+") instead.","","2.0");this.set("checked",_215);}});});},"dojo/date/stamp":function(){define("dojo/date/stamp",["../_base/kernel","../_base/lang","../_base/array"],function(dojo,lang,_216){lang.getObject("date.stamp",true,dojo);dojo.date.stamp.fromISOString=function(_217,_218){if(!dojo.date.stamp._isoRegExp){dojo.date.stamp._isoRegExp=/^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/;}var _219=dojo.date.stamp._isoRegExp.exec(_217),_21a=null;if(_219){_219.shift();if(_219[1]){_219[1]--;}if(_219[6]){_219[6]*=1000;}if(_218){_218=new Date(_218);_216.forEach(_216.map(["FullYear","Month","Date","Hours","Minutes","Seconds","Milliseconds"],function(prop){return _218["get"+prop]();}),function(_21b,_21c){_219[_21c]=_219[_21c]||_21b;});}_21a=new Date(_219[0]||1970,_219[1]||0,_219[2]||1,_219[3]||0,_219[4]||0,_219[5]||0,_219[6]||0);if(_219[0]<100){_21a.setFullYear(_219[0]||1970);}var _21d=0,_21e=_219[7]&&_219[7].charAt(0);if(_21e!="Z"){_21d=((_219[8]||0)*60)+(Number(_219[9])||0);if(_21e!="-"){_21d*=-1;}}if(_21e){_21d-=_21a.getTimezoneOffset();}if(_21d){_21a.setTime(_21a.getTime()+_21d*60000);}}return _21a;};dojo.date.stamp.toISOString=function(_21f,_220){var _221=function(n){return (n<10)?"0"+n:n;};_220=_220||{};var _222=[],_223=_220.zulu?"getUTC":"get",date="";if(_220.selector!="time"){var year=_21f[_223+"FullYear"]();date=["0000".substr((year+"").length)+year,_221(_21f[_223+"Month"]()+1),_221(_21f[_223+"Date"]())].join("-");}_222.push(date);if(_220.selector!="date"){var time=[_221(_21f[_223+"Hours"]()),_221(_21f[_223+"Minutes"]()),_221(_21f[_223+"Seconds"]())].join(":");var _224=_21f[_223+"Milliseconds"]();if(_220.milliseconds){time+="."+(_224<100?"0":"")+_221(_224);}if(_220.zulu){time+="Z";}else{if(_220.selector!="time"){var _225=_21f.getTimezoneOffset();var _226=Math.abs(_225);time+=(_225>0?"-":"+")+_221(Math.floor(_226/60))+":"+_221(_226%60);}}_222.push(time);}return _222.join("T");};return dojo.date.stamp;});},"dojo/Stateful":function(){define("dojo/Stateful",["./_base/kernel","./_base/declare","./_base/lang","./_base/array"],function(dojo,_227,lang,_228){return dojo.declare("dojo.Stateful",null,{postscript:function(_229){if(_229){lang.mixin(this,_229);}},get:function(name){return this[name];},set:function(name,_22a){if(typeof name==="object"){for(var x in name){this.set(x,name[x]);}return this;}var _22b=this[name];this[name]=_22a;if(this._watchCallbacks){this._watchCallbacks(name,_22b,_22a);}return this;},watch:function(name,_22c){var _22d=this._watchCallbacks;if(!_22d){var self=this;_22d=this._watchCallbacks=function(name,_22e,_22f,_230){var _231=function(_232){if(_232){_232=_232.slice();for(var i=0,l=_232.length;i<l;i++){try{_232[i].call(self,name,_22e,_22f);}catch(e){console.error(e);}}}};_231(_22d["_"+name]);if(!_230){_231(_22d["*"]);}};}if(!_22c&&typeof name==="function"){_22c=name;name="*";}else{name="_"+name;}var _233=_22d[name];if(typeof _233!=="object"){_233=_22d[name]=[];}_233.push(_22c);return {unwatch:function(){_233.splice(_228.indexOf(_233,_22c),1);}};}});});},"dijit/layout/AccordionContainer":function(){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","dojo/_base/declare","dojo/_base/event","dojo/_base/fx","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/_base/sniff","dojo/topic","../focus","../_base/manager","dojo/ready","../_Widget","../_Container","../_TemplatedMixin","../_CssStateMixin","./StackContainer","./ContentPane","dojo/text!./templates/AccordionButton.html"],function(_234,_235,_236,_237,fx,dom,_238,_239,_23a,_23b,_23c,keys,lang,has,_23d,_23e,_23f,_240,_241,_242,_243,_244,_245,_246,_247){var _248=_236("dijit.layout._AccordionButton",[_241,_243,_244],{templateString:_247,label:"",_setLabelAttr:{node:"titleTextNode",type:"innerHTML"},title:"",_setTitleAttr:{node:"titleTextNode",type:"attribute",attribute:"title"},iconClassAttr:"",_setIconClassAttr:{node:"iconNode",type:"class"},baseClass:"dijitAccordionTitle",getParent:function(){return this.parent;},buildRendering:function(){this.inherited(arguments);var _249=this.id.replace(" ","_");_238.set(this.titleTextNode,"id",_249+"_title");this.focusNode.setAttribute("aria-labelledby",_238.get(this.titleTextNode,"id"));dom.setSelectable(this.domNode,false);},getTitleHeight:function(){return _23b.getMarginSize(this.domNode).h;},_onTitleClick:function(){var _24a=this.getParent();_24a.selectChild(this.contentWidget,true);_23e.focus(this.focusNode);},_onTitleKeyPress:function(evt){return this.getParent()._onKeyPress(evt,this.contentWidget);},_setSelectedAttr:function(_24b){this._set("selected",_24b);this.focusNode.setAttribute("aria-expanded",_24b);this.focusNode.setAttribute("aria-selected",_24b);this.focusNode.setAttribute("tabIndex",_24b?"0":"-1");}});var _24c=_236("dijit.layout._AccordionInnerContainer",[_241,_244],{baseClass:"dijitAccordionInnerContainer",isLayoutContainer:true,buildRendering:function(){this.domNode=_23a.place("<div class='"+this.baseClass+"' role='presentation'>",this.contentWidget.domNode,"after");var _24d=this.contentWidget,cls=lang.isString(this.buttonWidget)?lang.getObject(this.buttonWidget):this.buttonWidget;this.button=_24d._buttonWidget=(new cls({contentWidget:_24d,label:_24d.title,title:_24d.tooltip,dir:_24d.dir,lang:_24d.lang,textDir:_24d.textDir,iconClass:_24d.iconClass,id:_24d.id+"_button",parent:this.parent})).placeAt(this.domNode);this.containerNode=_23a.place("<div class='dijitAccordionChildWrapper' style='display:none'>",this.domNode);_23a.place(this.contentWidget.domNode,this.containerNode);},postCreate:function(){this.inherited(arguments);var _24e=this.button;this._contentWidgetWatches=[this.contentWidget.watch("title",lang.hitch(this,function(name,_24f,_250){_24e.set("label",_250);})),this.contentWidget.watch("tooltip",lang.hitch(this,function(name,_251,_252){_24e.set("title",_252);})),this.contentWidget.watch("iconClass",lang.hitch(this,function(name,_253,_254){_24e.set("iconClass",_254);}))];},_setSelectedAttr:function(_255){this._set("selected",_255);this.button.set("selected",_255);if(_255){var cw=this.contentWidget;if(cw.onSelected){cw.onSelected();}}},startup:function(){this.contentWidget.startup();},destroy:function(){this.button.destroyRecursive();_235.forEach(this._contentWidgetWatches||[],function(w){w.unwatch();});delete this.contentWidget._buttonWidget;delete this.contentWidget._wrapperWidget;this.inherited(arguments);},destroyDescendants:function(_256){this.contentWidget.destroyRecursive(_256);}});var _257=_236("dijit.layout.AccordionContainer",_245,{duration:_23f.defaultDuration,buttonWidget:_248,baseClass:"dijitAccordionContainer",buildRendering:function(){this.inherited(arguments);this.domNode.style.overflow="hidden";this.domNode.setAttribute("role","tablist");},startup:function(){if(this._started){return;}this.inherited(arguments);if(this.selectedChildWidget){var _258=this.selectedChildWidget.containerNode.style;_258.display="";_258.overflow="auto";this.selectedChildWidget._wrapperWidget.set("selected",true);}},layout:function(){var _259=this.selectedChildWidget;if(!_259){return;}var _25a=_259._wrapperWidget.domNode,_25b=_23b.getMarginExtents(_25a),_25c=_23b.getPadBorderExtents(_25a),_25d=_259._wrapperWidget.containerNode,_25e=_23b.getMarginExtents(_25d),_25f=_23b.getPadBorderExtents(_25d),_260=this._contentBox;var _261=0;_235.forEach(this.getChildren(),function(_262){if(_262!=_259){_261+=_23b.getMarginSize(_262._wrapperWidget.domNode).h;}});this._verticalSpace=_260.h-_261-_25b.h-_25c.h-_25e.h-_25f.h-_259._buttonWidget.getTitleHeight();this._containerContentBox={h:this._verticalSpace,w:this._contentBox.w-_25b.w-_25c.w-_25e.w-_25f.w};if(_259){_259.resize(this._containerContentBox);}},_setupChild:function(_263){_263._wrapperWidget=_24c({contentWidget:_263,buttonWidget:this.buttonWidget,id:_263.id+"_wrapper",dir:_263.dir,lang:_263.lang,textDir:_263.textDir,parent:this});this.inherited(arguments);},addChild:function(_264,_265){if(this._started){var _266=this.containerNode;if(_265&&typeof _265=="number"){var _267=_241.prototype.getChildren.call(this);if(_267&&_267.length>=_265){_266=_267[_265-1].domNode;_265="after";}}_23a.place(_264.domNode,_266,_265);if(!_264._started){_264.startup();}this._setupChild(_264);_23d.publish(this.id+"-addChild",_264,_265);this.layout();if(!this.selectedChildWidget){this.selectChild(_264);}}else{this.inherited(arguments);}},removeChild:function(_268){if(_268._wrapperWidget){_23a.place(_268.domNode,_268._wrapperWidget.domNode,"after");_268._wrapperWidget.destroy();delete _268._wrapperWidget;}_239.remove(_268.domNode,"dijitHidden");this.inherited(arguments);},getChildren:function(){return _235.map(this.inherited(arguments),function(_269){return _269.declaredClass=="dijit.layout._AccordionInnerContainer"?_269.contentWidget:_269;},this);},destroy:function(){if(this._animation){this._animation.stop();}_235.forEach(this.getChildren(),function(_26a){if(_26a._wrapperWidget){_26a._wrapperWidget.destroy();}else{_26a.destroyRecursive();}});this.inherited(arguments);},_showChild:function(_26b){_26b._wrapperWidget.containerNode.style.display="block";return this.inherited(arguments);},_hideChild:function(_26c){_26c._wrapperWidget.containerNode.style.display="none";this.inherited(arguments);},_transition:function(_26d,_26e,_26f){if(has("ie")<8){_26f=false;}if(this._animation){this._animation.stop(true);delete this._animation;}var self=this;if(_26d){_26d._wrapperWidget.set("selected",true);var d=this._showChild(_26d);if(this.doLayout&&_26d.resize){_26d.resize(this._containerContentBox);}}if(_26e){_26e._wrapperWidget.set("selected",false);if(!_26f){this._hideChild(_26e);}}if(_26f){var _270=_26d._wrapperWidget.containerNode,_271=_26e._wrapperWidget.containerNode;var _272=_26d._wrapperWidget.containerNode,_273=_23b.getMarginExtents(_272),_274=_23b.getPadBorderExtents(_272),_275=_273.h+_274.h;_271.style.height=(self._verticalSpace-_275)+"px";this._animation=new fx.Animation({node:_270,duration:this.duration,curve:[1,this._verticalSpace-_275-1],onAnimate:function(_276){_276=Math.floor(_276);_270.style.height=_276+"px";_271.style.height=(self._verticalSpace-_275-_276)+"px";},onEnd:function(){delete self._animation;_270.style.height="auto";_26e._wrapperWidget.containerNode.style.display="none";_271.style.height="auto";self._hideChild(_26e);}});this._animation.onStop=this._animation.onEnd;this._animation.play();}return d;},_onKeyPress:function(e,_277){if(this.disabled||e.altKey||!(_277||e.ctrlKey)){return;}var c=e.charOrCode;if((_277&&(c==keys.LEFT_ARROW||c==keys.UP_ARROW))||(e.ctrlKey&&c==keys.PAGE_UP)){this._adjacent(false)._buttonWidget._onTitleClick();_237.stop(e);}else{if((_277&&(c==keys.RIGHT_ARROW||c==keys.DOWN_ARROW))||(e.ctrlKey&&(c==keys.PAGE_DOWN||c==keys.TAB))){this._adjacent(true)._buttonWidget._onTitleClick();_237.stop(e);}}}});if(!_23c.isAsync){_240(0,function(){var _278=["dijit/layout/AccordionPane"];_234(_278);});}_257._InnerContainer=_24c;_257._Button=_248;return _257;});},"dijit/form/_AutoCompleterMixin":function(){define("dijit/form/_AutoCompleterMixin",["dojo/_base/connect","dojo/data/util/filter","dojo/_base/declare","dojo/_base/Deferred","dojo/dom-attr","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/query","dojo/regexp","dojo/_base/sniff","dojo/string","dojo/_base/window","./DataList","../registry","./_TextBoxMixin"],function(_279,_27a,_27b,_27c,_27d,_27e,keys,lang,_27f,_280,has,_281,win,_282,_283,_284){return _27b("dijit.form._AutoCompleterMixin",null,{item:null,pageSize:Infinity,store:null,fetchProperties:{},query:{},autoComplete:true,highlightMatch:"first",searchDelay:100,searchAttr:"name",labelAttr:"",labelType:"text",queryExpr:"${0}*",ignoreCase:true,maxHeight:-1,_stopClickEvents:false,_getCaretPos:function(_285){var pos=0;if(typeof (_285.selectionStart)=="number"){pos=_285.selectionStart;}else{if(has("ie")){var tr=win.doc.selection.createRange().duplicate();var ntr=_285.createTextRange();tr.move("character",0);ntr.move("character",0);try{ntr.setEndPoint("EndToEnd",tr);pos=String(ntr.text).replace(/\r/g,"").length;}catch(e){}}}return pos;},_setCaretPos:function(_286,_287){_287=parseInt(_287);_284.selectInputText(_286,_287,_287);},_setDisabledAttr:function(_288){this.inherited(arguments);this.domNode.setAttribute("aria-disabled",_288);},_abortQuery:function(){if(this.searchTimer){clearTimeout(this.searchTimer);this.searchTimer=null;}if(this._fetchHandle){if(this._fetchHandle.cancel){this._cancelingQuery=true;this._fetchHandle.cancel();this._cancelingQuery=false;}this._fetchHandle=null;}},_onInput:function(evt){this.inherited(arguments);if(evt.charOrCode==229){this._onKey(evt);}},_onKey:function(evt){if(this.disabled||this.readOnly){return;}var key=evt.charOrCode;if(evt.altKey||((evt.ctrlKey||evt.metaKey)&&(key!="x"&&key!="v"))||key==keys.SHIFT){return;}var _289=false;var pw=this.dropDown;var _28a=null;this._prev_key_backspace=false;this._abortQuery();this.inherited(arguments);if(this._opened){_28a=pw.getHighlightedOption();}switch(key){case keys.PAGE_DOWN:case keys.DOWN_ARROW:case keys.PAGE_UP:case keys.UP_ARROW:if(this._opened){this._announceOption(_28a);}_27e.stop(evt);break;case keys.ENTER:if(_28a){if(_28a==pw.nextButton){this._nextSearch(1);_27e.stop(evt);break;}else{if(_28a==pw.previousButton){this._nextSearch(-1);_27e.stop(evt);break;}}}else{this._setBlurValue();this._setCaretPos(this.focusNode,this.focusNode.value.length);}if(this._opened||this._fetchHandle){_27e.stop(evt);}case keys.TAB:var _28b=this.get("displayedValue");if(pw&&(_28b==pw._messages["previousMessage"]||_28b==pw._messages["nextMessage"])){break;}if(_28a){this._selectOption(_28a);}case keys.ESCAPE:if(this._opened){this._lastQuery=null;this.closeDropDown();}break;case " ":if(_28a){_27e.stop(evt);this._selectOption(_28a);this.closeDropDown();}else{_289=true;}break;case keys.DELETE:case keys.BACKSPACE:this._prev_key_backspace=true;_289=true;break;default:_289=typeof key=="string"||key==229;}if(_289){this.item=undefined;this.searchTimer=setTimeout(lang.hitch(this,"_startSearchFromInput"),1);}},_autoCompleteText:function(text){var fn=this.focusNode;_284.selectInputText(fn,fn.value.length);var _28c=this.ignoreCase?"toLowerCase":"substr";if(text[_28c](0).indexOf(this.focusNode.value[_28c](0))==0){var cpos=this.autoComplete?this._getCaretPos(fn):fn.value.length;if((cpos+1)>fn.value.length){fn.value=text;_284.selectInputText(fn,cpos);}}else{fn.value=text;_284.selectInputText(fn);}},_openResultList:function(_28d,_28e,_28f){this._fetchHandle=null;if(this.disabled||this.readOnly||(_28e[this.searchAttr]!==this._lastQuery)){return;}var _290=this.dropDown.getHighlightedOption();this.dropDown.clearResultList();if(!_28d.length&&_28f.start==0){this.closeDropDown();return;}var _291=this.dropDown.createOptions(_28d,_28f,lang.hitch(this,"_getMenuLabelFromItem"));this._showResultList();if(_28f.direction){if(1==_28f.direction){this.dropDown.highlightFirstOption();}else{if(-1==_28f.direction){this.dropDown.highlightLastOption();}}if(_290){this._announceOption(this.dropDown.getHighlightedOption());}}else{if(this.autoComplete&&!this._prev_key_backspace&&!/^[*]+$/.test(_28e[this.searchAttr].toString())){this._announceOption(_291[1]);}}},_showResultList:function(){this.closeDropDown(true);this.openDropDown();this.domNode.setAttribute("aria-expanded","true");},loadDropDown:function(){this._startSearchAll();},isLoaded:function(){return false;},closeDropDown:function(){this._abortQuery();if(this._opened){this.inherited(arguments);this.domNode.setAttribute("aria-expanded","false");this.focusNode.removeAttribute("aria-activedescendant");}},_setBlurValue:function(){var _292=this.get("displayedValue");var pw=this.dropDown;if(pw&&(_292==pw._messages["previousMessage"]||_292==pw._messages["nextMessage"])){this._setValueAttr(this._lastValueReported,true);}else{if(typeof this.item=="undefined"){this.item=null;this.set("displayedValue",_292);}else{if(this.value!=this._lastValueReported){this._handleOnChange(this.value,true);}this._refreshState();}}},_setItemAttr:function(item,_293,_294){var _295="";if(item){if(!_294){_294=this.store._oldAPI?this.store.getValue(item,this.searchAttr):item[this.searchAttr];}_295=this._getValueField()!=this.searchAttr?this.store.getIdentity(item):_294;}this.set("value",_295,_293,_294,item);},_announceOption:function(node){if(!node){return;}var _296;if(node==this.dropDown.nextButton||node==this.dropDown.previousButton){_296=node.innerHTML;this.item=undefined;this.value="";}else{_296=(this.store._oldAPI?this.store.getValue(node.item,this.searchAttr):node.item[this.searchAttr]).toString();this.set("item",node.item,false,_296);}this.focusNode.value=this.focusNode.value.substring(0,this._lastInput.length);this.focusNode.setAttribute("aria-activedescendant",_27d.get(node,"id"));this._autoCompleteText(_296);},_selectOption:function(_297){this.closeDropDown();if(_297){this._announceOption(_297);}this._setCaretPos(this.focusNode,this.focusNode.value.length);this._handleOnChange(this.value,true);},_startSearchAll:function(){this._startSearch("");},_startSearchFromInput:function(){this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g,"\\$1"));},_getQueryString:function(text){return _281.substitute(this.queryExpr,[text]);},_startSearch:function(key){if(!this.dropDown){var _298=this.id+"_popup",_299=lang.isString(this.dropDownClass)?lang.getObject(this.dropDownClass,false):this.dropDownClass;this.dropDown=new _299({onChange:lang.hitch(this,this._selectOption),id:_298,dir:this.dir,textDir:this.textDir});this.focusNode.removeAttribute("aria-activedescendant");this.textbox.setAttribute("aria-owns",_298);}this._lastInput=key;var _29a=lang.clone(this.query);var _29b={start:0,count:this.pageSize,queryOptions:{ignoreCase:this.ignoreCase,deep:true}};lang.mixin(_29b,this.fetchProperties);var qs=this._getQueryString(key),q;if(this.store._oldAPI){q=qs;}else{q=_27a.patternToRegExp(qs,this.ignoreCase);q.toString=function(){return qs;};}this._lastQuery=_29a[this.searchAttr]=q;var _29c=this,_29d=function(){var _29e=_29c._fetchHandle=_29c.store.query(_29a,_29b);_27c.when(_29e,function(res){_29c._fetchHandle=null;res.total=_29e.total;_29c._openResultList(res,_29a,_29b);},function(err){_29c._fetchHandle=null;if(!_29c._cancelingQuery){console.error(_29c.declaredClass+" "+err.toString());_29c.closeDropDown();}});};this.searchTimer=setTimeout(lang.hitch(this,function(_29f,_2a0){this.searchTimer=null;_29d();this._nextSearch=this.dropDown.onPage=function(_2a1){_29b.start+=_29b.count*_2a1;_29b.direction=_2a1;_29d();_2a0.focus();};},_29a,this),this.searchDelay);},_getValueField:function(){return this.searchAttr;},constructor:function(){this.query={};this.fetchProperties={};},postMixInProperties:function(){if(!this.store){var _2a2=this.srcNodeRef;var list=this.list;if(list){this.store=_283.byId(list);}else{this.store=new _282({},_2a2);}if(!("value" in this.params)){var item=(this.item=this.store.fetchSelectedItem());if(item){var _2a3=this._getValueField();this.value=this.store._oldAPI?this.store.getValue(item,_2a3):item[_2a3];}}}this.inherited(arguments);},postCreate:function(){var _2a4=_27f("label[for=\""+this.id+"\"]");if(_2a4.length){_2a4[0].id=(this.id+"_label");this.domNode.setAttribute("aria-labelledby",_2a4[0].id);}this.inherited(arguments);},_getMenuLabelFromItem:function(item){var _2a5=this.labelFunc(item,this.store),_2a6=this.labelType;if(this.highlightMatch!="none"&&this.labelType=="text"&&this._lastInput){_2a5=this.doHighlight(_2a5,this._escapeHtml(this._lastInput));_2a6="html";}return {html:_2a6=="html",label:_2a5};},doHighlight:function(_2a7,find){var _2a8=(this.ignoreCase?"i":"")+(this.highlightMatch=="all"?"g":""),i=this.queryExpr.indexOf("${0}");find=_280.escapeString(find);return this._escapeHtml(_2a7).replace(new RegExp((i==0?"^":"")+"("+find+")"+(i==(this.queryExpr.length-4)?"$":""),_2a8),"<span class=\"dijitComboBoxHighlightMatch\">$1</span>");},_escapeHtml:function(str){str=String(str).replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,""");return str;},reset:function(){this.item=null;this.inherited(arguments);},labelFunc:function(item,_2a9){return (_2a9._oldAPI?_2a9.getValue(item,this.labelAttr||this.searchAttr):item[this.labelAttr||this.searchAttr]).toString();},_setValueAttr:function(_2aa,_2ab,_2ac,item){this._set("item",item||null);if(!_2aa){_2aa="";}this.inherited(arguments);},_setTextDirAttr:function(_2ad){this.inherited(arguments);if(this.dropDown){this.dropDown._set("textDir",_2ad);}}});});},"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","url:dijit/layout/templates/_ScrollingTabControllerButton.html":"<div data-dojo-attach-event=\"onclick:_onClick\">\n\t<div role=\"presentation\" class=\"dijitTabInnerDiv\" data-dojo-attach-point=\"innerDiv,focusNode\">\n\t\t<div role=\"presentation\" class=\"dijitTabContent dijitButtonContents\" data-dojo-attach-point=\"tabContent\">\n\t\t\t<img role=\"presentation\" alt=\"\" src=\"${_blankGif}\" class=\"dijitTabStripIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t\t\t<span data-dojo-attach-point=\"containerNode,titleNode\" class=\"dijitButtonText\"></span>\n\t\t</div>\n\t</div>\n</div>","dijit/form/MappedTextBox":function(){define("dijit/form/MappedTextBox",["dojo/_base/declare","dojo/dom-construct","./ValidationTextBox"],function(_2ae,_2af,_2b0){return _2ae("dijit.form.MappedTextBox",_2b0,{postMixInProperties:function(){this.inherited(arguments);this.nameAttrSetting="";},_setNameAttr:null,serialize:function(val){return val.toString?val.toString():"";},toString:function(){var val=this.filter(this.get("value"));return val!=null?(typeof val=="string"?val:this.serialize(val,this.constraints)):"";},validate:function(){this.valueNode.value=this.toString();return this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);this.valueNode=_2af.place("<input type='hidden'"+(this.name?" name='"+this.name.replace(/'/g,""")+"'":"")+"/>",this.textbox,"after");},reset:function(){this.valueNode.value="";this.inherited(arguments);}});});},"dijit/form/ComboBoxMixin":function(){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=\"presentation\"\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","dojo/_base/Deferred","dojo/_base/kernel","dojo/_base/lang","dojo/store/util/QueryResults","./_AutoCompleterMixin","./_ComboBoxMenu","../_HasDropDown","dojo/text!./templates/DropDownBox.html"],function(_2b1,_2b2,_2b3,lang,_2b4,_2b5,_2b6,_2b7,_2b8){return _2b1("dijit.form.ComboBoxMixin",[_2b7,_2b5],{dropDownClass:_2b6,hasDownArrow:true,templateString:_2b8,baseClass:"dijitTextBox dijitComboBox",cssStateNodes:{"_buttonNode":"dijitDownArrowButton"},_setHasDownArrowAttr:function(val){this._set("hasDownArrow",val);this._buttonNode.style.display=val?"":"none";},_showResultList:function(){this.displayMessage("");this.inherited(arguments);},_setStoreAttr:function(_2b9){if(!_2b9.get){lang.mixin(_2b9,{_oldAPI:true,get:function(id){var _2ba=new _2b2();this.fetchItemByIdentity({identity:id,onItem:function(_2bb){_2ba.resolve(_2bb);},onError:function(_2bc){_2ba.reject(_2bc);}});return _2ba.promise;},query:function(_2bd,_2be){var _2bf=new _2b2(function(){_2c0.abort&&_2c0.abort();});var _2c0=this.fetch(lang.mixin({query:_2bd,onBegin:function(_2c1){_2bf.total=_2c1;},onComplete:function(_2c2){_2bf.resolve(_2c2);},onError:function(_2c3){_2bf.reject(_2c3);}},_2be));return _2b4(_2bf);}});}this._set("store",_2b9);},postMixInProperties:function(){if(this.params.store){this._setStoreAttr(this.params.store);}this.inherited(arguments);if(!this.params.store){var _2c4=this.declaredClass;lang.mixin(this.store,{getValue:function(item,attr){_2b3.deprecated(_2c4+".store.getValue(item, attr) is deprecated for builtin store. Use item.attr directly","","2.0");return item[attr];},getLabel:function(item){_2b3.deprecated(_2c4+".store.getLabel(item) is deprecated for builtin store. Use item.label directly","","2.0");return item.name;},fetch:function(args){_2b3.deprecated(_2c4+".store.fetch() is deprecated for builtin store.","Use store.query()","2.0");var shim=["dojo/data/ObjectStore"];require(shim,lang.hitch(this,function(_2c5){new _2c5({objectStore:this}).fetch(args);}));}});}}});});},"dijit/form/_TextBoxMixin":function(){define("dijit/form/_TextBoxMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom","dojo/_base/event","dojo/keys","dojo/_base/lang",".."],function(_2c6,_2c7,dom,_2c8,keys,lang,_2c9){var _2ca=_2c7("dijit.form._TextBoxMixin",null,{trim:false,uppercase:false,lowercase:false,propercase:false,maxLength:"",selectOnClick:false,placeHolder:"",_getValueAttr:function(){return this.parse(this.get("displayedValue"),this.constraints);},_setValueAttr:function(_2cb,_2cc,_2cd){var _2ce;if(_2cb!==undefined){_2ce=this.filter(_2cb);if(typeof _2cd!="string"){if(_2ce!==null&&((typeof _2ce!="number")||!isNaN(_2ce))){_2cd=this.filter(this.format(_2ce,this.constraints));}else{_2cd="";}}}if(_2cd!=null&&_2cd!=undefined&&((typeof _2cd)!="number"||!isNaN(_2cd))&&this.textbox.value!=_2cd){this.textbox.value=_2cd;this._set("displayedValue",this.get("displayedValue"));}if(this.textDir=="auto"){this.applyTextDir(this.focusNode,_2cd);}this.inherited(arguments,[_2ce,_2cc]);},displayedValue:"",_getDisplayedValueAttr:function(){return this.filter(this.textbox.value);},_setDisplayedValueAttr:function(_2cf){if(_2cf===null||_2cf===undefined){_2cf="";}else{if(typeof _2cf!="string"){_2cf=String(_2cf);}}this.textbox.value=_2cf;this._setValueAttr(this.get("value"),undefined);this._set("displayedValue",this.get("displayedValue"));if(this.textDir=="auto"){this.applyTextDir(this.focusNode,_2cf);}},format:function(_2d0){return ((_2d0==null||_2d0==undefined)?"":(_2d0.toString?_2d0.toString():_2d0));},parse:function(_2d1){return _2d1;},_refreshState:function(){},onInput:function(){},__skipInputEvent:false,_onInput:function(){if(this.textDir=="auto"){this.applyTextDir(this.focusNode,this.focusNode.value);}this._refreshState();this._set("displayedValue",this.get("displayedValue"));},postCreate:function(){this.textbox.setAttribute("value",this.textbox.value);this.inherited(arguments);var _2d2=function(e){var _2d3=e.charOrCode||e.keyCode||229;if(e.type=="keydown"){switch(_2d3){case keys.SHIFT:case keys.ALT:case keys.CTRL:case keys.META:case keys.CAPS_LOCK:return;default:if(_2d3>=65&&_2d3<=90){return;}}}if(e.type=="keypress"&&typeof _2d3!="string"){return;}if(e.type=="input"){if(this.__skipInputEvent){this.__skipInputEvent=false;return;}}else{this.__skipInputEvent=true;}var faux=lang.mixin({},e,{charOrCode:_2d3,wasConsumed:false,preventDefault:function(){faux.wasConsumed=true;e.preventDefault();},stopPropagation:function(){e.stopPropagation();}});if(this.onInput(faux)===false){_2c8.stop(faux);}if(faux.wasConsumed){return;}setTimeout(lang.hitch(this,"_onInput",faux),0);};_2c6.forEach(["onkeydown","onkeypress","onpaste","oncut","oninput","oncompositionend"],function(_2d4){this.connect(this.textbox,_2d4,_2d2);},this);},_blankValue:"",filter:function(val){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);if(this._selectOnClickHandle){this.disconnect(this._selectOnClickHandle);}},_isTextSelected:function(){return this.textbox.selectionStart==this.textbox.selectionEnd;},_onFocus:function(by){if(this.disabled||this.readOnly){return;}if(this.selectOnClick&&by=="mouse"){this._selectOnClickHandle=this.connect(this.domNode,"onmouseup",function(){this.disconnect(this._selectOnClickHandle);if(this._isTextSelected()){_2ca.selectInputText(this.textbox);}});}this.inherited(arguments);this._refreshState();},reset:function(){this.textbox.value="";this.inherited(arguments);},_setTextDirAttr:function(_2d5){if(!this._created||this.textDir!=_2d5){this._set("textDir",_2d5);this.applyTextDir(this.focusNode,this.focusNode.value);}}});_2ca._setSelectionRange=_2c9._setSelectionRange=function(_2d6,_2d7,stop){if(_2d6.setSelectionRange){_2d6.setSelectionRange(_2d7,stop);}};_2ca.selectInputText=_2c9.selectInputText=function(_2d8,_2d9,stop){_2d8=dom.byId(_2d8);if(isNaN(_2d9)){_2d9=0;}if(isNaN(stop)){stop=_2d8.value?_2d8.value.length:0;}try{_2d8.focus();_2ca._setSelectionRange(_2d8,_2d9,stop);}catch(e){}};return _2ca;});},"dijit/form/SimpleTextarea":function(){define("dijit/form/SimpleTextarea",["dojo/_base/declare","dojo/dom-class","dojo/_base/sniff","dojo/_base/window","./TextBox"],function(_2da,_2db,has,win,_2dc){return _2da("dijit.form.SimpleTextarea",_2dc,{baseClass:"dijitTextBox dijitTextArea",rows:"3",cols:"20",templateString:"<textarea ${!nameAttrSetting} data-dojo-attach-point='focusNode,containerNode,textbox' autocomplete='off'></textarea>",postMixInProperties:function(){if(!this.value&&this.srcNodeRef){this.value=this.srcNodeRef.value;}this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);if(has("ie")&&this.cols){_2db.add(this.textbox,"dijitTextAreaCols");}},filter:function(_2dd){if(_2dd){_2dd=_2dd.replace(/\r/g,"");}return this.inherited(arguments);},_onInput:function(e){if(this.maxLength){var _2de=parseInt(this.maxLength);var _2df=this.textbox.value.replace(/\r/g,"");var _2e0=_2df.length-_2de;if(_2e0>0){var _2e1=this.textbox;if(_2e1.selectionStart){var pos=_2e1.selectionStart;var cr=0;if(has("opera")){cr=(this.textbox.value.substring(0,pos).match(/\r/g)||[]).length;}this.textbox.value=_2df.substring(0,pos-_2e0-cr)+_2df.substring(pos-cr);_2e1.setSelectionRange(pos-_2e0,pos-_2e0);}else{if(win.doc.selection){_2e1.focus();var _2e2=win.doc.selection.createRange();_2e2.moveStart("character",-_2e0);_2e2.text="";_2e2.select();}}}}this.inherited(arguments);}});});},"url:dijit/layout/templates/_TabButton.html":"<div role=\"presentation\" data-dojo-attach-point=\"titleNode\" data-dojo-attach-event='onclick:onClick'>\n <div role=\"presentation\" class='dijitTabInnerDiv' data-dojo-attach-point='innerDiv'>\n <div role=\"presentation\" class='dijitTabContent' data-dojo-attach-point='tabContent'>\n \t<div role=\"presentation\" data-dojo-attach-point='focusNode'>\n\t\t <img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitTabButtonIcon\" data-dojo-attach-point='iconNode' />\n\t\t <span data-dojo-attach-point='containerNode' class='tabLabel'></span>\n\t\t <span class=\"dijitInline dijitTabCloseButton dijitTabCloseIcon\" data-dojo-attach-point='closeNode'\n\t\t \t\tdata-dojo-attach-event='onclick: onClickCloseButton' role=\"presentation\">\n\t\t <span data-dojo-attach-point='closeText' class='dijitTabCloseText'>[x]</span\n\t\t ></span>\n\t\t\t</div>\n </div>\n </div>\n</div>\n","dijit/_base/window":function(){define("dijit/_base/window",["dojo/window",".."],function(_2e3,_2e4){_2e4.getDocumentWindow=function(doc){return _2e3.get(doc);};});},"dijit/form/RadioButton":function(){define("dijit/form/RadioButton",["dojo/_base/declare","./CheckBox","./_RadioButtonMixin"],function(_2e5,_2e6,_2e7){return _2e5("dijit.form.RadioButton",[_2e6,_2e7],{baseClass:"dijitRadio"});});},"dijit/main":function(){define("dijit/main",["dojo/_base/kernel"],function(dojo){return dojo.dijit;});},"dijit/_OnDijitClickMixin":function(){define("dijit/_OnDijitClickMixin",["dojo/on","dojo/_base/array","dojo/keys","dojo/_base/declare","dojo/_base/sniff","dojo/_base/unload","dojo/_base/window"],function(on,_2e8,keys,_2e9,has,_2ea,win){var _2eb=null;if(has("ie")){(function(){var _2ec=function(evt){_2eb=evt.srcElement;};win.doc.attachEvent("onkeydown",_2ec);_2ea.addOnWindowUnload(function(){win.doc.detachEvent("onkeydown",_2ec);});})();}else{win.doc.addEventListener("keydown",function(evt){_2eb=evt.target;},true);}var _2ed=function(node,_2ee){if(/input|button/i.test(node.nodeName)){return on(node,"click",_2ee);}else{function _2ef(e){return (e.keyCode==keys.ENTER||e.keyCode==keys.SPACE)&&!e.ctrlKey&&!e.shiftKey&&!e.altKey&&!e.metaKey;};var _2f0=[on(node,"keypress",function(e){if(_2ef(e)){_2eb=e.target;e.preventDefault();}}),on(node,"keyup",function(e){if(_2ef(e)&&e.target==_2eb){_2eb=null;_2ee.call(this,e);}}),on(node,"click",function(e){_2ee.call(this,e);})];return {remove:function(){_2e8.forEach(_2f0,function(h){h.remove();});}};}};return _2e9("dijit._OnDijitClickMixin",null,{connect:function(obj,_2f1,_2f2){return this.inherited(arguments,[obj,_2f1=="ondijitclick"?_2ed:_2f1,_2f2]);}});});},"dijit/InlineEditBox":function(){require({cache:{"url:dijit/templates/InlineEditBox.html":"<span data-dojo-attach-point=\"editNode\" role=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\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",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/dom-style","dojo/_base/event","dojo/i18n","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/_base/sniff","./focus","./_Widget","./_TemplatedMixin","./_WidgetsInTemplateMixin","./_Container","./form/Button","./form/_TextBoxMixin","./form/TextBox","dojo/text!./templates/InlineEditBox.html","dojo/i18n!./nls/common"],function(_2f3,_2f4,_2f5,_2f6,_2f7,_2f8,_2f9,i18n,_2fa,keys,lang,has,fm,_2fb,_2fc,_2fd,_2fe,_2ff,_300,_301,_302){var _303=_2f4("dijit._InlineEditor",[_2fb,_2fc,_2fd],{templateString:_302,postMixInProperties:function(){this.inherited(arguments);this.messages=i18n.getLocalization("dijit","common",this.lang);_2f3.forEach(["buttonSave","buttonCancel"],function(prop){if(!this[prop]){this[prop]=this.messages[prop];}},this);},buildRendering:function(){this.inherited(arguments);var cls=typeof this.editor=="string"?lang.getObject(this.editor):this.editor;var _304=this.sourceStyle,_305="line-height:"+_304.lineHeight+";",_306=_2f8.getComputedStyle(this.domNode);_2f3.forEach(["Weight","Family","Size","Style"],function(prop){var _307=_304["font"+prop],_308=_306["font"+prop];if(_308!=_307){_305+="font-"+prop+":"+_304["font"+prop]+";";}},this);_2f3.forEach(["marginTop","marginBottom","marginLeft","marginRight"],function(prop){this.domNode.style[prop]=_304[prop];},this);var _309=this.inlineEditBox.width;if(_309=="100%"){_305+="width:100%;";this.domNode.style.display="block";}else{_305+="width:"+(_309+(Number(_309)==_309?"px":""))+";";}var _30a=lang.delegate(this.inlineEditBox.editorParams,{style:_305,dir:this.dir,lang:this.lang,textDir:this.textDir});_30a["displayedValue" in cls.prototype?"displayedValue":"value"]=this.value;this.editWidget=new cls(_30a,this.editorPlaceholder);if(this.inlineEditBox.autoSave){_2f7.destroy(this.buttonContainer);}},postCreate:function(){this.inherited(arguments);var ew=this.editWidget;if(this.inlineEditBox.autoSave){this.connect(ew,"onChange","_onChange");this.connect(ew,"onKeyPress","_onKeyPress");}else{if("intermediateChanges" in ew){ew.set("intermediateChanges",true);this.connect(ew,"onChange","_onIntermediateChange");this.saveButton.set("disabled",true);}}},_onIntermediateChange:function(){this.saveButton.set("disabled",(this.getValue()==this._resetValue)||!this.enableSave());},destroy:function(){this.editWidget.destroy(true);this.inherited(arguments);},getValue:function(){var ew=this.editWidget;return String(ew.get("displayedValue" in ew?"displayedValue":"value"));},_onKeyPress:function(e){if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing){if(e.altKey||e.ctrlKey){return;}if(e.charOrCode==keys.ESCAPE){_2f9.stop(e);this.cancel(true);}else{if(e.charOrCode==keys.ENTER&&e.target.tagName=="INPUT"){_2f9.stop(e);this._onChange();}}}},_onBlur:function(){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(){if(this.inlineEditBox.autoSave&&this.inlineEditBox.editing&&this.enableSave()){fm.focus(this.inlineEditBox.displayNode);}},enableSave:function(){return (this.editWidget.isValid?this.editWidget.isValid():true);},focus:function(){this.editWidget.focus();setTimeout(lang.hitch(this,function(){if(this.editWidget.focusNode&&this.editWidget.focusNode.tagName=="INPUT"){_300.selectInputText(this.editWidget.focusNode);}}),0);}});var _30b=_2f4("dijit.InlineEditBox",_2fb,{editing:false,autoSave:true,buttonSave:"",buttonCancel:"",renderAsHtml:false,editor:_301,editorWrapper:_303,editorParams:{},disabled:false,onChange:function(){},onCancel:function(){},width:"100%",value:"",noValueIndicator:has("ie")<=6?"<span style='font-family: wingdings; text-decoration: underline;'>    ✍    </span>":"<span style='text-decoration: underline;'>    ✍    </span>",constructor:function(){this.editorParams={};},postMixInProperties:function(){this.inherited(arguments);this.displayNode=this.srcNodeRef;var _30c={ondijitclick:"_onClick",onmouseover:"_onMouseOver",onmouseout:"_onMouseOut",onfocus:"_onMouseOver",onblur:"_onMouseOut"};for(var name in _30c){this.connect(this.displayNode,name,_30c[name]);}this.displayNode.setAttribute("role","button");if(!this.displayNode.getAttribute("tabIndex")){this.displayNode.setAttribute("tabIndex",0);}if(!this.value&&!("value" in this.params)){this.value=lang.trim(this.renderAsHtml?this.displayNode.innerHTML:(this.displayNode.innerText||this.displayNode.textContent||""));}if(!this.value){this.displayNode.innerHTML=this.noValueIndicator;}_2f6.add(this.displayNode,"dijitInlineEditBoxDisplayMode");},setDisabled:function(_30d){_2fa.deprecated("dijit.InlineEditBox.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_30d);},_setDisabledAttr:function(_30e){this.domNode.setAttribute("aria-disabled",_30e);if(_30e){this.displayNode.removeAttribute("tabIndex");}else{this.displayNode.setAttribute("tabIndex",0);}_2f6.toggle(this.displayNode,"dijitInlineEditBoxDisplayModeDisabled",_30e);this._set("disabled",_30e);},_onMouseOver:function(){if(!this.disabled){_2f6.add(this.displayNode,"dijitInlineEditBoxDisplayModeHover");}},_onMouseOut:function(){_2f6.remove(this.displayNode,"dijitInlineEditBoxDisplayModeHover");},_onClick:function(e){if(this.disabled){return;}if(e){_2f9.stop(e);}this._onMouseOut();setTimeout(lang.hitch(this,"edit"),0);},edit:function(){if(this.disabled||this.editing){return;}this._set("editing",true);this._savedPosition=_2f8.get(this.displayNode,"position")||"static";this._savedOpacity=_2f8.get(this.displayNode,"opacity")||"1";this._savedTabIndex=_2f5.get(this.displayNode,"tabIndex")||"0";if(this.wrapperWidget){var ew=this.wrapperWidget.editWidget;ew.set("displayedValue" in ew?"displayedValue":"value",this.value);}else{var _30f=_2f7.create("span",null,this.domNode,"before");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:_2f8.getComputedStyle(this.displayNode),save:lang.hitch(this,"save"),cancel:lang.hitch(this,"cancel"),textDir:this.textDir},_30f);if(!this._started){this.startup();}}var ww=this.wrapperWidget;_2f8.set(this.displayNode,{position:"absolute",opacity:"0"});_2f8.set(ww.domNode,{position:this._savedPosition,visibility:"visible",opacity:"1"});_2f5.set(this.displayNode,"tabIndex","-1");setTimeout(lang.hitch(ww,function(){this.focus();this._resetValue=this.getValue();}),0);},_onBlur:function(){this.inherited(arguments);if(!this.editing){}},destroy:function(){if(this.wrapperWidget&&!this.wrapperWidget._destroyed){this.wrapperWidget.destroy();delete this.wrapperWidget;}this.inherited(arguments);},_showText:function(_310){var ww=this.wrapperWidget;_2f8.set(ww.domNode,{position:"absolute",visibility:"hidden",opacity:"0"});_2f8.set(this.displayNode,{position:this._savedPosition,opacity:this._savedOpacity});_2f5.set(this.displayNode,"tabIndex",this._savedTabIndex);if(_310){fm.focus(this.displayNode);}},save:function(_311){if(this.disabled||!this.editing){return;}this._set("editing",false);var ww=this.wrapperWidget;var _312=ww.getValue();this.set("value",_312);this._showText(_311);},setValue:function(val){_2fa.deprecated("dijit.InlineEditBox.setValue() is deprecated. Use set('value', ...) instead.","","2.0");return this.set("value",val);},_setValueAttr:function(val){val=lang.trim(val);var _313=this.renderAsHtml?val:val.replace(/&/gm,"&").replace(/</gm,"<").replace(/>/gm,">").replace(/"/gm,""").replace(/\n/g,"<br>");this.displayNode.innerHTML=_313||this.noValueIndicator;this._set("value",val);if(this._started){setTimeout(lang.hitch(this,"onChange",val),0);}if(this.textDir=="auto"){this.applyTextDir(this.displayNode,this.displayNode.innerText);}},getValue:function(){_2fa.deprecated("dijit.InlineEditBox.getValue() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},cancel:function(_314){if(this.disabled||!this.editing){return;}this._set("editing",false);setTimeout(lang.hitch(this,"onCancel"),0);this._showText(_314);},_setTextDirAttr:function(_315){if(!this._created||this.textDir!=_315){this._set("textDir",_315);this.applyTextDir(this.displayNode,this.displayNode.innerText);this.displayNode.align=this.dir=="rtl"?"right":"left";}}});_30b._InlineEditor=_303;return _30b;});},"dojo/selector/acme":function(){define("dojo/selector/acme",["../_base/kernel","../has","../dom","../_base/sniff","../_base/array","../_base/lang","../_base/window"],function(dojo,has,dom){var trim=dojo.trim;var each=dojo.forEach;var _316=function(){return dojo.doc;};var _317=((dojo.isWebKit||dojo.isMozilla)&&((_316().compatMode)=="BackCompat"));var _318=">~+";var _319=false;var _31a=function(){return true;};var _31b=function(_31c){if(_318.indexOf(_31c.slice(-1))>=0){_31c+=" * ";}else{_31c+=" ";}var ts=function(s,e){return trim(_31c.slice(s,e));};var _31d=[];var _31e=-1,_31f=-1,_320=-1,_321=-1,_322=-1,inId=-1,_323=-1,lc="",cc="",_324;var x=0,ql=_31c.length,_325=null,_326=null;var _327=function(){if(_323>=0){var tv=(_323==x)?null:ts(_323,x);_325[(_318.indexOf(tv)<0)?"tag":"oper"]=tv;_323=-1;}};var _328=function(){if(inId>=0){_325.id=ts(inId,x).replace(/\\/g,"");inId=-1;}};var _329=function(){if(_322>=0){_325.classes.push(ts(_322+1,x).replace(/\\/g,""));_322=-1;}};var _32a=function(){_328();_327();_329();};var _32b=function(){_32a();if(_321>=0){_325.pseudos.push({name:ts(_321+1,x)});}_325.loops=(_325.pseudos.length||_325.attrs.length||_325.classes.length);_325.oquery=_325.query=ts(_324,x);_325.otag=_325.tag=(_325["oper"])?null:(_325.tag||"*");if(_325.tag){_325.tag=_325.tag.toUpperCase();}if(_31d.length&&(_31d[_31d.length-1].oper)){_325.infixOper=_31d.pop();_325.query=_325.infixOper.query+" "+_325.query;}_31d.push(_325);_325=null;};for(;lc=cc,cc=_31c.charAt(x),x<ql;x++){if(lc=="\\"){continue;}if(!_325){_324=x;_325={query:null,pseudos:[],attrs:[],classes:[],tag:null,oper:null,id:null,getTag:function(){return (_319)?this.otag:this.tag;}};_323=x;}if(_31e>=0){if(cc=="]"){if(!_326.attr){_326.attr=ts(_31e+1,x);}else{_326.matchFor=ts((_320||_31e+1),x);}var cmf=_326.matchFor;if(cmf){if((cmf.charAt(0)=="\"")||(cmf.charAt(0)=="'")){_326.matchFor=cmf.slice(1,-1);}}_325.attrs.push(_326);_326=null;_31e=_320=-1;}else{if(cc=="="){var _32c=("|~^$*".indexOf(lc)>=0)?lc:"";_326.type=_32c+cc;_326.attr=ts(_31e+1,x-_32c.length);_320=x+1;}}}else{if(_31f>=0){if(cc==")"){if(_321>=0){_326.value=ts(_31f+1,x);}_321=_31f=-1;}}else{if(cc=="#"){_32a();inId=x+1;}else{if(cc=="."){_32a();_322=x;}else{if(cc==":"){_32a();_321=x;}else{if(cc=="["){_32a();_31e=x;_326={};}else{if(cc=="("){if(_321>=0){_326={name:ts(_321+1,x),value:null};_325.pseudos.push(_326);}_31f=x;}else{if((cc==" ")&&(lc!=cc)){_32b();}}}}}}}}}return _31d;};var _32d=function(_32e,_32f){if(!_32e){return _32f;}if(!_32f){return _32e;}return function(){return _32e.apply(window,arguments)&&_32f.apply(window,arguments);};};var _330=function(i,arr){var r=arr||[];if(i){r.push(i);}return r;};var _331=function(n){return (1==n.nodeType);};var _332="";var _333=function(elem,attr){if(!elem){return _332;}if(attr=="class"){return elem.className||_332;}if(attr=="for"){return elem.htmlFor||_332;}if(attr=="style"){return elem.style.cssText||_332;}return (_319?elem.getAttribute(attr):elem.getAttribute(attr,2))||_332;};var _334={"*=":function(attr,_335){return function(elem){return (_333(elem,attr).indexOf(_335)>=0);};},"^=":function(attr,_336){return function(elem){return (_333(elem,attr).indexOf(_336)==0);};},"$=":function(attr,_337){return function(elem){var ea=" "+_333(elem,attr);return (ea.lastIndexOf(_337)==(ea.length-_337.length));};},"~=":function(attr,_338){var tval=" "+_338+" ";return function(elem){var ea=" "+_333(elem,attr)+" ";return (ea.indexOf(tval)>=0);};},"|=":function(attr,_339){var _33a=_339+"-";return function(elem){var ea=_333(elem,attr);return ((ea==_339)||(ea.indexOf(_33a)==0));};},"=":function(attr,_33b){return function(elem){return (_333(elem,attr)==_33b);};}};var _33c=(typeof _316().firstChild.nextElementSibling=="undefined");var _33d=!_33c?"nextElementSibling":"nextSibling";var _33e=!_33c?"previousElementSibling":"previousSibling";var _33f=(_33c?_331:_31a);var _340=function(node){while(node=node[_33e]){if(_33f(node)){return false;}}return true;};var _341=function(node){while(node=node[_33d]){if(_33f(node)){return false;}}return true;};var _342=function(node){var root=node.parentNode;var i=0,tret=root.children||root.childNodes,ci=(node["_i"]||-1),cl=(root["_l"]||-1);if(!tret){return -1;}var l=tret.length;if(cl==l&&ci>=0&&cl>=0){return ci;}root["_l"]=l;ci=-1;for(var te=root["firstElementChild"]||root["firstChild"];te;te=te[_33d]){if(_33f(te)){te["_i"]=++i;if(node===te){ci=i;}}}return ci;};var _343=function(elem){return !((_342(elem))%2);};var _344=function(elem){return ((_342(elem))%2);};var _345={"checked":function(name,_346){return function(elem){return !!("checked" in elem?elem.checked:elem.selected);};},"first-child":function(){return _340;},"last-child":function(){return _341;},"only-child":function(name,_347){return function(node){return _340(node)&&_341(node);};},"empty":function(name,_348){return function(elem){var cn=elem.childNodes;var cnl=elem.childNodes.length;for(var x=cnl-1;x>=0;x--){var nt=cn[x].nodeType;if((nt===1)||(nt==3)){return false;}}return true;};},"contains":function(name,_349){var cz=_349.charAt(0);if(cz=="\""||cz=="'"){_349=_349.slice(1,-1);}return function(elem){return (elem.innerHTML.indexOf(_349)>=0);};},"not":function(name,_34a){var p=_31b(_34a)[0];var _34b={el:1};if(p.tag!="*"){_34b.tag=1;}if(!p.classes.length){_34b.classes=1;}var ntf=_34c(p,_34b);return function(elem){return (!ntf(elem));};},"nth-child":function(name,_34d){var pi=parseInt;if(_34d=="odd"){return _344;}else{if(_34d=="even"){return _343;}}if(_34d.indexOf("n")!=-1){var _34e=_34d.split("n",2);var pred=_34e[0]?((_34e[0]=="-")?-1:pi(_34e[0])):1;var idx=_34e[1]?pi(_34e[1]):0;var lb=0,ub=-1;if(pred>0){if(idx<0){idx=(idx%pred)&&(pred+(idx%pred));}else{if(idx>0){if(idx>=pred){lb=idx-idx%pred;}idx=idx%pred;}}}else{if(pred<0){pred*=-1;if(idx>0){ub=idx;idx=idx%pred;}}}if(pred>0){return function(elem){var i=_342(elem);return (i>=lb)&&(ub<0||i<=ub)&&((i%pred)==idx);};}else{_34d=idx;}}var _34f=pi(_34d);return function(elem){return (_342(elem)==_34f);};}};var _350=(dojo.isIE&&(dojo.isIE<9||dojo.isQuirks))?function(cond){var clc=cond.toLowerCase();if(clc=="class"){cond="className";}return function(elem){return (_319?elem.getAttribute(cond):elem[cond]||elem[clc]);};}:function(cond){return function(elem){return (elem&&elem.getAttribute&&elem.hasAttribute(cond));};};var _34c=function(_351,_352){if(!_351){return _31a;}_352=_352||{};var ff=null;if(!("el" in _352)){ff=_32d(ff,_331);}if(!("tag" in _352)){if(_351.tag!="*"){ff=_32d(ff,function(elem){return (elem&&(elem.tagName==_351.getTag()));});}}if(!("classes" in _352)){each(_351.classes,function(_353,idx,arr){var re=new RegExp("(?:^|\\s)"+_353+"(?:\\s|$)");ff=_32d(ff,function(elem){return re.test(elem.className);});ff.count=idx;});}if(!("pseudos" in _352)){each(_351.pseudos,function(_354){var pn=_354.name;if(_345[pn]){ff=_32d(ff,_345[pn](pn,_354.value));}});}if(!("attrs" in _352)){each(_351.attrs,function(attr){var _355;var a=attr.attr;if(attr.type&&_334[attr.type]){_355=_334[attr.type](a,attr.matchFor);}else{if(a.length){_355=_350(a);}}if(_355){ff=_32d(ff,_355);}});}if(!("id" in _352)){if(_351.id){ff=_32d(ff,function(elem){return (!!elem&&(elem.id==_351.id));});}}if(!ff){if(!("default" in _352)){ff=_31a;}}return ff;};var _356=function(_357){return function(node,ret,bag){while(node=node[_33d]){if(_33c&&(!_331(node))){continue;}if((!bag||_358(node,bag))&&_357(node)){ret.push(node);}break;}return ret;};};var _359=function(_35a){return function(root,ret,bag){var te=root[_33d];while(te){if(_33f(te)){if(bag&&!_358(te,bag)){break;}if(_35a(te)){ret.push(te);}}te=te[_33d];}return ret;};};var _35b=function(_35c){_35c=_35c||_31a;return function(root,ret,bag){var te,x=0,tret=root.children||root.childNodes;while(te=tret[x++]){if(_33f(te)&&(!bag||_358(te,bag))&&(_35c(te,x))){ret.push(te);}}return ret;};};var _35d=function(node,root){var pn=node.parentNode;while(pn){if(pn==root){break;}pn=pn.parentNode;}return !!pn;};var _35e={};var _35f=function(_360){var _361=_35e[_360.query];if(_361){return _361;}var io=_360.infixOper;var oper=(io?io.oper:"");var _362=_34c(_360,{el:1});var qt=_360.tag;var _363=("*"==qt);var ecs=_316()["getElementsByClassName"];if(!oper){if(_360.id){_362=(!_360.loops&&_363)?_31a:_34c(_360,{el:1,id:1});_361=function(root,arr){var te=dom.byId(_360.id,(root.ownerDocument||root));if(!te||!_362(te)){return;}if(9==root.nodeType){return _330(te,arr);}else{if(_35d(te,root)){return _330(te,arr);}}};}else{if(ecs&&/\{\s*\[native code\]\s*\}/.test(String(ecs))&&_360.classes.length&&!_317){_362=_34c(_360,{el:1,classes:1,id:1});var _364=_360.classes.join(" ");_361=function(root,arr,bag){var ret=_330(0,arr),te,x=0;var tret=root.getElementsByClassName(_364);while((te=tret[x++])){if(_362(te,root)&&_358(te,bag)){ret.push(te);}}return ret;};}else{if(!_363&&!_360.loops){_361=function(root,arr,bag){var ret=_330(0,arr),te,x=0;var tret=root.getElementsByTagName(_360.getTag());while((te=tret[x++])){if(_358(te,bag)){ret.push(te);}}return ret;};}else{_362=_34c(_360,{el:1,tag:1,id:1});_361=function(root,arr,bag){var ret=_330(0,arr),te,x=0;var tret=root.getElementsByTagName(_360.getTag());while((te=tret[x++])){if(_362(te,root)&&_358(te,bag)){ret.push(te);}}return ret;};}}}}else{var _365={el:1};if(_363){_365.tag=1;}_362=_34c(_360,_365);if("+"==oper){_361=_356(_362);}else{if("~"==oper){_361=_359(_362);}else{if(">"==oper){_361=_35b(_362);}}}}return _35e[_360.query]=_361;};var _366=function(root,_367){var _368=_330(root),qp,x,te,qpl=_367.length,bag,ret;for(var i=0;i<qpl;i++){ret=[];qp=_367[i];x=_368.length-1;if(x>0){bag={};ret.nozip=true;}var gef=_35f(qp);for(var j=0;(te=_368[j]);j++){gef(te,ret,bag);}if(!ret.length){break;}_368=ret;}return ret;};var _369={},_36a={};var _36b=function(_36c){var _36d=_31b(trim(_36c));if(_36d.length==1){var tef=_35f(_36d[0]);return function(root){var r=tef(root,[]);if(r){r.nozip=true;}return r;};}return function(root){return _366(root,_36d);};};var nua=navigator.userAgent;var wk="WebKit/";var _36e=(dojo.isWebKit&&(nua.indexOf(wk)>0)&&(parseFloat(nua.split(wk)[1])>528));var _36f=dojo.isIE?"commentStrip":"nozip";var qsa="querySelectorAll";var _370=(!!_316()[qsa]&&(!dojo.isSafari||(dojo.isSafari>3.1)||_36e));var _371=/n\+\d|([^ ])?([>~+])([^ =])?/g;var _372=function(_373,pre,ch,post){return ch?(pre?pre+" ":"")+ch+(post?" "+post:""):_373;};var _374=function(_375,_376){_375=_375.replace(_371,_372);if(_370){var _377=_36a[_375];if(_377&&!_376){return _377;}}var _378=_369[_375];if(_378){return _378;}var qcz=_375.charAt(0);var _379=(-1==_375.indexOf(" "));if((_375.indexOf("#")>=0)&&(_379)){_376=true;}var _37a=(_370&&(!_376)&&(_318.indexOf(qcz)==-1)&&(!dojo.isIE||(_375.indexOf(":")==-1))&&(!(_317&&(_375.indexOf(".")>=0)))&&(_375.indexOf(":contains")==-1)&&(_375.indexOf(":checked")==-1)&&(_375.indexOf("|=")==-1));if(_37a){var tq=(_318.indexOf(_375.charAt(_375.length-1))>=0)?(_375+" *"):_375;return _36a[_375]=function(root){try{if(!((9==root.nodeType)||_379)){throw "";}var r=root[qsa](tq);r[_36f]=true;return r;}catch(e){return _374(_375,true)(root);}};}else{var _37b=_375.split(/\s*,\s*/);return _369[_375]=((_37b.length<2)?_36b(_375):function(root){var _37c=0,ret=[],tp;while((tp=_37b[_37c++])){ret=ret.concat(_36b(tp)(root));}return ret;});}};var _37d=0;var _37e=dojo.isIE?function(node){if(_319){return (node.getAttribute("_uid")||node.setAttribute("_uid",++_37d)||_37d);}else{return node.uniqueID;}}:function(node){return (node._uid||(node._uid=++_37d));};var _358=function(node,bag){if(!bag){return 1;}var id=_37e(node);if(!bag[id]){return bag[id]=1;}return 0;};var _37f="_zipIdx";var _380=function(arr){if(arr&&arr.nozip){return arr;}var ret=[];if(!arr||!arr.length){return ret;}if(arr[0]){ret.push(arr[0]);}if(arr.length<2){return ret;}_37d++;if(dojo.isIE&&_319){var _381=_37d+"";arr[0].setAttribute(_37f,_381);for(var x=1,te;te=arr[x];x++){if(arr[x].getAttribute(_37f)!=_381){ret.push(te);}te.setAttribute(_37f,_381);}}else{if(dojo.isIE&&arr.commentStrip){try{for(var x=1,te;te=arr[x];x++){if(_331(te)){ret.push(te);}}}catch(e){}}else{if(arr[0]){arr[0][_37f]=_37d;}for(var x=1,te;te=arr[x];x++){if(arr[x][_37f]!=_37d){ret.push(te);}te[_37f]=_37d;}}}return ret;};var _382=function(_383,root){root=root||_316();var od=root.ownerDocument||root.documentElement;_319=(root.contentType&&root.contentType=="application/xml")||(dojo.isOpera&&(root.doctype||od.toString()=="[object XMLDocument]"))||(!!od)&&(dojo.isIE?od.xml:(root.xmlVersion||od.xmlVersion));var r=_374(_383)(root);if(r&&r.nozip){return r;}return _380(r);};_382.filter=function(_384,_385,root){var _386=[],_387=_31b(_385),_388=(_387.length==1&&!/[^\w#\.]/.test(_385))?_34c(_387[0]):function(node){return dojo.query(_385,root).indexOf(node)!=-1;};for(var x=0,te;te=_384[x];x++){if(_388(te)){_386.push(te);}}return _386;};return _382;});},"dojo/dnd/autoscroll":function(){define("dojo/dnd/autoscroll",["../main","../window"],function(dojo){dojo.getObject("dnd",true,dojo);dojo.dnd.getViewport=dojo.window.getBox;dojo.dnd.V_TRIGGER_AUTOSCROLL=32;dojo.dnd.H_TRIGGER_AUTOSCROLL=32;dojo.dnd.V_AUTOSCROLL_VALUE=16;dojo.dnd.H_AUTOSCROLL_VALUE=16;dojo.dnd.autoScroll=function(e){var v=dojo.window.getBox(),dx=0,dy=0;if(e.clientX<dojo.dnd.H_TRIGGER_AUTOSCROLL){dx=-dojo.dnd.H_AUTOSCROLL_VALUE;}else{if(e.clientX>v.w-dojo.dnd.H_TRIGGER_AUTOSCROLL){dx=dojo.dnd.H_AUTOSCROLL_VALUE;}}if(e.clientY<dojo.dnd.V_TRIGGER_AUTOSCROLL){dy=-dojo.dnd.V_AUTOSCROLL_VALUE;}else{if(e.clientY>v.h-dojo.dnd.V_TRIGGER_AUTOSCROLL){dy=dojo.dnd.V_AUTOSCROLL_VALUE;}}window.scrollBy(dx,dy);};dojo.dnd._validNodes={"div":1,"p":1,"td":1};dojo.dnd._validOverflow={"auto":1,"scroll":1};dojo.dnd.autoScrollNodes=function(e){var b,t,w,h,rx,ry,dx=0,dy=0,_389,_38a;for(var n=e.target;n;){if(n.nodeType==1&&(n.tagName.toLowerCase() in dojo.dnd._validNodes)){var s=dojo.getComputedStyle(n),_38b=(s.overflow.toLowerCase() in dojo.dnd._validOverflow),_38c=(s.overflowX.toLowerCase() in dojo.dnd._validOverflow),_38d=(s.overflowY.toLowerCase() in dojo.dnd._validOverflow);if(_38b||_38c||_38d){b=dojo._getContentBox(n,s);t=dojo.position(n,true);}if(_38b||_38c){w=Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL,b.w/2);rx=e.pageX-t.x;if(dojo.isWebKit||dojo.isOpera){rx+=dojo.body().scrollLeft;}dx=0;if(rx>0&&rx<b.w){if(rx<w){dx=-w;}else{if(rx>b.w-w){dx=w;}}_389=n.scrollLeft;n.scrollLeft=n.scrollLeft+dx;}}if(_38b||_38d){h=Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL,b.h/2);ry=e.pageY-t.y;if(dojo.isWebKit||dojo.isOpera){ry+=dojo.body().scrollTop;}dy=0;if(ry>0&&ry<b.h){if(ry<h){dy=-h;}else{if(ry>b.h-h){dy=h;}}_38a=n.scrollTop;n.scrollTop=n.scrollTop+dy;}}if(dx||dy){return;}}try{n=n.parentNode;}catch(x){n=null;}}dojo.dnd.autoScroll(e);};return dojo.dnd;});},"dojo/data/ItemFileWriteStore":function(){define("dojo/data/ItemFileWriteStore",["../_base/lang","../_base/declare","../_base/array","../_base/json","../_base/window","./ItemFileReadStore","../date/stamp"],function(lang,_38e,_38f,_390,_391,_392,_393){return _38e("dojo.data.ItemFileWriteStore",_392,{constructor:function(_394){this._features["dojo.data.api.Write"]=true;this._features["dojo.data.api.Notification"]=true;this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};if(!this._datatypeMap["Date"].serialize){this._datatypeMap["Date"].serialize=function(obj){return _393.toISOString(obj,{zulu:true});};}if(_394&&(_394.referenceIntegrity===false)){this.referenceIntegrity=false;}this._saveInProgress=false;},referenceIntegrity:true,_assert:function(_395){if(!_395){throw new Error("assertion failed in ItemFileWriteStore");}},_getIdentifierAttribute:function(){return this.getFeatures()["dojo.data.api.Identity"];},newItem:function(_396,_397){this._assert(!this._saveInProgress);if(!this._loadFinished){this._forceLoad();}if(typeof _396!="object"&&typeof _396!="undefined"){throw new Error("newItem() was passed something other than an object");}var _398=null;var _399=this._getIdentifierAttribute();if(_399===Number){_398=this._arrayOfAllItems.length;}else{_398=_396[_399];if(typeof _398==="undefined"){throw new Error("newItem() was not passed an identity for the new item");}if(lang.isArray(_398)){throw new Error("newItem() was not passed an single-valued identity");}}if(this._itemsByIdentity){this._assert(typeof this._itemsByIdentity[_398]==="undefined");}this._assert(typeof this._pending._newItems[_398]==="undefined");this._assert(typeof this._pending._deletedItems[_398]==="undefined");var _39a={};_39a[this._storeRefPropName]=this;_39a[this._itemNumPropName]=this._arrayOfAllItems.length;if(this._itemsByIdentity){this._itemsByIdentity[_398]=_39a;_39a[_399]=[_398];}this._arrayOfAllItems.push(_39a);var _39b=null;if(_397&&_397.parent&&_397.attribute){_39b={item:_397.parent,attribute:_397.attribute,oldValue:undefined};var _39c=this.getValues(_397.parent,_397.attribute);if(_39c&&_39c.length>0){var _39d=_39c.slice(0,_39c.length);if(_39c.length===1){_39b.oldValue=_39c[0];}else{_39b.oldValue=_39c.slice(0,_39c.length);}_39d.push(_39a);this._setValueOrValues(_397.parent,_397.attribute,_39d,false);_39b.newValue=this.getValues(_397.parent,_397.attribute);}else{this._setValueOrValues(_397.parent,_397.attribute,_39a,false);_39b.newValue=_39a;}}else{_39a[this._rootItemPropName]=true;this._arrayOfTopLevelItems.push(_39a);}this._pending._newItems[_398]=_39a;for(var key in _396){if(key===this._storeRefPropName||key===this._itemNumPropName){throw new Error("encountered bug in ItemFileWriteStore.newItem");}var _39e=_396[key];if(!lang.isArray(_39e)){_39e=[_39e];}_39a[key]=_39e;if(this.referenceIntegrity){for(var i=0;i<_39e.length;i++){var val=_39e[i];if(this.isItem(val)){this._addReferenceToMap(val,_39a,key);}}}}this.onNew(_39a,_39b);return _39a;},_removeArrayElement:function(_39f,_3a0){var _3a1=_38f.indexOf(_39f,_3a0);if(_3a1!=-1){_39f.splice(_3a1,1);return true;}return false;},deleteItem:function(item){this._assert(!this._saveInProgress);this._assertIsItem(item);var _3a2=item[this._itemNumPropName];var _3a3=this.getIdentity(item);if(this.referenceIntegrity){var _3a4=this.getAttributes(item);if(item[this._reverseRefMap]){item["backup_"+this._reverseRefMap]=lang.clone(item[this._reverseRefMap]);}_38f.forEach(_3a4,function(_3a5){_38f.forEach(this.getValues(item,_3a5),function(_3a6){if(this.isItem(_3a6)){if(!item["backupRefs_"+this._reverseRefMap]){item["backupRefs_"+this._reverseRefMap]=[];}item["backupRefs_"+this._reverseRefMap].push({id:this.getIdentity(_3a6),attr:_3a5});this._removeReferenceFromMap(_3a6,item,_3a5);}},this);},this);var _3a7=item[this._reverseRefMap];if(_3a7){for(var _3a8 in _3a7){var _3a9=null;if(this._itemsByIdentity){_3a9=this._itemsByIdentity[_3a8];}else{_3a9=this._arrayOfAllItems[_3a8];}if(_3a9){for(var _3aa in _3a7[_3a8]){var _3ab=this.getValues(_3a9,_3aa)||[];var _3ac=_38f.filter(_3ab,function(_3ad){return !(this.isItem(_3ad)&&this.getIdentity(_3ad)==_3a3);},this);this._removeReferenceFromMap(item,_3a9,_3aa);if(_3ac.length<_3ab.length){this._setValueOrValues(_3a9,_3aa,_3ac,true);}}}}}}this._arrayOfAllItems[_3a2]=null;item[this._storeRefPropName]=null;if(this._itemsByIdentity){delete this._itemsByIdentity[_3a3];}this._pending._deletedItems[_3a3]=item;if(item[this._rootItemPropName]){this._removeArrayElement(this._arrayOfTopLevelItems,item);}this.onDelete(item);return true;},setValue:function(item,_3ae,_3af){return this._setValueOrValues(item,_3ae,_3af,true);},setValues:function(item,_3b0,_3b1){return this._setValueOrValues(item,_3b0,_3b1,true);},unsetAttribute:function(item,_3b2){return this._setValueOrValues(item,_3b2,[],true);},_setValueOrValues:function(item,_3b3,_3b4,_3b5){this._assert(!this._saveInProgress);this._assertIsItem(item);this._assert(lang.isString(_3b3));this._assert(typeof _3b4!=="undefined");var _3b6=this._getIdentifierAttribute();if(_3b3==_3b6){throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier.");}var _3b7=this._getValueOrValues(item,_3b3);var _3b8=this.getIdentity(item);if(!this._pending._modifiedItems[_3b8]){var _3b9={};for(var key in item){if((key===this._storeRefPropName)||(key===this._itemNumPropName)||(key===this._rootItemPropName)){_3b9[key]=item[key];}else{if(key===this._reverseRefMap){_3b9[key]=lang.clone(item[key]);}else{_3b9[key]=item[key].slice(0,item[key].length);}}}this._pending._modifiedItems[_3b8]=_3b9;}var _3ba=false;if(lang.isArray(_3b4)&&_3b4.length===0){_3ba=delete item[_3b3];_3b4=undefined;if(this.referenceIntegrity&&_3b7){var _3bb=_3b7;if(!lang.isArray(_3bb)){_3bb=[_3bb];}for(var i=0;i<_3bb.length;i++){var _3bc=_3bb[i];if(this.isItem(_3bc)){this._removeReferenceFromMap(_3bc,item,_3b3);}}}}else{var _3bd;if(lang.isArray(_3b4)){_3bd=_3b4.slice(0,_3b4.length);}else{_3bd=[_3b4];}if(this.referenceIntegrity){if(_3b7){var _3bb=_3b7;if(!lang.isArray(_3bb)){_3bb=[_3bb];}var map={};_38f.forEach(_3bb,function(_3be){if(this.isItem(_3be)){var id=this.getIdentity(_3be);map[id.toString()]=true;}},this);_38f.forEach(_3bd,function(_3bf){if(this.isItem(_3bf)){var id=this.getIdentity(_3bf);if(map[id.toString()]){delete map[id.toString()];}else{this._addReferenceToMap(_3bf,item,_3b3);}}},this);for(var rId in map){var _3c0;if(this._itemsByIdentity){_3c0=this._itemsByIdentity[rId];}else{_3c0=this._arrayOfAllItems[rId];}this._removeReferenceFromMap(_3c0,item,_3b3);}}else{for(var i=0;i<_3bd.length;i++){var _3bc=_3bd[i];if(this.isItem(_3bc)){this._addReferenceToMap(_3bc,item,_3b3);}}}}item[_3b3]=_3bd;_3ba=true;}if(_3b5){this.onSet(item,_3b3,_3b7,_3b4);}return _3ba;},_addReferenceToMap:function(_3c1,_3c2,_3c3){var _3c4=this.getIdentity(_3c2);var _3c5=_3c1[this._reverseRefMap];if(!_3c5){_3c5=_3c1[this._reverseRefMap]={};}var _3c6=_3c5[_3c4];if(!_3c6){_3c6=_3c5[_3c4]={};}_3c6[_3c3]=true;},_removeReferenceFromMap:function(_3c7,_3c8,_3c9){var _3ca=this.getIdentity(_3c8);var _3cb=_3c7[this._reverseRefMap];var _3cc;if(_3cb){for(_3cc in _3cb){if(_3cc==_3ca){delete _3cb[_3cc][_3c9];if(this._isEmpty(_3cb[_3cc])){delete _3cb[_3cc];}}}if(this._isEmpty(_3cb)){delete _3c7[this._reverseRefMap];}}},_dumpReferenceMap:function(){var i;for(i=0;i<this._arrayOfAllItems.length;i++){var item=this._arrayOfAllItems[i];if(item&&item[this._reverseRefMap]){}}},_getValueOrValues:function(item,_3cd){var _3ce=undefined;if(this.hasAttribute(item,_3cd)){var _3cf=this.getValues(item,_3cd);if(_3cf.length==1){_3ce=_3cf[0];}else{_3ce=_3cf;}}return _3ce;},_flatten:function(_3d0){if(this.isItem(_3d0)){return {_reference:this.getIdentity(_3d0)};}else{if(typeof _3d0==="object"){for(var type in this._datatypeMap){var _3d1=this._datatypeMap[type];if(lang.isObject(_3d1)&&!lang.isFunction(_3d1)){if(_3d0 instanceof _3d1.type){if(!_3d1.serialize){throw new Error("ItemFileWriteStore: No serializer defined for type mapping: ["+type+"]");}return {_type:type,_value:_3d1.serialize(_3d0)};}}else{if(_3d0 instanceof _3d1){return {_type:type,_value:_3d0.toString()};}}}}return _3d0;}},_getNewFileContentString:function(){var _3d2={};var _3d3=this._getIdentifierAttribute();if(_3d3!==Number){_3d2.identifier=_3d3;}if(this._labelAttr){_3d2.label=this._labelAttr;}_3d2.items=[];for(var i=0;i<this._arrayOfAllItems.length;++i){var item=this._arrayOfAllItems[i];if(item!==null){var _3d4={};for(var key in item){if(key!==this._storeRefPropName&&key!==this._itemNumPropName&&key!==this._reverseRefMap&&key!==this._rootItemPropName){var _3d5=this.getValues(item,key);if(_3d5.length==1){_3d4[key]=this._flatten(_3d5[0]);}else{var _3d6=[];for(var j=0;j<_3d5.length;++j){_3d6.push(this._flatten(_3d5[j]));_3d4[key]=_3d6;}}}}_3d2.items.push(_3d4);}}var _3d7=true;return _390.toJson(_3d2,_3d7);},_isEmpty:function(_3d8){var _3d9=true;if(lang.isObject(_3d8)){var i;for(i in _3d8){_3d9=false;break;}}else{if(lang.isArray(_3d8)){if(_3d8.length>0){_3d9=false;}}}return _3d9;},save:function(_3da){this._assert(!this._saveInProgress);this._saveInProgress=true;var self=this;var _3db=function(){self._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};self._saveInProgress=false;if(_3da&&_3da.onComplete){var _3dc=_3da.scope||_391.global;_3da.onComplete.call(_3dc);}};var _3dd=function(err){self._saveInProgress=false;if(_3da&&_3da.onError){var _3de=_3da.scope||_391.global;_3da.onError.call(_3de,err);}};if(this._saveEverything){var _3df=this._getNewFileContentString();this._saveEverything(_3db,_3dd,_3df);}if(this._saveCustom){this._saveCustom(_3db,_3dd);}if(!this._saveEverything&&!this._saveCustom){_3db();}},revert:function(){this._assert(!this._saveInProgress);var _3e0;for(_3e0 in this._pending._modifiedItems){var _3e1=this._pending._modifiedItems[_3e0];var _3e2=null;if(this._itemsByIdentity){_3e2=this._itemsByIdentity[_3e0];}else{_3e2=this._arrayOfAllItems[_3e0];}_3e1[this._storeRefPropName]=this;for(var key in _3e2){delete _3e2[key];}lang.mixin(_3e2,_3e1);}var _3e3;for(_3e0 in this._pending._deletedItems){_3e3=this._pending._deletedItems[_3e0];_3e3[this._storeRefPropName]=this;var _3e4=_3e3[this._itemNumPropName];if(_3e3["backup_"+this._reverseRefMap]){_3e3[this._reverseRefMap]=_3e3["backup_"+this._reverseRefMap];delete _3e3["backup_"+this._reverseRefMap];}this._arrayOfAllItems[_3e4]=_3e3;if(this._itemsByIdentity){this._itemsByIdentity[_3e0]=_3e3;}if(_3e3[this._rootItemPropName]){this._arrayOfTopLevelItems.push(_3e3);}}for(_3e0 in this._pending._deletedItems){_3e3=this._pending._deletedItems[_3e0];if(_3e3["backupRefs_"+this._reverseRefMap]){_38f.forEach(_3e3["backupRefs_"+this._reverseRefMap],function(_3e5){var _3e6;if(this._itemsByIdentity){_3e6=this._itemsByIdentity[_3e5.id];}else{_3e6=this._arrayOfAllItems[_3e5.id];}this._addReferenceToMap(_3e6,_3e3,_3e5.attr);},this);delete _3e3["backupRefs_"+this._reverseRefMap];}}for(_3e0 in this._pending._newItems){var _3e7=this._pending._newItems[_3e0];_3e7[this._storeRefPropName]=null;this._arrayOfAllItems[_3e7[this._itemNumPropName]]=null;if(_3e7[this._rootItemPropName]){this._removeArrayElement(this._arrayOfTopLevelItems,_3e7);}if(this._itemsByIdentity){delete this._itemsByIdentity[_3e0];}}this._pending={_newItems:{},_modifiedItems:{},_deletedItems:{}};return true;},isDirty:function(item){if(item){var _3e8=this.getIdentity(item);return new Boolean(this._pending._newItems[_3e8]||this._pending._modifiedItems[_3e8]||this._pending._deletedItems[_3e8]).valueOf();}else{return !this._isEmpty(this._pending._newItems)||!this._isEmpty(this._pending._modifiedItems)||!this._isEmpty(this._pending._deletedItems);}},onSet:function(item,_3e9,_3ea,_3eb){},onNew:function(_3ec,_3ed){},onDelete:function(_3ee){},close:function(_3ef){if(this.clearOnClose){if(!this.isDirty()){this.inherited(arguments);}else{throw new Error("dojo.data.ItemFileWriteStore: There are unsaved changes present in the store. Please save or revert the changes before invoking close.");}}}});});},"dijit/form/_RadioButtonMixin":function(){define("dijit/form/_RadioButtonMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/_base/event","dojo/_base/lang","dojo/query","dojo/_base/window","../registry"],function(_3f0,_3f1,_3f2,_3f3,lang,_3f4,win,_3f5){return _3f1("dijit.form._RadioButtonMixin",null,{type:"radio",_getRelatedWidgets:function(){var ary=[];_3f4("input[type=radio]",this.focusNode.form||win.doc).forEach(lang.hitch(this,function(_3f6){if(_3f6.name==this.name&&_3f6.form==this.focusNode.form){var _3f7=_3f5.getEnclosingWidget(_3f6);if(_3f7){ary.push(_3f7);}}}));return ary;},_setCheckedAttr:function(_3f8){this.inherited(arguments);if(!this._created){return;}if(_3f8){_3f0.forEach(this._getRelatedWidgets(),lang.hitch(this,function(_3f9){if(_3f9!=this&&_3f9.checked){_3f9.set("checked",false);}}));}},_onClick:function(e){if(this.checked||this.disabled){_3f3.stop(e);return false;}if(this.readOnly){_3f3.stop(e);_3f0.forEach(this._getRelatedWidgets(),lang.hitch(this,function(_3fa){_3f2.set(this.focusNode||this.domNode,"checked",_3fa.checked);}));return false;}return this.inherited(arguments);}});});},"url:dijit/templates/TreeNode.html":"<div class=\"dijitTreeNode\" role=\"presentation\"\n\t><div data-dojo-attach-point=\"rowNode\" class=\"dijitTreeRow\" role=\"presentation\" data-dojo-attach-event=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\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\" data-dojo-attach-event=\"onfocus:_onLabelFocus\"></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","dojo/dnd/TimedMoveable":function(){define("dojo/dnd/TimedMoveable",["../main","./Moveable"],function(dojo){var _3fb=dojo.dnd.Moveable.prototype.onMove;dojo.declare("dojo.dnd.TimedMoveable",dojo.dnd.Moveable,{timeout:40,constructor:function(node,_3fc){if(!_3fc){_3fc={};}if(_3fc.timeout&&typeof _3fc.timeout=="number"&&_3fc.timeout>=0){this.timeout=_3fc.timeout;}},onMoveStop:function(_3fd){if(_3fd._timer){clearTimeout(_3fd._timer);_3fb.call(this,_3fd,_3fd._leftTop);}dojo.dnd.Moveable.prototype.onMoveStop.apply(this,arguments);},onMove:function(_3fe,_3ff){_3fe._leftTop=_3ff;if(!_3fe._timer){var _400=this;_3fe._timer=setTimeout(function(){_3fe._timer=null;_3fb.call(_400,_3fe,_3fe._leftTop);},this.timeout);}}});return dojo.dnd.TimedMoveable;});},"dojo/NodeList-fx":function(){define("dojo/NodeList-fx",["dojo/_base/NodeList","./_base/lang","./_base/connect","./_base/fx","./fx"],function(_401,lang,_402,_403,_404){lang.extend(_401,{_anim:function(obj,_405,args){args=args||{};var a=_404.combine(this.map(function(item){var _406={node:item};lang.mixin(_406,args);return obj[_405](_406);}));return args.auto?a.play()&&this:a;},wipeIn:function(args){return this._anim(_404,"wipeIn",args);},wipeOut:function(args){return this._anim(_404,"wipeOut",args);},slideTo:function(args){return this._anim(_404,"slideTo",args);},fadeIn:function(args){return this._anim(_403,"fadeIn",args);},fadeOut:function(args){return this._anim(_403,"fadeOut",args);},animateProperty:function(args){return this._anim(_403,"animateProperty",args);},anim:function(_407,_408,_409,_40a,_40b){var _40c=_404.combine(this.map(function(item){return _403.animateProperty({node:item,properties:_407,duration:_408||350,easing:_409});}));if(_40a){_402.connect(_40c,"onEnd",_40a);}return _40c.play(_40b||0);}});return _401;});},"dijit/form/_ListMouseMixin":function(){define("dijit/form/_ListMouseMixin",["dojo/_base/declare","dojo/_base/event","dojo/touch","./_ListBase"],function(_40d,_40e,_40f,_410){return _40d("dijit.form._ListMouseMixin",_410,{postCreate:function(){this.inherited(arguments);this.connect(this.domNode,_40f.press,"_onMouseDown");this.connect(this.domNode,_40f.release,"_onMouseUp");this.connect(this.domNode,"onmouseover","_onMouseOver");this.connect(this.domNode,"onmouseout","_onMouseOut");},_onMouseDown:function(evt){_40e.stop(evt);if(this._hoveredNode){this.onUnhover(this._hoveredNode);this._hoveredNode=null;}this._isDragging=true;this._setSelectedAttr(this._getTarget(evt));},_onMouseUp:function(evt){_40e.stop(evt);this._isDragging=false;var _411=this._getSelectedAttr();var _412=this._getTarget(evt);var _413=this._hoveredNode;if(_411&&_412==_411){this.onClick(_411);}else{if(_413&&_412==_413){this._setSelectedAttr(_413);this.onClick(_413);}}},_onMouseOut:function(){if(this._hoveredNode){this.onUnhover(this._hoveredNode);if(this._getSelectedAttr()==this._hoveredNode){this.onSelect(this._hoveredNode);}this._hoveredNode=null;}if(this._isDragging){this._cancelDrag=(new Date()).getTime()+1000;}},_onMouseOver:function(evt){if(this._cancelDrag){var time=(new Date()).getTime();if(time>this._cancelDrag){this._isDragging=false;}this._cancelDrag=null;}var node=this._getTarget(evt);if(!node){return;}if(this._hoveredNode!=node){if(this._hoveredNode){this._onMouseOut({target:this._hoveredNode});}if(node&&node.parentNode==this.containerNode){if(this._isDragging){this._setSelectedAttr(node);}else{this._hoveredNode=node;this.onHover(node);}}}}});});},"url:dijit/templates/Tree.html":"<div class=\"dijitTree dijitTreeContainer\" role=\"tree\"\n\tdata-dojo-attach-event=\"onkeypress:_onKeyPress\">\n\t<div class=\"dijitInline dijitTreeIndent\" style=\"position: absolute; top: -9999px\" data-dojo-attach-point=\"indentDetector\"></div>\n</div>\n","dojo/cookie":function(){define("dojo/cookie",["./_base/kernel","./regexp"],function(dojo,_414){dojo.cookie=function(name,_415,_416){var c=document.cookie,ret;if(arguments.length==1){var _417=c.match(new RegExp("(?:^|; )"+_414.escapeString(name)+"=([^;]*)"));ret=_417?decodeURIComponent(_417[1]):undefined;}else{_416=_416||{};var exp=_416.expires;if(typeof exp=="number"){var d=new Date();d.setTime(d.getTime()+exp*24*60*60*1000);exp=_416.expires=d;}if(exp&&exp.toUTCString){_416.expires=exp.toUTCString();}_415=encodeURIComponent(_415);var _418=name+"="+_415,_419;for(_419 in _416){_418+="; "+_419;var _41a=_416[_419];if(_41a!==true){_418+="="+_41a;}}document.cookie=_418;}return ret;};dojo.cookie.isSupported=function(){if(!("cookieEnabled" in navigator)){this("__djCookieTest__","CookiesAllowed");navigator.cookieEnabled=this("__djCookieTest__")=="CookiesAllowed";if(navigator.cookieEnabled){this("__djCookieTest__","",{expires:-1});}}return navigator.cookieEnabled;};return dojo.cookie;});},"dojo/cache":function(){define("dojo/cache",["./_base/kernel","./text"],function(dojo,text){return dojo.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=\"presentation\"\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","dijit/ProgressBar":function(){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","dojo/_base/declare","dojo/dom-class","dojo/_base/lang","dojo/number","./_Widget","./_TemplatedMixin","dojo/text!./templates/ProgressBar.html"],function(_41b,_41c,_41d,lang,_41e,_41f,_420,_421){return _41c("dijit.ProgressBar",[_41f,_420],{progress:"0",value:"",maximum:100,places:0,indeterminate:false,label:"",name:"",templateString:_421,_indeterminateHighContrastImagePath:_41b.toUrl("./themes/a11y/indeterminate_progress.gif"),postMixInProperties:function(){this.inherited(arguments);if(!("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(_422){lang.mixin(this,_422||{});var tip=this.internalProgress,ap=this.domNode;var _423=1;if(this.indeterminate){ap.removeAttribute("aria-valuenow");ap.removeAttribute("aria-valuemin");ap.removeAttribute("aria-valuemax");}else{if(String(this.progress).indexOf("%")!=-1){_423=Math.min(parseFloat(this.progress)/100,1);this.progress=_423*this.maximum;}else{this.progress=Math.min(this.progress,this.maximum);_423=this.maximum?this.progress/this.maximum:0;}ap.setAttribute("aria-describedby",this.labelNode.id);ap.setAttribute("aria-valuenow",this.progress);ap.setAttribute("aria-valuemin",0);ap.setAttribute("aria-valuemax",this.maximum);}this.labelNode.innerHTML=this.report(_423);_41d.toggle(this.domNode,"dijitProgressBarIndeterminate",this.indeterminate);tip.style.width=(_423*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(_424){this._set("label",_424);this.update();},_setIndeterminateAttr:function(_425){this.indeterminate=_425;this.update();},report:function(_426){return this.label?this.label:(this.indeterminate?" ":_41e.format(_426,{type:"percent",places:this.places,locale:this.lang}));},onChange:function(){}});});},"dijit/_base/popup":function(){define("dijit/_base/popup",["dojo/dom-class","../popup","../BackgroundIframe"],function(_427,_428){var _429=_428._createWrapper;_428._createWrapper=function(_42a){if(!_42a.declaredClass){_42a={_popupWrapper:(_42a.parentNode&&_427.contains(_42a.parentNode,"dijitPopup"))?_42a.parentNode:null,domNode:_42a,destroy:function(){}};}return _429.call(this,_42a);};var _42b=_428.open;_428.open=function(args){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 _42b.call(this,args);};return _428;});},"dijit/ColorPalette":function(){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","dojo/text!./templates/ColorPalette.html","./_Widget","./_TemplatedMixin","./_PaletteMixin","dojo/i18n","dojo/_base/Color","dojo/_base/declare","dojo/dom-class","dojo/dom-construct","dojo/_base/window","dojo/string","dojo/i18n!dojo/nls/colors","dojo/colors"],function(_42c,_42d,_42e,_42f,_430,i18n,_431,_432,_433,_434,win,_435){var _436=_432("dijit.ColorPalette",[_42e,_42f,_430],{palette:"7x10",_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:_42d,baseClass:"dijitColorPalette",_dyeFactory:function(_437,row,col){return new this._dyeClass(_437,row,col);},buildRendering:function(){this.inherited(arguments);this._dyeClass=_432(_436._Color,{hc:_433.contains(win.body(),"dijit_a11y"),palette:this.palette});this._preparePalette(this._palettes[this.palette],i18n.getLocalization("dojo","colors",this.lang));}});_436._Color=_432("dijit._Color",_431,{template:"<span class='dijitInline dijitPaletteImg'>"+"<img src='${blankGif}' alt='${alt}' class='dijitColorPaletteSwatch' style='background-color: ${color}'/>"+"</span>",hcTemplate:"<span class='dijitInline dijitPaletteImg' style='position: relative; overflow: hidden; height: 12px; width: 14px;'>"+"<img src='${image}' alt='${alt}' style='position: absolute; left: ${left}px; top: ${top}px; ${size}'/>"+"</span>",_imagePaths:{"7x10":_42c.toUrl("./themes/a11y/colors7x10.png"),"3x4":_42c.toUrl("./themes/a11y/colors3x4.png")},constructor:function(_438,row,col){this._alias=_438;this._row=row;this._col=col;this.setColor(_431.named[_438]);},getValue:function(){return this.toHex();},fillCell:function(cell,_439){var html=_435.substitute(this.hc?this.hcTemplate:this.template,{color:this.toHex(),blankGif:_439,alt:this._alias,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"});_434.place(html,cell);}});return _436;});},"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","dojo/_base/url":function(){define("dojo/_base/url",["./kernel"],function(dojo){var ore=new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"),ire=new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"),_43a=function(){var n=null,_43b=arguments,uri=[_43b[0]];for(var i=1;i<_43b.length;i++){if(!_43b[i]){continue;}var _43c=new _43a(_43b[i]+""),_43d=new _43a(uri[0]+"");if(_43c.path==""&&!_43c.scheme&&!_43c.authority&&!_43c.query){if(_43c.fragment!=n){_43d.fragment=_43c.fragment;}_43c=_43d;}else{if(!_43c.scheme){_43c.scheme=_43d.scheme;if(!_43c.authority){_43c.authority=_43d.authority;if(_43c.path.charAt(0)!="/"){var path=_43d.path.substring(0,_43d.path.lastIndexOf("/")+1)+_43c.path;var segs=path.split("/");for(var j=0;j<segs.length;j++){if(segs[j]=="."){if(j==segs.length-1){segs[j]="";}else{segs.splice(j,1);j--;}}else{if(j>0&&!(j==1&&segs[0]=="")&&segs[j]==".."&&segs[j-1]!=".."){if(j==(segs.length-1)){segs.splice(j,1);segs[j-1]="";}else{segs.splice(j-1,2);j-=2;}}}}_43c.path=segs.join("/");}}}}uri=[];if(_43c.scheme){uri.push(_43c.scheme,":");}if(_43c.authority){uri.push("//",_43c.authority);}uri.push(_43c.path);if(_43c.query){uri.push("?",_43c.query);}if(_43c.fragment){uri.push("#",_43c.fragment);}}this.uri=uri.join("");var r=this.uri.match(ore);this.scheme=r[2]||(r[1]?"":n);this.authority=r[4]||(r[3]?"":n);this.path=r[5];this.query=r[7]||(r[6]?"":n);this.fragment=r[9]||(r[8]?"":n);if(this.authority!=n){r=this.authority.match(ire);this.user=r[3]||n;this.password=r[4]||n;this.host=r[6]||r[7];this.port=r[9]||n;}};_43a.prototype.toString=function(){return this.uri;};return dojo._Url=_43a;});},"dojo/text":function(){define("dojo/text",["./_base/kernel","require","./has","./_base/xhr"],function(dojo,_43e,has,xhr){var _43f;if(1){_43f=function(url,sync,load){xhr("GET",{url:url,sync:!!sync,load:load});};}else{if(_43e.getText){_43f=_43e.getText;}else{console.error("dojo/text plugin failed to load because loader does not support getText");}}var _440={},_441=function(text){if(text){text=text.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im,"");var _442=text.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_442){text=_442[1];}}else{text="";}return text;},_443={},_444={},_445={dynamic:true,normalize:function(id,_446){var _447=id.split("!"),url=_447[0];return (/^\./.test(url)?_446(url):url)+(_447[1]?"!"+_447[1]:"");},load:function(id,_448,load){var _449=id.split("!"),_44a=_449.length>1,_44b=_449[0],url=_448.toUrl(_449[0]),text=_443,_44c=function(text){load(_44a?_441(text):text);};if(_44b in _440){text=_440[_44b];}else{if(url in _448.cache){text=_448.cache[url];}else{if(url in _440){text=_440[url];}}}if(text===_443){if(_444[url]){_444[url].push(_44c);}else{var _44d=_444[url]=[_44c];_43f(url,!_448.async,function(text){_440[_44b]=_440[url]=text;for(var i=0;i<_44d.length;){_44d[i++](text);}delete _444[url];});}}else{_44c(text);}}};dojo.cache=function(_44e,url,_44f){var key;if(typeof _44e=="string"){if(/\//.test(_44e)){key=_44e;_44f=url;}else{key=_43e.toUrl(_44e.replace(/\./g,"/")+(url?("/"+url):""));}}else{key=_44e+"";_44f=url;}var val=(_44f!=undefined&&typeof _44f!="string")?_44f.value:_44f,_450=_44f&&_44f.sanitize;if(typeof val=="string"){_440[key]=val;return _450?_441(val):val;}else{if(val===null){delete _440[key];return null;}else{if(!(key in _440)){_43f(key,true,function(text){_440[key]=text;});}return _450?_441(_440[key]):_440[key];}}};return _445;});},"url:dijit/templates/MenuItem.html":"<tr class=\"dijitReset dijitMenuItem\" data-dojo-attach-point=\"focusNode\" role=\"menuitem\" tabIndex=\"-1\"\n\t\tdata-dojo-attach-event=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\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","url:dijit/form/templates/CheckBox.html":"<div class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><input\n\t \t${!nameAttrSetting} type=\"${type}\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdata-dojo-attach-point=\"focusNode\"\n\t \tdata-dojo-attach-event=\"onclick:_onClick\"\n/></div>\n","dojo/uacss":function(){define("dojo/uacss",["./dom-geometry","./_base/lang","./ready","./_base/sniff","./_base/window"],function(_451,lang,_452,has,_453){var html=_453.doc.documentElement,ie=has("ie"),_454=has("opera"),maj=Math.floor,ff=has("ff"),_455=_451.boxModel.replace(/-/,""),_456={"dj_ie":ie,"dj_ie6":maj(ie)==6,"dj_ie7":maj(ie)==7,"dj_ie8":maj(ie)==8,"dj_ie9":maj(ie)==9,"dj_quirks":has("quirks"),"dj_iequirks":ie&&has("quirks"),"dj_opera":_454,"dj_khtml":has("khtml"),"dj_webkit":has("webkit"),"dj_safari":has("safari"),"dj_chrome":has("chrome"),"dj_gecko":has("mozilla"),"dj_ff3":maj(ff)==3};_456["dj_"+_455]=true;var _457="";for(var clz in _456){if(_456[clz]){_457+=clz+" ";}}html.className=lang.trim(html.className+" "+_457);_452(90,function(){if(!_451.isBodyLtr()){var _458="dj_rtl dijitRtl "+_457.replace(/ /g,"-rtl ");html.className=lang.trim(html.className+" "+_458+"dj_rtl dijitRtl "+_457.replace(/ /g,"-rtl "));}});return has;});},"dijit/Tooltip":function(){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","dojo/_base/declare","dojo/_base/fx","dojo/dom","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/lang","dojo/_base/sniff","dojo/_base/window","./_base/manager","./place","./_Widget","./_TemplatedMixin","./BackgroundIframe","dojo/text!./templates/Tooltip.html","."],function(_459,_45a,fx,dom,_45b,_45c,_45d,lang,has,win,_45e,_45f,_460,_461,_462,_463,_464){var _465=_45a("dijit._MasterTooltip",[_460,_461],{duration:_45e.defaultDuration,templateString:_463,postCreate:function(){win.body().appendChild(this.domNode);this.bgIframe=new _462(this.domNode);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(_466,_467,_468,rtl,_469){if(this.aroundNode&&this.aroundNode===_467&&this.containerNode.innerHTML==_466){return;}this.domNode.width="auto";if(this.fadeOut.status()=="playing"){this._onDeck=arguments;return;}this.containerNode.innerHTML=_466;this.set("textDir",_469);this.containerNode.align=rtl?"right":"left";var pos=_45f.around(this.domNode,_467,_468&&_468.length?_468:_46a.defaultPosition,!rtl,lang.hitch(this,"orient"));var _46b=pos.aroundNodePos;if(pos.corner.charAt(0)=="M"&&pos.aroundCorner.charAt(0)=="M"){this.connectorNode.style.top=_46b.y+((_46b.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=_46b.x+((_46b.w-this.connectorNode.offsetWidth)>>1)-pos.x+"px";}}_45d.set(this.domNode,"opacity",0);this.fadeIn.play();this.isShowingNow=true;this.aroundNode=_467;},orient:function(node,_46c,_46d,_46e,_46f){this.connectorNode.style.top="";var _470=_46e.w-this.connectorNode.offsetWidth;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"}[_46c+"-"+_46d];this.domNode.style.width="auto";var size=_45c.getContentBox(this.domNode);var _471=Math.min((Math.max(_470,1)),size.w);var _472=_471<size.w;this.domNode.style.width=_471+"px";if(_472){this.containerNode.style.overflow="auto";var _473=this.containerNode.scrollWidth;this.containerNode.style.overflow="visible";if(_473>_471){_473=_473+_45d.get(this.domNode,"paddingLeft")+_45d.get(this.domNode,"paddingRight");this.domNode.style.width=_473+"px";}}if(_46d.charAt(0)=="B"&&_46c.charAt(0)=="B"){var mb=_45c.getMarginBox(node);var _474=this.connectorNode.offsetHeight;if(mb.h>_46e.h){var _475=_46e.h-((_46f.h+_474)>>1);this.connectorNode.style.top=_475+"px";this.connectorNode.style.bottom="";}else{this.connectorNode.style.bottom=Math.min(Math.max(_46f.h/2-_474/2,0),mb.h-_474)+"px";this.connectorNode.style.top="";}}else{this.connectorNode.style.top="";this.connectorNode.style.bottom="";}return Math.max(0,size.w-_470);},_onShow:function(){if(has("ie")){this.domNode.style.filter="";}},hide:function(_476){if(this._onDeck&&this._onDeck[1]==_476){this._onDeck=null;}else{if(this.aroundNode===_476){this.fadeIn.stop();this.isShowingNow=false;this.aroundNode=null;this.fadeOut.play();}else{}}},_onHide:function(){this.domNode.style.cssText="";this.containerNode.innerHTML="";if(this._onDeck){this.show.apply(this,this._onDeck);this._onDeck=null;}},_setAutoTextDir:function(node){this.applyTextDir(node,has("ie")?node.outerText:node.textContent);_459.forEach(node.children,function(_477){this._setAutoTextDir(_477);},this);},_setTextDirAttr:function(_478){this._set("textDir",typeof _478!="undefined"?_478:"");if(_478=="auto"){this._setAutoTextDir(this.containerNode);}else{this.containerNode.dir=this.textDir;}}});_464.showTooltip=function(_479,_47a,_47b,rtl,_47c){if(_47b){_47b=_459.map(_47b,function(val){return {after:"after-centered",before:"before-centered"}[val]||val;});}if(!_46a._masterTT){_464._masterTT=_46a._masterTT=new _465();}return _46a._masterTT.show(_479,_47a,_47b,rtl,_47c);};_464.hideTooltip=function(_47d){return _46a._masterTT&&_46a._masterTT.hide(_47d);};var _46a=_45a("dijit.Tooltip",_460,{label:"",showDelay:400,connectId:[],position:[],_setConnectIdAttr:function(_47e){_459.forEach(this._connections||[],function(_47f){_459.forEach(_47f,lang.hitch(this,"disconnect"));},this);this._connectIds=_459.filter(lang.isArrayLike(_47e)?_47e:(_47e?[_47e]:[]),function(id){return dom.byId(id);});this._connections=_459.map(this._connectIds,function(id){var node=dom.byId(id);return [this.connect(node,"onmouseenter","_onHover"),this.connect(node,"onmouseleave","_onUnHover"),this.connect(node,"onfocus","_onHover"),this.connect(node,"onblur","_onUnHover")];},this);this._set("connectId",_47e);},addTarget:function(node){var id=node.id||node;if(_459.indexOf(this._connectIds,id)==-1){this.set("connectId",this._connectIds.concat(id));}},removeTarget:function(node){var id=node.id||node,idx=_459.indexOf(this._connectIds,id);if(idx>=0){this._connectIds.splice(idx,1);this.set("connectId",this._connectIds);}},buildRendering:function(){this.inherited(arguments);_45b.add(this.domNode,"dijitTooltipData");},startup:function(){this.inherited(arguments);var ids=this.connectId;_459.forEach(lang.isArrayLike(ids)?ids:[ids],this.addTarget,this);},_onHover:function(e){if(!this._showTimer){var _480=e.target;this._showTimer=setTimeout(lang.hitch(this,function(){this.open(_480);}),this.showDelay);}},_onUnHover:function(){if(this._focus){return;}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}this.close();},open:function(_481){if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}_46a.show(this.label||this.domNode.innerHTML,_481,this.position,!this.isLeftToRight(),this.textDir);this._connectNode=_481;this.onShow(_481,this.position);},close:function(){if(this._connectNode){_46a.hide(this._connectNode);delete this._connectNode;this.onHide();}if(this._showTimer){clearTimeout(this._showTimer);delete this._showTimer;}},onShow:function(){},onHide:function(){},uninitialize:function(){this.close();this.inherited(arguments);}});_46a._MasterTooltip=_465;_46a.show=_464.showTooltip;_46a.hide=_464.hideTooltip;_46a.defaultPosition=["after-centered","before-centered"];return _46a;});},"dojo/string":function(){define("dojo/string",["./_base/kernel","./_base/lang"],function(dojo,lang){lang.getObject("string",true,dojo);dojo.string.rep=function(str,num){if(num<=0||!str){return "";}var buf=[];for(;;){if(num&1){buf.push(str);}if(!(num>>=1)){break;}str+=str;}return buf.join("");};dojo.string.pad=function(text,size,ch,end){if(!ch){ch="0";}var out=String(text),pad=dojo.string.rep(ch,Math.ceil((size-out.length)/ch.length));return end?out+pad:pad+out;};dojo.string.substitute=function(_482,map,_483,_484){_484=_484||dojo.global;_483=_483?lang.hitch(_484,_483):function(v){return v;};return _482.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g,function(_485,key,_486){var _487=lang.getObject(key,false,map);if(_486){_487=lang.getObject(_486,false,_484).call(_484,_487,key);}return _483(_487,key).toString();});};dojo.string.trim=String.prototype.trim?lang.trim:function(str){str=str.replace(/^\s+/,"");for(var i=str.length-1;i>=0;i--){if(/\S/.test(str.charAt(i))){str=str.substring(0,i+1);break;}}return str;};return dojo.string;});},"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>","dijit/dijit":function(){define("dijit/dijit",[".","./_base","dojo/parser","./_Widget","./_TemplatedMixin","./_Container","./layout/_LayoutWidget","./form/_FormWidget","./form/_FormValueWidget"],function(_488){return _488;});},"dijit/form/DropDownButton":function(){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\"\n/></span>\n"}});define("dijit/form/DropDownButton",["dojo/_base/declare","dojo/_base/lang","dojo/query","../registry","../popup","./Button","../_Container","../_HasDropDown","dojo/text!./templates/DropDownButton.html"],function(_489,lang,_48a,_48b,_48c,_48d,_48e,_48f,_490){return _489("dijit.form.DropDownButton",[_48d,_48e,_48f],{baseClass:"dijitDropDownButton",templateString:_490,_fillContent:function(){if(this.srcNodeRef){var _491=_48a("*",this.srcNodeRef);this.inherited(arguments,[_491[0]]);this.dropDownContainer=this.srcNodeRef;}},startup:function(){if(this._started){return;}if(!this.dropDown&&this.dropDownContainer){var _492=_48a("[widgetId]",this.dropDownContainer)[0];this.dropDown=_48b.byNode(_492);delete this.dropDownContainer;}if(this.dropDown){_48c.hide(this.dropDown);}this.inherited(arguments);},isLoaded:function(){var _493=this.dropDown;return (!!_493&&(!_493.href||_493.isLoaded));},loadDropDown:function(_494){var _495=this.dropDown;var _496=_495.on("load",lang.hitch(this,function(){_496.remove();_494();}));_495.refresh();},isFocusable:function(){return this.inherited(arguments)&&!this._mouseDown;}});});},"dijit/form/_FormValueMixin":function(){define("dijit/form/_FormValueMixin",["dojo/_base/declare","dojo/dom-attr","dojo/keys","dojo/_base/sniff","./_FormWidgetMixin"],function(_497,_498,keys,has,_499){return _497("dijit.form._FormValueMixin",_499,{readOnly:false,_setReadOnlyAttr:function(_49a){_498.set(this.focusNode,"readOnly",_49a);this.focusNode.setAttribute("aria-readonly",_49a);this._set("readOnly",_49a);},postCreate:function(){this.inherited(arguments);if(has("ie")){this.connect(this.focusNode||this.domNode,"onkeydown",this._onKeyDown);}if(this._resetValue===undefined){this._lastValueReported=this._resetValue=this.value;}},_setValueAttr:function(_49b,_49c){this._handleOnChange(_49b,_49c);},_handleOnChange:function(_49d,_49e){this._set("value",_49d);this.inherited(arguments);},undo:function(){this._setValueAttr(this._lastValueReported,false);},reset:function(){this._hasBeenBlurred=false;this._setValueAttr(this._resetValue,true);},_onKeyDown:function(e){if(e.keyCode==keys.ESCAPE&&!(e.ctrlKey||e.altKey||e.metaKey)){var te;if(has("ie")<9||(has("ie")&&has("quirks"))){e.preventDefault();te=document.createEventObject();te.keyCode=keys.ESCAPE;te.shiftKey=e.shiftKey;e.srcElement.fireEvent("onkeypress",te);}}}});});},"dijit/form/_FormWidgetMixin":function(){define("dijit/form/_FormWidgetMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-style","dojo/_base/lang","dojo/mouse","dojo/_base/sniff","dojo/_base/window","dojo/window","../a11y"],function(_49f,_4a0,_4a1,_4a2,lang,_4a3,has,win,_4a4,a11y){return _4a0("dijit.form._FormWidgetMixin",null,{name:"",alt:"",value:"",type:"text",tabIndex:"0",_setTabIndexAttr:"focusNode",disabled:false,intermediateChanges:false,scrollOnFocus:true,_setIdAttr:"focusNode",_setDisabledAttr:function(_4a5){this._set("disabled",_4a5);_4a1.set(this.focusNode,"disabled",_4a5);if(this.valueNode){_4a1.set(this.valueNode,"disabled",_4a5);}this.focusNode.setAttribute("aria-disabled",_4a5?"true":"false");if(_4a5){this._set("hovering",false);this._set("active",false);var _4a6="tabIndex" in this.attributeMap?this.attributeMap.tabIndex:("_setTabIndexAttr" in this)?this._setTabIndexAttr:"focusNode";_49f.forEach(lang.isArray(_4a6)?_4a6:[_4a6],function(_4a7){var node=this[_4a7];if(has("webkit")||a11y.hasDefaultTabStop(node)){node.setAttribute("tabIndex","-1");}else{node.removeAttribute("tabIndex");}},this);}else{if(this.tabIndex!=""){this.set("tabIndex",this.tabIndex);}}},_onFocus:function(by){if(by=="mouse"&&this.isFocusable()){var _4a8=this.connect(this.focusNode,"onfocus",function(){this.disconnect(_4a9);this.disconnect(_4a8);});var _4a9=this.connect(win.body(),"onmouseup",function(){this.disconnect(_4a9);this.disconnect(_4a8);if(this.focused){this.focus();}});}if(this.scrollOnFocus){this.defer(function(){_4a4.scrollIntoView(this.domNode);});}this.inherited(arguments);},isFocusable:function(){return !this.disabled&&this.focusNode&&(_4a2.get(this.domNode,"display")!="none");},focus:function(){if(!this.disabled&&this.focusNode.focus){try{this.focusNode.focus();}catch(e){}}},compare:function(val1,val2){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(){},_onChangeActive:false,_handleOnChange:function(_4aa,_4ab){if(this._lastValueReported==undefined&&(_4ab===null||!this._onChangeActive)){this._resetValue=this._lastValueReported=_4aa;}this._pendingOnChange=this._pendingOnChange||(typeof _4aa!=typeof this._lastValueReported)||(this.compare(_4aa,this._lastValueReported)!=0);if((this.intermediateChanges||_4ab||_4ab===undefined)&&this._pendingOnChange){this._lastValueReported=_4aa;this._pendingOnChange=false;if(this._onChangeActive){if(this._onChangeHandle){this._onChangeHandle.remove();}this._onChangeHandle=this.defer(function(){this._onChangeHandle=null;this.onChange(_4aa);});}}},create:function(){this.inherited(arguments);this._onChangeActive=true;},destroy:function(){if(this._onChangeHandle){this._onChangeHandle.remove();this.onChange(this._lastValueReported);}this.inherited(arguments);}});});},"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","dijit/layout/_ContentPaneResizeMixin":function(){define("dijit/layout/_ContentPaneResizeMixin",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-class","dojo/dom-geometry","dojo/_base/lang","dojo/query","dojo/_base/sniff","dojo/_base/window","../registry","./utils","../_Contained"],function(_4ac,_4ad,_4ae,_4af,_4b0,lang,_4b1,has,win,_4b2,_4b3,_4b4){return _4ad("dijit.layout._ContentPaneResizeMixin",null,{doLayout:true,isLayoutContainer:true,startup:function(){if(this._started){return;}var _4b5=this.getParent();this._childOfLayoutWidget=_4b5&&_4b5.isLayoutContainer;this._needLayout=!this._childOfLayoutWidget;this.inherited(arguments);if(this._isShown()){this._onShow();}if(!this._childOfLayoutWidget){this.connect(has("ie")?this.domNode:win.global,"onresize",function(){this._needLayout=!this._childOfLayoutWidget;this.resize();});}},_checkIfSingleChild:function(){var _4b6=_4b1("> *",this.containerNode).filter(function(node){return node.tagName!=="SCRIPT";}),_4b7=_4b6.filter(function(node){return _4ae.has(node,"data-dojo-type")||_4ae.has(node,"dojoType")||_4ae.has(node,"widgetId");}),_4b8=_4ac.filter(_4b7.map(_4b2.byNode),function(_4b9){return _4b9&&_4b9.domNode&&_4b9.resize;});if(_4b6.length==_4b7.length&&_4b8.length==1){this._singleChild=_4b8[0];}else{delete this._singleChild;}_4af.toggle(this.containerNode,this.baseClass+"SingleChild",!!this._singleChild);},resize:function(_4ba,_4bb){if(!this._wasShown&&this.open!==false){this._onShow();}this._resizeCalled=true;this._scheduleLayout(_4ba,_4bb);},_scheduleLayout:function(_4bc,_4bd){if(this._isShown()){this._layout(_4bc,_4bd);}else{this._needLayout=true;this._changeSize=_4bc;this._resultSize=_4bd;}},_layout:function(_4be,_4bf){if(_4be){_4b0.setMarginBox(this.domNode,_4be);}var cn=this.containerNode;if(cn===this.domNode){var mb=_4bf||{};lang.mixin(mb,_4be||{});if(!("h" in mb)||!("w" in mb)){mb=lang.mixin(_4b0.getMarginBox(cn),mb);}this._contentBox=_4b3.marginBox2contentBox(cn,mb);}else{this._contentBox=_4b0.getContentBox(cn);}this._layoutChildren();delete this._needLayout;},_layoutChildren:function(){if(this.doLayout){this._checkIfSingleChild();}if(this._singleChild&&this._singleChild.resize){var cb=this._contentBox||_4b0.getContentBox(this.containerNode);this._singleChild.resize({w:cb.w,h:cb.h});}else{_4ac.forEach(this.getChildren(),function(_4c0){if(_4c0.resize){_4c0.resize();}});}},_isShown:function(){if(this._childOfLayoutWidget){if(this._resizeCalled&&"open" in this){return this.open;}return this._resizeCalled;}else{if("open" in this){return this.open;}else{var node=this.domNode,_4c1=this.domNode.parentNode;return (node.style.display!="none")&&(node.style.visibility!="hidden")&&!_4af.contains(node,"dijitHidden")&&_4c1&&_4c1.style&&(_4c1.style.display!="none");}}},_onShow:function(){if(this._needLayout){this._layout(this._changeSize,this._resultSize);}this.inherited(arguments);this._wasShown=true;}});});},"dijit/WidgetSet":function(){define("dijit/WidgetSet",["dojo/_base/array","dojo/_base/declare","dojo/_base/window","./registry"],function(_4c2,_4c3,win,_4c4){var _4c5=_4c3("dijit.WidgetSet",null,{constructor:function(){this._hash={};this.length=0;},add:function(_4c6){if(this._hash[_4c6.id]){throw new Error("Tried to register widget with id=="+_4c6.id+" but that id is already registered");}this._hash[_4c6.id]=_4c6;this.length++;},remove:function(id){if(this._hash[id]){delete this._hash[id];this.length--;}},forEach:function(func,_4c7){_4c7=_4c7||win.global;var i=0,id;for(id in this._hash){func.call(_4c7,this._hash[id],i++,this._hash);}return this;},filter:function(_4c8,_4c9){_4c9=_4c9||win.global;var res=new _4c5(),i=0,id;for(id in this._hash){var w=this._hash[id];if(_4c8.call(_4c9,w,i++,this._hash)){res.add(w);}}return res;},byId:function(id){return this._hash[id];},byClass:function(cls){var res=new _4c5(),id,_4ca;for(id in this._hash){_4ca=this._hash[id];if(_4ca.declaredClass==cls){res.add(_4ca);}}return res;},toArray:function(){var ar=[];for(var id in this._hash){ar.push(this._hash[id]);}return ar;},map:function(func,_4cb){return _4c2.map(this.toArray(),func,_4cb);},every:function(func,_4cc){_4cc=_4cc||win.global;var x=0,i;for(i in this._hash){if(!func.call(_4cc,this._hash[i],x++,this._hash)){return false;}}return true;},some:function(func,_4cd){_4cd=_4cd||win.global;var x=0,i;for(i in this._hash){if(func.call(_4cd,this._hash[i],x++,this._hash)){return true;}}return false;}});_4c2.forEach(["forEach","filter","byClass","map","every","some"],function(func){_4c4[func]=_4c5.prototype[func];});return _4c5;});},"dojo/dnd/Moveable":function(){define("dojo/dnd/Moveable",["../main","../Evented","../touch","./Mover"],function(dojo,_4ce,_4cf){dojo.declare("dojo.dnd.Moveable",[_4ce],{handle:"",delay:0,skip:false,constructor:function(node,_4d0){this.node=dojo.byId(node);if(!_4d0){_4d0={};}this.handle=_4d0.handle?dojo.byId(_4d0.handle):null;if(!this.handle){this.handle=this.node;}this.delay=_4d0.delay>0?_4d0.delay:0;this.skip=_4d0.skip;this.mover=_4d0.mover?_4d0.mover:dojo.dnd.Mover;this.events=[dojo.connect(this.handle,_4cf.press,this,"onMouseDown"),dojo.connect(this.handle,"ondragstart",this,"onSelectStart"),dojo.connect(this.handle,"onselectstart",this,"onSelectStart")];},markupFactory:function(_4d1,node,ctor){return new ctor(node,_4d1);},destroy:function(){dojo.forEach(this.events,dojo.disconnect);this.events=this.node=this.handle=null;},onMouseDown:function(e){if(this.skip&&dojo.dnd.isFormElement(e)){return;}if(this.delay){this.events.push(dojo.connect(this.handle,_4cf.move,this,"onMouseMove"),dojo.connect(this.handle,_4cf.release,this,"onMouseUp"));this._lastX=e.pageX;this._lastY=e.pageY;}else{this.onDragDetected(e);}dojo.stopEvent(e);},onMouseMove:function(e){if(Math.abs(e.pageX-this._lastX)>this.delay||Math.abs(e.pageY-this._lastY)>this.delay){this.onMouseUp(e);this.onDragDetected(e);}dojo.stopEvent(e);},onMouseUp:function(e){for(var i=0;i<2;++i){dojo.disconnect(this.events.pop());}dojo.stopEvent(e);},onSelectStart:function(e){if(!this.skip||!dojo.dnd.isFormElement(e)){dojo.stopEvent(e);}},onDragDetected:function(e){new this.mover(this.node,e,this);},onMoveStart:function(_4d2){dojo.publish("/dnd/move/start",[_4d2]);dojo.addClass(dojo.body(),"dojoMove");dojo.addClass(this.node,"dojoMoveItem");},onMoveStop:function(_4d3){dojo.publish("/dnd/move/stop",[_4d3]);dojo.removeClass(dojo.body(),"dojoMove");dojo.removeClass(this.node,"dojoMoveItem");},onFirstMove:function(_4d4,e){},onMove:function(_4d5,_4d6,e){this.onMoving(_4d5,_4d6);var s=_4d5.node.style;s.left=_4d6.l+"px";s.top=_4d6.t+"px";this.onMoved(_4d5,_4d6);},onMoving:function(_4d7,_4d8){},onMoved:function(_4d9,_4da){}});return dojo.dnd.Moveable;});},"dojo/store/util/SimpleQueryEngine":function(){define("dojo/store/util/SimpleQueryEngine",["../../_base/array"],function(_4db){return function(_4dc,_4dd){switch(typeof _4dc){default:throw new Error("Can not query with a "+typeof _4dc);case "object":case "undefined":var _4de=_4dc;_4dc=function(_4df){for(var key in _4de){var _4e0=_4de[key];if(_4e0&&_4e0.test){if(!_4e0.test(_4df[key])){return false;}}else{if(_4e0!=_4df[key]){return false;}}}return true;};break;case "string":if(!this[_4dc]){throw new Error("No filter function "+_4dc+" was found in store");}_4dc=this[_4dc];case "function":}function _4e1(_4e2){var _4e3=_4db.filter(_4e2,_4dc);if(_4dd&&_4dd.sort){_4e3.sort(function(a,b){for(var sort,i=0;sort=_4dd.sort[i];i++){var _4e4=a[sort.attribute];var _4e5=b[sort.attribute];if(_4e4!=_4e5){return !!sort.descending==_4e4>_4e5?-1:1;}}return 0;});}if(_4dd&&(_4dd.start||_4dd.count)){var _4e6=_4e3.length;_4e3=_4e3.slice(_4dd.start||0,(_4dd.start||0)+(_4dd.count||Infinity));_4e3.total=_4e6;}return _4e3;};_4e1.matches=_4dc;return _4e1;};});},"dijit/typematic":function(){define("dijit/typematic",["dojo/_base/array","dojo/_base/connect","dojo/_base/event","dojo/_base/kernel","dojo/_base/lang","dojo/on","dojo/_base/sniff","."],function(_4e7,_4e8,_4e9,_4ea,lang,on,has,_4eb){var _4ec=(_4eb.typematic={_fireEventAndReload:function(){this._timer=null;this._callback(++this._count,this._node,this._evt);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(evt,_4ed,node,_4ee,obj,_4ef,_4f0,_4f1){if(obj!=this._obj){this.stop();this._initialDelay=_4f0||500;this._subsequentDelay=_4ef||0.9;this._minDelay=_4f1||10;this._obj=obj;this._evt=evt;this._node=node;this._currentTimeout=-1;this._count=-1;this._callback=lang.hitch(_4ed,_4ee);this._fireEventAndReload();this._evt=lang.mixin({faux:true},evt);}},stop:function(){if(this._timer){clearTimeout(this._timer);this._timer=null;}if(this._obj){this._callback(-1,this._node,this._evt);this._obj=null;}},addKeyListener:function(node,_4f2,_4f3,_4f4,_4f5,_4f6,_4f7){if(_4f2.keyCode){_4f2.charOrCode=_4f2.keyCode;_4ea.deprecated("keyCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}else{if(_4f2.charCode){_4f2.charOrCode=String.fromCharCode(_4f2.charCode);_4ea.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.","","2.0");}}var _4f8=[on(node,_4e8._keypress,lang.hitch(this,function(evt){if(evt.charOrCode==_4f2.charOrCode&&(_4f2.ctrlKey===undefined||_4f2.ctrlKey==evt.ctrlKey)&&(_4f2.altKey===undefined||_4f2.altKey==evt.altKey)&&(_4f2.metaKey===undefined||_4f2.metaKey==(evt.metaKey||false))&&(_4f2.shiftKey===undefined||_4f2.shiftKey==evt.shiftKey)){_4e9.stop(evt);_4ec.trigger(evt,_4f3,node,_4f4,_4f2,_4f5,_4f6,_4f7);}else{if(_4ec._obj==_4f2){_4ec.stop();}}})),on(node,"keyup",lang.hitch(this,function(){if(_4ec._obj==_4f2){_4ec.stop();}}))];return {remove:function(){_4e7.forEach(_4f8,function(h){h.remove();});}};},addMouseListener:function(node,_4f9,_4fa,_4fb,_4fc,_4fd){var _4fe=[on(node,"mousedown",lang.hitch(this,function(evt){_4e9.stop(evt);_4ec.trigger(evt,_4f9,node,_4fa,node,_4fb,_4fc,_4fd);})),on(node,"mouseup",lang.hitch(this,function(evt){if(this._obj){_4e9.stop(evt);}_4ec.stop();})),on(node,"mouseout",lang.hitch(this,function(evt){_4e9.stop(evt);_4ec.stop();})),on(node,"mousemove",lang.hitch(this,function(evt){evt.preventDefault();})),on(node,"dblclick",lang.hitch(this,function(evt){_4e9.stop(evt);if(has("ie")){_4ec.trigger(evt,_4f9,node,_4fa,node,_4fb,_4fc,_4fd);setTimeout(lang.hitch(this,_4ec.stop),50);}}))];return {remove:function(){_4e7.forEach(_4fe,function(h){h.remove();});}};},addListener:function(_4ff,_500,_501,_502,_503,_504,_505,_506){var _507=[this.addKeyListener(_500,_501,_502,_503,_504,_505,_506),this.addMouseListener(_4ff,_502,_503,_504,_505,_506)];return {remove:function(){_4e7.forEach(_507,function(h){h.remove();});}};}});return _4ec;});},"dijit/MenuItem":function(){require({cache:{"url:dijit/templates/MenuItem.html":"<tr class=\"dijitReset dijitMenuItem\" data-dojo-attach-point=\"focusNode\" role=\"menuitem\" tabIndex=\"-1\"\n\t\tdata-dojo-attach-event=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\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","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/_base/event","dojo/_base/kernel","dojo/_base/sniff","./_Widget","./_TemplatedMixin","./_Contained","./_CssStateMixin","dojo/text!./templates/MenuItem.html"],function(_508,dom,_509,_50a,_50b,_50c,has,_50d,_50e,_50f,_510,_511){return _508("dijit.MenuItem",[_50d,_50e,_50f,_510],{templateString:_511,baseClass:"dijitMenuItem",label:"",_setLabelAttr:{node:"containerNode",type:"innerHTML"},iconClass:"dijitNoIcon",_setIconClassAttr:{node:"iconNode",type:"class"},accelKey:"",disabled:false,_fillContent:function(_512){if(_512&&!("label" in this.params)){this.set("label",_512.innerHTML);}},buildRendering:function(){this.inherited(arguments);var _513=this.id+"_text";_509.set(this.containerNode,"id",_513);if(this.accelKeyNode){_509.set(this.accelKeyNode,"id",this.id+"_accel");_513+=" "+this.id+"_accel";}this.domNode.setAttribute("aria-labelledby",_513);dom.setSelectable(this.domNode,false);},_onHover:function(){this.getParent().onItemHover(this);},_onUnhover:function(){this.getParent().onItemUnhover(this);this._set("hovering",false);},_onClick:function(evt){this.getParent().onItemClick(this,evt);_50b.stop(evt);},onClick:function(){},focus:function(){try{if(has("ie")==8){this.containerNode.focus();}this.focusNode.focus();}catch(e){}},_onFocus:function(){this._setSelected(true);this.getParent()._onItemFocus(this);this.inherited(arguments);},_setSelected:function(_514){_50a.toggle(this.domNode,"dijitMenuItemSelected",_514);},setLabel:function(_515){_50c.deprecated("dijit.MenuItem.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_515);},setDisabled:function(_516){_50c.deprecated("dijit.Menu.setDisabled() is deprecated. Use set('disabled', bool) instead.","","2.0");this.set("disabled",_516);},_setDisabledAttr:function(_517){this.focusNode.setAttribute("aria-disabled",_517?"true":"false");this._set("disabled",_517);},_setAccelKeyAttr:function(_518){this.accelKeyNode.style.display=_518?"":"none";this.accelKeyNode.innerHTML=_518;_509.set(this.containerNode,"colSpan",_518?"1":"2");this._set("accelKey",_518);}});});},"dijit/layout/TabController":function(){require({cache:{"url:dijit/layout/templates/_TabButton.html":"<div role=\"presentation\" data-dojo-attach-point=\"titleNode\" data-dojo-attach-event='onclick:onClick'>\n <div role=\"presentation\" class='dijitTabInnerDiv' data-dojo-attach-point='innerDiv'>\n <div role=\"presentation\" class='dijitTabContent' data-dojo-attach-point='tabContent'>\n \t<div role=\"presentation\" data-dojo-attach-point='focusNode'>\n\t\t <img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitTabButtonIcon\" data-dojo-attach-point='iconNode' />\n\t\t <span data-dojo-attach-point='containerNode' class='tabLabel'></span>\n\t\t <span class=\"dijitInline dijitTabCloseButton dijitTabCloseIcon\" data-dojo-attach-point='closeNode'\n\t\t \t\tdata-dojo-attach-event='onclick: onClickCloseButton' role=\"presentation\">\n\t\t <span data-dojo-attach-point='closeText' class='dijitTabCloseText'>[x]</span\n\t\t ></span>\n\t\t\t</div>\n </div>\n </div>\n</div>\n"}});define("dijit/layout/TabController",["dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/i18n","dojo/_base/lang","./StackController","../Menu","../MenuItem","dojo/text!./templates/_TabButton.html","dojo/i18n!../nls/common"],function(_519,dom,_51a,_51b,i18n,lang,_51c,Menu,_51d,_51e){var _51f=_519("dijit.layout._TabButton",_51c.StackButton,{baseClass:"dijitTab",cssStateNodes:{closeNode:"dijitTabCloseButton"},templateString:_51e,scrollOnFocus:false,buildRendering:function(){this.inherited(arguments);dom.setSelectable(this.containerNode,false);},startup:function(){this.inherited(arguments);var n=this.domNode;setTimeout(function(){n.className=n.className;},1);},_setCloseButtonAttr:function(disp){this._set("closeButton",disp);_51b.toggle(this.innerDiv,"dijitClosable",disp);this.closeNode.style.display=disp?"":"none";if(disp){var _520=i18n.getLocalization("dijit","common");if(this.closeNode){_51a.set(this.closeNode,"title",_520.itemClose);}this._closeMenu=new Menu({id:this.id+"_Menu",dir:this.dir,lang:this.lang,textDir:this.textDir,targetNodeIds:[this.domNode]});this._closeMenu.addChild(new _51d({label:_520.itemClose,dir:this.dir,lang:this.lang,textDir:this.textDir,onClick:lang.hitch(this,"onClickCloseButton")}));}else{if(this._closeMenu){this._closeMenu.destroyRecursive();delete this._closeMenu;}}},_setLabelAttr:function(_521){this.inherited(arguments);if(!this.showLabel&&!this.params.title){this.iconNode.alt=lang.trim(this.containerNode.innerText||this.containerNode.textContent||"");}},destroy:function(){if(this._closeMenu){this._closeMenu.destroyRecursive();delete this._closeMenu;}this.inherited(arguments);}});var _522=_519("dijit.layout.TabController",_51c,{baseClass:"dijitTabController",templateString:"<div role='tablist' data-dojo-attach-event='onkeypress:onkeypress'></div>",tabPosition:"top",buttonWidget:_51f,_rectifyRtlTabList:function(){if(0>=this.tabPosition.indexOf("-h")){return;}if(!this.pane2button){return;}var _523=0;for(var pane in this.pane2button){var ow=this.pane2button[pane].innerDiv.scrollWidth;_523=Math.max(_523,ow);}for(pane in this.pane2button){this.pane2button[pane].innerDiv.style.width=_523+"px";}}});_522.TabButton=_51f;return _522;});},"dijit/layout/_LayoutWidget":function(){define("dijit/layout/_LayoutWidget",["dojo/_base/lang","../_Widget","../_Container","../_Contained","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/sniff","dojo/_base/window"],function(lang,_524,_525,_526,_527,_528,_529,_52a,has,win){return _527("dijit.layout._LayoutWidget",[_524,_525,_526],{baseClass:"dijitLayoutContainer",isLayoutContainer:true,buildRendering:function(){this.inherited(arguments);_528.add(this.domNode,"dijitContainer");},startup:function(){if(this._started){return;}this.inherited(arguments);var _52b=this.getParent&&this.getParent();if(!(_52b&&_52b.isLayoutContainer)){this.resize();this.connect(win.global,"onresize",function(){this.resize();});}},resize:function(_52c,_52d){var node=this.domNode;if(_52c){_529.setMarginBox(node,_52c);}var mb=_52d||{};lang.mixin(mb,_52c||{});if(!("h" in mb)||!("w" in mb)){mb=lang.mixin(_529.getMarginBox(node),mb);}var cs=_52a.getComputedStyle(node);var me=_529.getMarginExtents(node,cs);var be=_529.getBorderExtents(node,cs);var bb=(this._borderBox={w:mb.w-(me.w+be.w),h:mb.h-(me.h+be.h)});var pe=_529.getPadExtents(node,cs);this._contentBox={l:_52a.toPixelValue(node,cs.paddingLeft),t:_52a.toPixelValue(node,cs.paddingTop),w:bb.w-pe.w,h:bb.h-pe.h};this.layout();},layout:function(){},_setupChild:function(_52e){var cls=this.baseClass+"-child "+(_52e.baseClass?this.baseClass+"-"+_52e.baseClass:"");_528.add(_52e.domNode,cls);},addChild:function(_52f,_530){this.inherited(arguments);if(this._started){this._setupChild(_52f);}},removeChild:function(_531){var cls=this.baseClass+"-child"+(_531.baseClass?" "+this.baseClass+"-"+_531.baseClass:"");_528.remove(_531.domNode,cls);this.inherited(arguments);}});});},"dijit/popup":function(){define("dijit/popup",["dojo/_base/array","dojo/aspect","dojo/_base/connect","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/on","dojo/_base/sniff","dojo/_base/window","./place","./BackgroundIframe","."],function(_532,_533,_534,_535,dom,_536,_537,_538,_539,_53a,keys,lang,on,has,win,_53b,_53c,_53d){var _53e=_535(null,{_stack:[],_beginZIndex:1000,_idGen:1,_createWrapper:function(_53f){var _540=_53f._popupWrapper,node=_53f.domNode;if(!_540){_540=_537.create("div",{"class":"dijitPopup",style:{display:"none"},role:"presentation"},win.body());_540.appendChild(node);var s=node.style;s.display="";s.visibility="";s.position="";s.top="0px";_53f._popupWrapper=_540;_533.after(_53f,"destroy",function(){_537.destroy(_540);delete _53f._popupWrapper;});}return _540;},moveOffScreen:function(_541){var _542=this._createWrapper(_541);_539.set(_542,{visibility:"hidden",top:"-9999px",display:""});},hide:function(_543){var _544=this._createWrapper(_543);_539.set(_544,"display","none");},getTopPopup:function(){var _545=this._stack;for(var pi=_545.length-1;pi>0&&_545[pi].parent===_545[pi-1].widget;pi--){}return _545[pi];},open:function(args){var _546=this._stack,_547=args.popup,_548=args.orient||["below","below-alt","above","above-alt"],ltr=args.parent?args.parent.isLeftToRight():_538.isBodyLtr(),_549=args.around,id=(args.around&&args.around.id)?(args.around.id+"_dropdown"):("popup_"+this._idGen++);while(_546.length&&(!args.parent||!dom.isDescendant(args.parent.domNode,_546[_546.length-1].widget.domNode))){this.close(_546[_546.length-1].widget);}var _54a=this._createWrapper(_547);_536.set(_54a,{id:id,style:{zIndex:this._beginZIndex+_546.length},"class":"dijitPopup "+(_547.baseClass||_547["class"]||"").split(" ")[0]+"Popup",dijitPopupParent:args.parent?args.parent.id:""});if(has("ie")||has("mozilla")){if(!_547.bgIframe){_547.bgIframe=new _53c(_54a);}}var best=_549?_53b.around(_54a,_549,_548,ltr,_547.orient?lang.hitch(_547,"orient"):null):_53b.at(_54a,args,_548=="R"?["TR","BR","TL","BL"]:["TL","BL","TR","BR"],args.padding);_54a.style.display="";_54a.style.visibility="visible";_547.domNode.style.visibility="visible";var _54b=[];_54b.push(on(_54a,_534._keypress,lang.hitch(this,function(evt){if(evt.charOrCode==keys.ESCAPE&&args.onCancel){_53a.stop(evt);args.onCancel();}else{if(evt.charOrCode===keys.TAB){_53a.stop(evt);var _54c=this.getTopPopup();if(_54c&&_54c.onCancel){_54c.onCancel();}}}})));if(_547.onCancel&&args.onCancel){_54b.push(_547.on("cancel",args.onCancel));}_54b.push(_547.on(_547.onExecute?"execute":"change",lang.hitch(this,function(){var _54d=this.getTopPopup();if(_54d&&_54d.onExecute){_54d.onExecute();}})));_546.push({widget:_547,parent:args.parent,onExecute:args.onExecute,onCancel:args.onCancel,onClose:args.onClose,handlers:_54b});if(_547.onOpen){_547.onOpen(best);}return best;},close:function(_54e){var _54f=this._stack;while((_54e&&_532.some(_54f,function(elem){return elem.widget==_54e;}))||(!_54e&&_54f.length)){var top=_54f.pop(),_550=top.widget,_551=top.onClose;if(_550.onClose){_550.onClose();}var h;while(h=top.handlers.pop()){h.remove();}if(_550&&_550.domNode){this.hide(_550);}if(_551){_551();}}}});return (_53d.popup=new _53e());});},"dijit/_base/manager":function(){define("dijit/_base/manager",["dojo/_base/array","dojo/_base/config","../registry",".."],function(_552,_553,_554,_555){_552.forEach(["byId","getUniqueId","findWidgets","_destroyAll","byNode","getEnclosingWidget"],function(name){_555[name]=_554[name];});_555.defaultDuration=_553["defaultDuration"]||200;return _555;});},"dijit/layout/StackController":function(){define("dijit/layout/StackController",["dojo/_base/array","dojo/_base/declare","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/_base/sniff","../focus","../registry","../_Widget","../_TemplatedMixin","../_Container","../form/ToggleButton","dojo/i18n!../nls/common"],function(_556,_557,_558,keys,lang,has,_559,_55a,_55b,_55c,_55d,_55e){var _55f=_557("dijit.layout._StackButton",_55e,{tabIndex:"-1",closeButton:false,_setCheckedAttr:function(_560,_561){this.inherited(arguments);this.focusNode.removeAttribute("aria-pressed");},buildRendering:function(evt){this.inherited(arguments);(this.focusNode||this.domNode).setAttribute("role","tab");},onClick:function(){_559.focus(this.focusNode);},onClickCloseButton:function(evt){evt.stopPropagation();}});var _562=_557("dijit.layout.StackController",[_55b,_55c,_55d],{baseClass:"dijitStackController",templateString:"<span role='tablist' data-dojo-attach-event='onkeypress'></span>",containerId:"",buttonWidget:_55f,constructor:function(){this.pane2button={};this.pane2connects={};this.pane2watches={};},postCreate:function(){this.inherited(arguments);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");},onStartup:function(info){_556.forEach(info.children,this.onAddChild,this);if(info.selected){this.onSelectChild(info.selected);}},destroy:function(){for(var pane in this.pane2button){this.onRemoveChild(_55a.byId(pane));}this.inherited(arguments);},onAddChild:function(page,_563){var cls=lang.isString(this.buttonWidget)?lang.getObject(this.buttonWidget):this.buttonWidget;var _564=new cls({id:this.id+"_"+page.id,label:page.title,dir:page.dir,lang:page.lang,textDir:page.textDir,showLabel:page.showTitle,iconClass:page.iconClass,closeButton:page.closable,title:page.tooltip});_564.focusNode.setAttribute("aria-selected","false");var _565=["title","showTitle","iconClass","closable","tooltip"],_566=["label","showLabel","iconClass","closeButton","title"];this.pane2watches[page.id]=_556.map(_565,function(_567,idx){return page.watch(_567,function(name,_568,_569){_564.set(_566[idx],_569);});});this.pane2connects[page.id]=[this.connect(_564,"onClick",lang.hitch(this,"onButtonClick",page)),this.connect(_564,"onClickCloseButton",lang.hitch(this,"onCloseButtonClick",page))];this.addChild(_564,_563);this.pane2button[page.id]=_564;page.controlButton=_564;if(!this._currentChild){_564.focusNode.setAttribute("tabIndex","0");_564.focusNode.setAttribute("aria-selected","true");this._currentChild=page;}if(!this.isLeftToRight()&&has("ie")&&this._rectifyRtlTabList){this._rectifyRtlTabList();}},onRemoveChild:function(page){if(this._currentChild===page){this._currentChild=null;}_556.forEach(this.pane2connects[page.id],lang.hitch(this,"disconnect"));delete this.pane2connects[page.id];_556.forEach(this.pane2watches[page.id],function(w){w.unwatch();});delete this.pane2watches[page.id];var _56a=this.pane2button[page.id];if(_56a){this.removeChild(_56a);delete this.pane2button[page.id];_56a.destroy();}delete page.controlButton;},onSelectChild:function(page){if(!page){return;}if(this._currentChild){var _56b=this.pane2button[this._currentChild.id];_56b.set("checked",false);_56b.focusNode.setAttribute("aria-selected","false");_56b.focusNode.setAttribute("tabIndex","-1");}var _56c=this.pane2button[page.id];_56c.set("checked",true);_56c.focusNode.setAttribute("aria-selected","true");this._currentChild=page;_56c.focusNode.setAttribute("tabIndex","0");var _56d=_55a.byId(this.containerId);_56d.containerNode.setAttribute("aria-labelledby",_56c.id);},onButtonClick:function(page){if(this._currentChild.id===page.id){var _56e=this.pane2button[page.id];_56e.set("checked",true);}var _56f=_55a.byId(this.containerId);_56f.selectChild(page);},onCloseButtonClick:function(page){var _570=_55a.byId(this.containerId);_570.closeChild(page);if(this._currentChild){var b=this.pane2button[this._currentChild.id];if(b){_559.focus(b.focusNode||b.domNode);}}},adjacent:function(_571){if(!this.isLeftToRight()&&(!this.tabPosition||/top|bottom/.test(this.tabPosition))){_571=!_571;}var _572=this.getChildren();var _573=_556.indexOf(_572,this.pane2button[this._currentChild.id]);var _574=_571?1:_572.length-1;return _572[(_573+_574)%_572.length];},onkeypress:function(e){if(this.disabled||e.altKey){return;}var _575=null;if(e.ctrlKey||!e._djpage){switch(e.charOrCode){case keys.LEFT_ARROW:case keys.UP_ARROW:if(!e._djpage){_575=false;}break;case keys.PAGE_UP:if(e.ctrlKey){_575=false;}break;case keys.RIGHT_ARROW:case keys.DOWN_ARROW:if(!e._djpage){_575=true;}break;case keys.PAGE_DOWN:if(e.ctrlKey){_575=true;}break;case keys.HOME:case keys.END:var _576=this.getChildren();if(_576&&_576.length){_576[e.charOrCode==keys.HOME?0:_576.length-1].onClick();}_558.stop(e);break;case keys.DELETE:if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}_558.stop(e);break;default:if(e.ctrlKey){if(e.charOrCode===keys.TAB){this.adjacent(!e.shiftKey).onClick();_558.stop(e);}else{if(e.charOrCode=="w"){if(this._currentChild.closable){this.onCloseButtonClick(this._currentChild);}_558.stop(e);}}}}if(_575!==null){this.adjacent(_575).onClick();_558.stop(e);}}},onContainerKeyPress:function(info){info.e._djpage=info.page;this.onkeypress(info.e);}});_562.StackButton=_55f;return _562;});},"dojo/dnd/Mover":function(){define("dojo/dnd/Mover",["../main","../Evented","../touch","./common","./autoscroll"],function(dojo,_577,_578){dojo.declare("dojo.dnd.Mover",[_577],{constructor:function(node,e,host){this.node=dojo.byId(node);this.marginBox={l:e.pageX,t:e.pageY};this.mouseButton=e.button;var h=(this.host=host),d=node.ownerDocument;this.events=[dojo.connect(d,_578.move,this,"onFirstMove"),dojo.connect(d,_578.move,this,"onMouseMove"),dojo.connect(d,_578.release,this,"onMouseUp"),dojo.connect(d,"ondragstart",dojo.stopEvent),dojo.connect(d.body,"onselectstart",dojo.stopEvent)];if(h&&h.onMoveStart){h.onMoveStart(this);}},onMouseMove:function(e){dojo.dnd.autoScroll(e);var m=this.marginBox;this.host.onMove(this,{l:m.l+e.pageX,t:m.t+e.pageY},e);dojo.stopEvent(e);},onMouseUp:function(e){if(dojo.isWebKit&&dojo.isMac&&this.mouseButton==2?e.button==0:this.mouseButton==e.button){this.destroy();}dojo.stopEvent(e);},onFirstMove:function(e){var s=this.node.style,l,t,h=this.host;switch(s.position){case "relative":case "absolute":l=Math.round(parseFloat(s.left))||0;t=Math.round(parseFloat(s.top))||0;break;default:s.position="absolute";var m=dojo.marginBox(this.node);var b=dojo.doc.body;var bs=dojo.getComputedStyle(b);var bm=dojo._getMarginBox(b,bs);var bc=dojo._getContentBox(b,bs);l=m.l-(bc.l-bm.l);t=m.t-(bc.t-bm.t);break;}this.marginBox.l=l-this.marginBox.l;this.marginBox.t=t-this.marginBox.t;if(h&&h.onFirstMove){h.onFirstMove(this,e);}dojo.disconnect(this.events.shift());},destroy:function(){dojo.forEach(this.events,dojo.disconnect);var h=this.host;if(h&&h.onMoveStop){h.onMoveStop(this);}this.events=this.node=this.host=null;}});return dojo.dnd.Mover;});},"dijit/layout/TabContainer":function(){define("dijit/layout/TabContainer",["dojo/_base/lang","dojo/_base/declare","./_TabContainerBase","./TabController","./ScrollingTabController"],function(lang,_579,_57a,_57b,_57c){return _579("dijit.layout.TabContainer",_57a,{useMenu:true,useSlider:true,controllerWidget:"",_makeController:function(_57d){var cls=this.baseClass+"-tabs"+(this.doLayout?"":" dijitTabNoLayout"),_57b=lang.getObject(this.controllerWidget);return new _57b({id:this.id+"_tablist",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},_57d);},postMixInProperties:function(){this.inherited(arguments);if(!this.controllerWidget){this.controllerWidget=(this.tabPosition=="top"||this.tabPosition=="bottom")&&!this.nested?"dijit.layout.ScrollingTabController":"dijit.layout.TabController";}}});});},"dijit/BackgroundIframe":function(){define("dijit/BackgroundIframe",["require",".","dojo/_base/config","dojo/dom-construct","dojo/dom-style","dojo/_base/lang","dojo/on","dojo/_base/sniff","dojo/_base/window"],function(_57e,_57f,_580,_581,_582,lang,on,has,win){var _583=new function(){var _584=[];this.pop=function(){var _585;if(_584.length){_585=_584.pop();_585.style.display="";}else{if(has("ie")<9){var burl=_580["dojoBlankHtmlUrl"]||_57e.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\");'>";_585=win.doc.createElement(html);}else{_585=_581.create("iframe");_585.src="javascript:\"\"";_585.className="dijitBackgroundIframe";_585.setAttribute("role","presentation");_582.set(_585,"opacity",0.1);}_585.tabIndex=-1;}return _585;};this.push=function(_586){_586.style.display="none";_584.push(_586);};}();_57f.BackgroundIframe=function(node){if(!node.id){throw new Error("no id");}if(has("ie")||has("mozilla")){var _587=(this.iframe=_583.pop());node.appendChild(_587);if(has("ie")<7||has("quirks")){this.resize(node);this._conn=on(node,"resize",lang.hitch(this,function(){this.resize(node);}));}else{_582.set(_587,{width:"100%",height:"100%"});}}};lang.extend(_57f.BackgroundIframe,{resize:function(node){if(this.iframe){_582.set(this.iframe,{width:node.offsetWidth+"px",height:node.offsetHeight+"px"});}},destroy:function(){if(this._conn){this._conn.remove();this._conn=null;}if(this.iframe){_583.push(this.iframe);delete this.iframe;}}});return _57f.BackgroundIframe;});},"url:dijit/templates/Menu.html":"<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" role=\"menu\" tabIndex=\"${tabIndex}\" data-dojo-attach-event=\"onkeypress:_onKeyPress\" cellspacing=\"0\">\n\t<tbody class=\"dijitReset\" data-dojo-attach-point=\"containerNode\"></tbody>\n</table>\n","dojo/dnd/Avatar":function(){define("dojo/dnd/Avatar",["../main","./common"],function(dojo){dojo.declare("dojo.dnd.Avatar",null,{constructor:function(_588){this.manager=_588;this.construct();},construct:function(){this.isA11y=dojo.hasClass(dojo.body(),"dijit_a11y");var a=dojo.create("table",{"class":"dojoDndAvatar",style:{position:"absolute",zIndex:"1999",margin:"0px"}}),_589=this.manager.source,node,b=dojo.create("tbody",null,a),tr=dojo.create("tr",null,b),td=dojo.create("td",null,tr),icon=this.isA11y?dojo.create("span",{id:"a11yIcon",innerHTML:this.manager.copy?"+":"<"},td):null,span=dojo.create("span",{innerHTML:_589.generateText?this._generateText():""},td),k=Math.min(5,this.manager.nodes.length),i=0;dojo.attr(tr,{"class":"dojoDndAvatarHeader",style:{opacity:0.9}});for(;i<k;++i){if(_589.creator){node=_589._normalizedCreator(_589.getItem(this.manager.nodes[i].id).data,"avatar").node;}else{node=this.manager.nodes[i].cloneNode(true);if(node.tagName.toLowerCase()=="tr"){var _58a=dojo.create("table"),_58b=dojo.create("tbody",null,_58a);_58b.appendChild(node);node=_58a;}}node.id="";tr=dojo.create("tr",null,b);td=dojo.create("td",null,tr);td.appendChild(node);dojo.attr(tr,{"class":"dojoDndAvatarItem",style:{opacity:(9-i)/10}});}this.node=a;},destroy:function(){dojo.destroy(this.node);this.node=false;},update:function(){dojo[(this.manager.canDropFlag?"add":"remove")+"Class"](this.node,"dojoDndAvatarCanDrop");if(this.isA11y){var icon=dojo.byId("a11yIcon");var text="+";if(this.manager.canDropFlag&&!this.manager.copy){text="< ";}else{if(!this.manager.canDropFlag&&!this.manager.copy){text="o";}else{if(!this.manager.canDropFlag){text="x";}}}icon.innerHTML=text;}dojo.query(("tr.dojoDndAvatarHeader td span"+(this.isA11y?" span":"")),this.node).forEach(function(node){node.innerHTML=this._generateText();},this);},_generateText:function(){return this.manager.nodes.length.toString();}});return dojo.dnd.Avatar;});},"dijit/form/Button":function(){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","dojo/dom-class","dojo/_base/kernel","dojo/_base/lang","dojo/ready","./_FormWidget","./_ButtonMixin","dojo/text!./templates/Button.html"],function(_58c,_58d,_58e,_58f,lang,_590,_591,_592,_593){if(!_58f.isAsync){_590(0,function(){var _594=["dijit/form/DropDownButton","dijit/form/ComboButton","dijit/form/ToggleButton"];_58c(_594);});}return _58d("dijit.form.Button",[_591,_592],{showLabel:true,iconClass:"dijitNoIcon",_setIconClassAttr:{node:"iconNode",type:"class"},baseClass:"dijitButton",templateString:_593,_setValueAttr:"valueNode",_onClick:function(e){var ok=this.inherited(arguments);if(ok){if(this.valueNode){this.valueNode.click();e.preventDefault();}}return ok;},_fillContent:function(_595){if(_595&&(!this.params||!("label" in this.params))){var _596=lang.trim(_595.innerHTML);if(_596){this.label=_596;}}},_setShowLabelAttr:function(val){if(this.containerNode){_58e.toggle(this.containerNode,"dijitDisplayNone",!val);}this._set("showLabel",val);},setLabel:function(_597){_58f.deprecated("dijit.form.Button.setLabel() is deprecated. Use set('label', ...) instead.","","2.0");this.set("label",_597);},_setLabelAttr:function(_598){this.inherited(arguments);if(!this.showLabel&&!("title" in this.params)){this.titleNode.title=lang.trim(this.containerNode.innerText||this.containerNode.textContent||"");}}});});},"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","dojo/dnd/move":function(){define("dojo/dnd/move",["../main","./Mover","./Moveable"],function(dojo){dojo.declare("dojo.dnd.move.constrainedMoveable",dojo.dnd.Moveable,{constraints:function(){},within:false,constructor:function(node,_599){if(!_599){_599={};}this.constraints=_599.constraints;this.within=_599.within;},onFirstMove:function(_59a){var c=this.constraintBox=this.constraints.call(this,_59a);c.r=c.l+c.w;c.b=c.t+c.h;if(this.within){var mb=dojo._getMarginSize(_59a.node);c.r-=mb.w;c.b-=mb.h;}},onMove:function(_59b,_59c){var c=this.constraintBox,s=_59b.node.style;this.onMoving(_59b,_59c);_59c.l=_59c.l<c.l?c.l:c.r<_59c.l?c.r:_59c.l;_59c.t=_59c.t<c.t?c.t:c.b<_59c.t?c.b:_59c.t;s.left=_59c.l+"px";s.top=_59c.t+"px";this.onMoved(_59b,_59c);}});dojo.declare("dojo.dnd.move.boxConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{box:{},constructor:function(node,_59d){var box=_59d&&_59d.box;this.constraints=function(){return box;};}});dojo.declare("dojo.dnd.move.parentConstrainedMoveable",dojo.dnd.move.constrainedMoveable,{area:"content",constructor:function(node,_59e){var area=_59e&&_59e.area;this.constraints=function(){var n=this.node.parentNode,s=dojo.getComputedStyle(n),mb=dojo._getMarginBox(n,s);if(area=="margin"){return mb;}var t=dojo._getMarginExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(area=="border"){return mb;}t=dojo._getBorderExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;if(area=="padding"){return mb;}t=dojo._getPadExtents(n,s);mb.l+=t.l,mb.t+=t.t,mb.w-=t.w,mb.h-=t.h;return mb;};}});dojo.dnd.constrainedMover=dojo.dnd.move.constrainedMover;dojo.dnd.boxConstrainedMover=dojo.dnd.move.boxConstrainedMover;dojo.dnd.parentConstrainedMover=dojo.dnd.move.parentConstrainedMover;return dojo.dnd.move;});},"dijit/_WidgetBase":function(){define("dijit/_WidgetBase",["require","dojo/_base/array","dojo/aspect","dojo/_base/config","dojo/_base/connect","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/_base/kernel","dojo/_base/lang","dojo/on","dojo/ready","dojo/Stateful","dojo/topic","dojo/_base/window","./registry"],function(_59f,_5a0,_5a1,_5a2,_5a3,_5a4,dom,_5a5,_5a6,_5a7,_5a8,_5a9,_5aa,lang,on,_5ab,_5ac,_5ad,win,_5ae){if(!_5aa.isAsync){_5ab(0,function(){var _5af=["dijit/_base/manager"];_59f(_5af);});}var _5b0={};function _5b1(obj){var ret={};for(var attr in obj){ret[attr.toLowerCase()]=true;}return ret;};function _5b2(attr){return function(val){_5a5[val?"set":"remove"](this.domNode,attr,val);this._set(attr,val);};};return _5a4("dijit._WidgetBase",_5ac,{id:"",_setIdAttr:"domNode",lang:"",_setLangAttr:_5b2("lang"),dir:"",_setDirAttr:_5b2("dir"),textDir:"","class":"",_setClassAttr:{node:"domNode",type:"class"},style:"",title:"",tooltip:"",baseClass:"",srcNodeRef:null,domNode:null,containerNode:null,attributeMap:{},_blankGif:_5a2.blankGif||_59f.toUrl("dojo/resources/blank.gif"),postscript:function(_5b3,_5b4){this.create(_5b3,_5b4);},create:function(_5b5,_5b6){this.srcNodeRef=dom.byId(_5b6);this._connects=[];this._supportingWidgets=[];if(this.srcNodeRef&&(typeof this.srcNodeRef.id=="string")){this.id=this.srcNodeRef.id;}if(_5b5){this.params=_5b5;lang.mixin(this,_5b5);}this.postMixInProperties();if(!this.id){this.id=_5ae.getUniqueId(this.declaredClass.replace(/\./g,"_"));}_5ae.add(this);this.buildRendering();if(this.domNode){this._applyAttributes();var _5b7=this.srcNodeRef;if(_5b7&&_5b7.parentNode&&this.domNode!==_5b7){_5b7.parentNode.replaceChild(this.domNode,_5b7);}}if(this.domNode){this.domNode.setAttribute("widgetId",this.id);}this.postCreate();if(this.srcNodeRef&&!this.srcNodeRef.parentNode){delete this.srcNodeRef;}this._created=true;},_applyAttributes:function(){var ctor=this.constructor,list=ctor._setterAttrs;if(!list){list=(ctor._setterAttrs=[]);for(var attr in this.attributeMap){list.push(attr);}var _5b8=ctor.prototype;for(var _5b9 in _5b8){if(_5b9 in this.attributeMap){continue;}var _5ba="_set"+_5b9.replace(/^[a-z]|-[a-zA-Z]/g,function(c){return c.charAt(c.length-1).toUpperCase();})+"Attr";if(_5ba in _5b8){list.push(_5b9);}}}_5a0.forEach(list,function(attr){if(this.params&&attr in this.params){}else{if(this[attr]){this.set(attr,this[attr]);}}},this);for(var _5bb in this.params){this.set(_5bb,this[_5bb]);}},postMixInProperties:function(){},buildRendering:function(){if(!this.domNode){this.domNode=this.srcNodeRef||_5a7.create("div");}if(this.baseClass){var _5bc=this.baseClass.split(" ");if(!this.isLeftToRight()){_5bc=_5bc.concat(_5a0.map(_5bc,function(name){return name+"Rtl";}));}_5a6.add(this.domNode,_5bc);}},postCreate:function(){},startup:function(){if(this._started){return;}this._started=true;_5a0.forEach(this.getChildren(),function(obj){if(!obj._started&&!obj._destroyed&&lang.isFunction(obj.startup)){obj.startup();obj._started=true;}});},destroyRecursive:function(_5bd){this._beingDestroyed=true;this.destroyDescendants(_5bd);this.destroy(_5bd);},destroy:function(_5be){this._beingDestroyed=true;this.uninitialize();var c;while((c=this._connects.pop())){c.remove();}var w;while((w=this._supportingWidgets.pop())){if(w.destroyRecursive){w.destroyRecursive();}else{if(w.destroy){w.destroy();}}}this.destroyRendering(_5be);_5ae.remove(this.id);this._destroyed=true;},destroyRendering:function(_5bf){if(this.bgIframe){this.bgIframe.destroy(_5bf);delete this.bgIframe;}if(this.domNode){if(_5bf){_5a5.remove(this.domNode,"widgetId");}else{_5a7.destroy(this.domNode);}delete this.domNode;}if(this.srcNodeRef){if(!_5bf){_5a7.destroy(this.srcNodeRef);}delete this.srcNodeRef;}},destroyDescendants:function(_5c0){_5a0.forEach(this.getChildren(),function(_5c1){if(_5c1.destroyRecursive){_5c1.destroyRecursive(_5c0);}});},uninitialize:function(){return false;},_setStyleAttr:function(_5c2){var _5c3=this.domNode;if(lang.isObject(_5c2)){_5a9.set(_5c3,_5c2);}else{if(_5c3.style.cssText){_5c3.style.cssText+="; "+_5c2;}else{_5c3.style.cssText=_5c2;}}this._set("style",_5c2);},_attrToDom:function(attr,_5c4,_5c5){_5c5=arguments.length>=3?_5c5:this.attributeMap[attr];_5a0.forEach(lang.isArray(_5c5)?_5c5:[_5c5],function(_5c6){var _5c7=this[_5c6.node||_5c6||"domNode"];var type=_5c6.type||"attribute";switch(type){case "attribute":if(lang.isFunction(_5c4)){_5c4=lang.hitch(this,_5c4);}var _5c8=_5c6.attribute?_5c6.attribute:(/^on[A-Z][a-zA-Z]*$/.test(attr)?attr.toLowerCase():attr);_5a5.set(_5c7,_5c8,_5c4);break;case "innerText":_5c7.innerHTML="";_5c7.appendChild(win.doc.createTextNode(_5c4));break;case "innerHTML":_5c7.innerHTML=_5c4;break;case "class":_5a6.replace(_5c7,_5c4,this[attr]);break;}},this);},get:function(name){var _5c9=this._getAttrNames(name);return this[_5c9.g]?this[_5c9.g]():this[name];},set:function(name,_5ca){if(typeof name==="object"){for(var x in name){this.set(x,name[x]);}return this;}var _5cb=this._getAttrNames(name),_5cc=this[_5cb.s];if(lang.isFunction(_5cc)){var _5cd=_5cc.apply(this,Array.prototype.slice.call(arguments,1));}else{var _5ce=this.focusNode&&!lang.isFunction(this.focusNode)?"focusNode":"domNode",tag=this[_5ce].tagName,_5cf=_5b0[tag]||(_5b0[tag]=_5b1(this[_5ce])),map=name in this.attributeMap?this.attributeMap[name]:_5cb.s in this?this[_5cb.s]:((_5cb.l in _5cf&&typeof _5ca!="function")||/^aria-|^data-|^role$/.test(name))?_5ce:null;if(map!=null){this._attrToDom(name,_5ca,map);}this._set(name,_5ca);}return _5cd||this;},_attrPairNames:{},_getAttrNames:function(name){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",g:"_get"+uc+"Attr",l:uc.toLowerCase()});},_set:function(name,_5d0){var _5d1=this[name];this[name]=_5d0;if(this._watchCallbacks&&this._created&&_5d0!==_5d1){this._watchCallbacks(name,_5d1,_5d0);}},on:function(type,func){return _5a1.after(this,this._onMap(type),func,true);},_onMap:function(type){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[type.toLowerCase()];},toString:function(){return "[Widget "+this.declaredClass+", "+(this.id||"NO ID")+"]";},getChildren:function(){return this.containerNode?_5ae.findWidgets(this.containerNode):[];},getParent:function(){return _5ae.getEnclosingWidget(this.domNode.parentNode);},connect:function(obj,_5d2,_5d3){var _5d4=_5a3.connect(obj,_5d2,this,_5d3);this._connects.push(_5d4);return _5d4;},disconnect:function(_5d5){var i=_5a0.indexOf(this._connects,_5d5);if(i!=-1){_5d5.remove();this._connects.splice(i,1);}},subscribe:function(t,_5d6){var _5d7=_5ad.subscribe(t,lang.hitch(this,_5d6));this._connects.push(_5d7);return _5d7;},unsubscribe:function(_5d8){this.disconnect(_5d8);},isLeftToRight:function(){return this.dir?(this.dir=="ltr"):_5a8.isBodyLtr();},isFocusable:function(){return this.focus&&(_5a9.get(this.domNode,"display")!="none");},placeAt:function(_5d9,_5da){if(_5d9.declaredClass&&_5d9.addChild){_5d9.addChild(this,_5da);}else{_5a7.place(this.domNode,_5d9,_5da);}return this;},getTextDir:function(text,_5db){return _5db;},applyTextDir:function(){},defer:function(fcn,_5dc){var _5dd=setTimeout(lang.hitch(this,function(){_5dd=null;if(!this._destroyed){lang.hitch(this,fcn)();}}),_5dc||0);return {remove:function(){if(_5dd){clearTimeout(_5dd);_5dd=null;}return null;}};}});});},"dijit/form/Form":function(){define("dijit/form/Form",["dojo/_base/declare","dojo/dom-attr","dojo/_base/event","dojo/_base/kernel","dojo/_base/sniff","../_Widget","../_TemplatedMixin","./_FormMixin","../layout/_ContentPaneResizeMixin"],function(_5de,_5df,_5e0,_5e1,has,_5e2,_5e3,_5e4,_5e5){return _5de("dijit.form.Form",[_5e2,_5e3,_5e4,_5e5],{name:"",action:"",method:"",encType:"","accept-charset":"",accept:"",target:"",templateString:"<form data-dojo-attach-point='containerNode' data-dojo-attach-event='onreset:_onReset,onsubmit:_onSubmit' ${!nameAttrSetting}></form>",postMixInProperties:function(){this.nameAttrSetting=this.name?("name='"+this.name+"'"):"";this.inherited(arguments);},execute:function(){},onExecute:function(){},_setEncTypeAttr:function(_5e6){this.encType=_5e6;_5df.set(this.domNode,"encType",_5e6);if(has("ie")){this.domNode.encoding=_5e6;}},reset:function(e){var faux={returnValue:true,preventDefault:function(){this.returnValue=false;},stopPropagation:function(){},currentTarget:e?e.target:this.domNode,target:e?e.target:this.domNode};if(!(this.onReset(faux)===false)&&faux.returnValue){this.inherited(arguments,[]);}},onReset:function(){return true;},_onReset:function(e){this.reset(e);_5e0.stop(e);return false;},_onSubmit:function(e){var fp=this.constructor.prototype;if(this.execute!=fp.execute||this.onExecute!=fp.onExecute){_5e1.deprecated("dijit.form.Form:execute()/onExecute() are deprecated. Use onSubmit() instead.","","2.0");this.onExecute();this.execute(this.getValues());}if(this.onSubmit(e)===false){_5e0.stop(e);}},onSubmit:function(){return this.isValid();},submit:function(){if(!(this.onSubmit()===false)){this.containerNode.submit();}}});});},"dijit/layout/_TabContainerBase":function(){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","../_TemplatedMixin","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/dom-style"],function(_5e7,_5e8,_5e9,_5ea,_5eb,_5ec,_5ed,_5ee){return _5eb("dijit.layout._TabContainerBase",[_5e8,_5ea],{tabPosition:"top",baseClass:"dijitTabContainer",tabStrip:false,nested:false,templateString:_5e7,postMixInProperties:function(){this.baseClass+=this.tabPosition.charAt(0).toUpperCase()+this.tabPosition.substr(1).replace(/-.*/,"");this.srcNodeRef&&_5ee.set(this.srcNodeRef,"visibility","hidden");this.inherited(arguments);},buildRendering:function(){this.inherited(arguments);this.tablist=this._makeController(this.tablistNode);if(!this.doLayout){_5ec.add(this.domNode,"dijitTabContainerNoLayout");}if(this.nested){_5ec.add(this.domNode,"dijitTabContainerNested");_5ec.add(this.tablist.containerNode,"dijitTabContainerTabListNested");_5ec.add(this.tablistSpacer,"dijitTabContainerSpacerNested");_5ec.add(this.containerNode,"dijitTabPaneWrapperNested");}else{_5ec.add(this.domNode,"tabStrip-"+(this.tabStrip?"enabled":"disabled"));}},_setupChild:function(tab){_5ec.add(tab.domNode,"dijitTabPane");this.inherited(arguments);},startup:function(){if(this._started){return;}this.tablist.startup();this.inherited(arguments);},layout:function(){if(!this._contentBox||typeof (this._contentBox.l)=="undefined"){return;}var sc=this.selectedChildWidget;if(this.doLayout){var _5ef=this.tabPosition.replace(/-h/,"");this.tablist.layoutAlign=_5ef;var _5f0=[this.tablist,{domNode:this.tablistSpacer,layoutAlign:_5ef},{domNode:this.containerNode,layoutAlign:"client"}];_5e9.layoutChildren(this.domNode,this._contentBox,_5f0);this._containerContentBox=_5e9.marginBox2contentBox(this.containerNode,_5f0[2]);if(sc&&sc.resize){sc.resize(this._containerContentBox);}}else{if(this.tablist.resize){var s=this.tablist.domNode.style;s.width="0";var _5f1=_5ed.getContentBox(this.domNode).w;s.width="";this.tablist.resize({w:_5f1});}if(sc&&sc.resize){sc.resize();}}},destroy:function(){if(this.tablist){this.tablist.destroy();}this.inherited(arguments);}});});},"dojo/store/Memory":function(){define("dojo/store/Memory",["../_base/declare","./util/QueryResults","./util/SimpleQueryEngine"],function(_5f2,_5f3,_5f4){return _5f2("dojo.store.Memory",null,{constructor:function(_5f5){for(var i in _5f5){this[i]=_5f5[i];}this.setData(this.data||[]);},data:null,idProperty:"id",index:null,queryEngine:_5f4,get:function(id){return this.data[this.index[id]];},getIdentity:function(_5f6){return _5f6[this.idProperty];},put:function(_5f7,_5f8){var data=this.data,_5f9=this.index,_5fa=this.idProperty;var id=(_5f8&&"id" in _5f8)?_5f8.id:_5fa in _5f7?_5f7[_5fa]:Math.random();if(id in _5f9){if(_5f8&&_5f8.overwrite===false){throw new Error("Object already exists");}data[_5f9[id]]=_5f7;}else{_5f9[id]=data.push(_5f7)-1;}return id;},add:function(_5fb,_5fc){(_5fc=_5fc||{}).overwrite=false;return this.put(_5fb,_5fc);},remove:function(id){var _5fd=this.index;var data=this.data;if(id in _5fd){data.splice(_5fd[id],1);this.setData(data);return true;}},query:function(_5fe,_5ff){return _5f3(this.queryEngine(_5fe,_5ff)(this.data));},setData:function(data){if(data.items){this.idProperty=data.identifier;data=this.data=data.items;}else{this.data=data;}this.index={};for(var i=0,l=data.length;i<l;i++){this.index[data[i][this.idProperty]]=i;}}});});},"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","dijit/_base/sniff":function(){define("dijit/_base/sniff",["dojo/uacss"],function(){});},"dijit/Toolbar":function(){define("dijit/Toolbar",["require","dojo/_base/declare","dojo/_base/kernel","dojo/keys","dojo/ready","./_Widget","./_KeyNavContainer","./_TemplatedMixin"],function(_600,_601,_602,keys,_603,_604,_605,_606){if(!_602.isAsync){_603(0,function(){var _607=["dijit/ToolbarSeparator"];_600(_607);});}return _601("dijit.Toolbar",[_604,_606,_605],{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]);}});});},"dijit/layout/StackContainer":function(){define("dijit/layout/StackContainer",["dojo/_base/array","dojo/cookie","dojo/_base/declare","dojo/dom-class","dojo/_base/kernel","dojo/_base/lang","dojo/ready","dojo/topic","../registry","../_WidgetBase","./_LayoutWidget","dojo/i18n!../nls/common"],function(_608,_609,_60a,_60b,_60c,lang,_60d,_60e,_60f,_610,_611){if(!_60c.isAsync){_60d(0,function(){var _612=["dijit/layout/StackController"];require(_612);});}lang.extend(_610,{selected:false,closable:false,iconClass:"dijitNoIcon",showTitle:true});return _60a("dijit.layout.StackContainer",_611,{doLayout:true,persist:false,baseClass:"dijitStackContainer",buildRendering:function(){this.inherited(arguments);_60b.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 _613=this.getChildren();_608.forEach(_613,this._setupChild,this);if(this.persist){this.selectedChildWidget=_60f.byId(_609(this.id+"_selectedChild"));}else{_608.some(_613,function(_614){if(_614.selected){this.selectedChildWidget=_614;}return _614.selected;},this);}var _615=this.selectedChildWidget;if(!_615&&_613[0]){_615=this.selectedChildWidget=_613[0];_615.selected=true;}_60e.publish(this.id+"-startup",{children:_613,selected:_615});this.inherited(arguments);},resize:function(){if(!this._hasBeenShown){this._hasBeenShown=true;var _616=this.selectedChildWidget;if(_616){this._showChild(_616);}}this.inherited(arguments);},_setupChild:function(_617){this.inherited(arguments);_60b.replace(_617.domNode,"dijitHidden","dijitVisible");_617.domNode.title="";},addChild:function(_618,_619){this.inherited(arguments);if(this._started){_60e.publish(this.id+"-addChild",_618,_619);this.layout();if(!this.selectedChildWidget){this.selectChild(_618);}}},removeChild:function(page){this.inherited(arguments);if(this._started){_60e.publish(this.id+"-removeChild",page);}if(this._descendantsBeingDestroyed){return;}if(this.selectedChildWidget===page){this.selectedChildWidget=undefined;if(this._started){var _61a=this.getChildren();if(_61a.length){this.selectChild(_61a[0]);}}}if(this._started){this.layout();}},selectChild:function(page,_61b){page=_60f.byId(page);if(this.selectedChildWidget!=page){var d=this._transition(page,this.selectedChildWidget,_61b);this._set("selectedChildWidget",page);_60e.publish(this.id+"-selectChild",page);if(this.persist){_609(this.id+"_selectedChild",this.selectedChildWidget.id);}}return d;},_transition:function(_61c,_61d){if(_61d){this._hideChild(_61d);}var d=this._showChild(_61c);if(_61c.resize){if(this.doLayout){_61c.resize(this._containerContentBox||this._contentBox);}else{_61c.resize();}}return d;},_adjacent:function(_61e){var _61f=this.getChildren();var _620=_608.indexOf(_61f,this.selectedChildWidget);_620+=_61e?1:_61f.length-1;return _61f[_620%_61f.length];},forward:function(){return this.selectChild(this._adjacent(true),true);},back:function(){return this.selectChild(this._adjacent(false),true);},_onKeyPress:function(e){_60e.publish(this.id+"-containerKeyPress",{e:e,page:this});},layout:function(){var _621=this.selectedChildWidget;if(_621&&_621.resize){if(this.doLayout){_621.resize(this._containerContentBox||this._contentBox);}else{_621.resize();}}},_showChild:function(page){var _622=this.getChildren();page.isFirstChild=(page==_622[0]);page.isLastChild=(page==_622[_622.length-1]);page._set("selected",true);_60b.replace(page.domNode,"dijitVisible","dijitHidden");return (page._onShow&&page._onShow())||true;},_hideChild:function(page){page._set("selected",false);_60b.replace(page.domNode,"dijitHidden","dijitVisible");page.onHide&&page.onHide();},closeChild:function(page){var _623=page.onClose(this,page);if(_623){this.removeChild(page);page.destroyRecursive();}},destroyDescendants:function(_624){this._descendantsBeingDestroyed=true;this.selectedChildWidget=undefined;_608.forEach(this.getChildren(),function(_625){if(!_624){this.removeChild(_625);}_625.destroyRecursive(_624);},this);this._descendantsBeingDestroyed=false;}});});},"dojo/regexp":function(){define("dojo/regexp",["./_base/kernel","./_base/lang"],function(dojo,lang){lang.getObject("regexp",true,dojo);dojo.regexp.escapeString=function(str,_626){return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g,function(ch){if(_626&&_626.indexOf(ch)!=-1){return ch;}return "\\"+ch;});};dojo.regexp.buildGroupRE=function(arr,re,_627){if(!(arr instanceof Array)){return re(arr);}var b=[];for(var i=0;i<arr.length;i++){b.push(re(arr[i]));}return dojo.regexp.group(b.join("|"),_627);};dojo.regexp.group=function(_628,_629){return "("+(_629?"?:":"")+_628+")";};return dojo.regexp;});},"dijit/form/_FormMixin":function(){define("dijit/form/_FormMixin",["dojo/_base/array","dojo/_base/declare","dojo/_base/kernel","dojo/_base/lang","dojo/window"],function(_62a,_62b,_62c,lang,_62d){return _62b("dijit.form._FormMixin",null,{state:"",_getDescendantFormWidgets:function(_62e){var res=[];_62a.forEach(_62e||this.getChildren(),function(_62f){if("value" in _62f){res.push(_62f);}else{res=res.concat(this._getDescendantFormWidgets(_62f.getChildren()));}},this);return res;},reset:function(){_62a.forEach(this._getDescendantFormWidgets(),function(_630){if(_630.reset){_630.reset();}});},validate:function(){var _631=false;return _62a.every(_62a.map(this._getDescendantFormWidgets(),function(_632){_632._hasBeenBlurred=true;var _633=_632.disabled||!_632.validate||_632.validate();if(!_633&&!_631){_62d.scrollIntoView(_632.containerNode||_632.domNode);_632.focus();_631=true;}return _633;}),function(item){return item;});},setValues:function(val){_62c.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.","","2.0");return this.set("value",val);},_setValueAttr:function(obj){var map={};_62a.forEach(this._getDescendantFormWidgets(),function(_634){if(!_634.name){return;}var _635=map[_634.name]||(map[_634.name]=[]);_635.push(_634);});for(var name in map){if(!map.hasOwnProperty(name)){continue;}var _636=map[name],_637=lang.getObject(name,false,obj);if(_637===undefined){continue;}if(!lang.isArray(_637)){_637=[_637];}if(typeof _636[0].checked=="boolean"){_62a.forEach(_636,function(w){w.set("value",_62a.indexOf(_637,w.value)!=-1);});}else{if(_636[0].multiple){_636[0].set("value",_637);}else{_62a.forEach(_636,function(w,i){w.set("value",_637[i]);});}}}},getValues:function(){_62c.deprecated(this.declaredClass+"::getValues() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},_getValueAttr:function(){var obj={};_62a.forEach(this._getDescendantFormWidgets(),function(_638){var name=_638.name;if(!name||_638.disabled){return;}var _639=_638.get("value");if(typeof _638.checked=="boolean"){if(/Radio/.test(_638.declaredClass)){if(_639!==false){lang.setObject(name,_639,obj);}else{_639=lang.getObject(name,false,obj);if(_639===undefined){lang.setObject(name,null,obj);}}}else{var ary=lang.getObject(name,false,obj);if(!ary){ary=[];lang.setObject(name,ary,obj);}if(_639!==false){ary.push(_639);}}}else{var prev=lang.getObject(name,false,obj);if(typeof prev!="undefined"){if(lang.isArray(prev)){prev.push(_639);}else{lang.setObject(name,[prev,_639],obj);}}else{lang.setObject(name,_639,obj);}}});return obj;},isValid:function(){return this.state=="";},onValidStateChange:function(){},_getState:function(){var _63a=_62a.map(this._descendants,function(w){return w.get("state")||"";});return _62a.indexOf(_63a,"Error")>=0?"Error":_62a.indexOf(_63a,"Incomplete")>=0?"Incomplete":"";},disconnectChildren:function(){_62a.forEach(this._childConnections||[],lang.hitch(this,"disconnect"));_62a.forEach(this._childWatches||[],function(w){w.unwatch();});},connectChildren:function(_63b){var _63c=this;this.disconnectChildren();this._descendants=this._getDescendantFormWidgets();var set=_63b?function(name,val){_63c[name]=val;}:lang.hitch(this,"_set");set("value",this.get("value"));set("state",this._getState());var _63d=(this._childConnections=[]),_63e=(this._childWatches=[]);_62a.forEach(_62a.filter(this._descendants,function(item){return item.validate;}),function(_63f){_62a.forEach(["state","disabled"],function(attr){_63e.push(_63f.watch(attr,function(){_63c.set("state",_63c._getState());}));});});var _640=function(){if(_63c._onChangeDelayTimer){clearTimeout(_63c._onChangeDelayTimer);}_63c._onChangeDelayTimer=setTimeout(function(){delete _63c._onChangeDelayTimer;_63c._set("value",_63c.get("value"));},10);};_62a.forEach(_62a.filter(this._descendants,function(item){return item.onChange;}),function(_641){_63d.push(_63c.connect(_641,"onChange",_640));_63e.push(_641.watch("disabled",_640));});},startup:function(){this.inherited(arguments);this.connectChildren(true);this.watch("state",function(attr,_642,_643){this.onValidStateChange(_643=="");});},destroy:function(){this.disconnectChildren();this.inherited(arguments);}});});},"dijit/DropDownMenu":function(){require({cache:{"url:dijit/templates/Menu.html":"<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" role=\"menu\" tabIndex=\"${tabIndex}\" 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","dojo/_base/event","dojo/keys","dojo/text!./templates/Menu.html","./_OnDijitClickMixin","./_MenuBase"],function(_644,_645,keys,_646,_647,_648){return _644("dijit.DropDownMenu",[_648,_647],{templateString:_646,baseClass:"dijitMenu",postCreate:function(){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(evt){if(evt.ctrlKey||evt.altKey){return;}switch(evt.charOrCode){case this._openSubMenuKey:this._moveToPopup(evt);_645.stop(evt);break;case this._closeSubMenuKey:if(this.parentMenu){if(this.parentMenu._isMenuBar){this.parentMenu.focusPrev();}else{this.onCancel(false);}}else{_645.stop(evt);}break;}}});});},"dojo/data/util/simpleFetch":function(){define("dojo/data/util/simpleFetch",["dojo/_base/lang","dojo/_base/window","./sorter"],function(lang,_649,_64a){var _64b=lang.getObject("dojo.data.util.simpleFetch",true);_64b.fetch=function(_64c){_64c=_64c||{};if(!_64c.store){_64c.store=this;}var self=this;var _64d=function(_64e,_64f){if(_64f.onError){var _650=_64f.scope||_649.global;_64f.onError.call(_650,_64e,_64f);}};var _651=function(_652,_653){var _654=_653.abort||null;var _655=false;var _656=_653.start?_653.start:0;var _657=(_653.count&&(_653.count!==Infinity))?(_656+_653.count):_652.length;_653.abort=function(){_655=true;if(_654){_654.call(_653);}};var _658=_653.scope||_649.global;if(!_653.store){_653.store=self;}if(_653.onBegin){_653.onBegin.call(_658,_652.length,_653);}if(_653.sort){_652.sort(_64a.createSortFunction(_653.sort,self));}if(_653.onItem){for(var i=_656;(i<_652.length)&&(i<_657);++i){var item=_652[i];if(!_655){_653.onItem.call(_658,item,_653);}}}if(_653.onComplete&&!_655){var _659=null;if(!_653.onItem){_659=_652.slice(_656,_657);}_653.onComplete.call(_658,_659,_653);}};this._fetchItems(_64c,_651,_64d);return _64c;};return _64b;});},"dijit/Menu":function(){define("dijit/Menu",["require","dojo/_base/array","dojo/_base/declare","dojo/_base/event","dojo/dom","dojo/dom-attr","dojo/dom-geometry","dojo/dom-style","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/on","dojo/_base/sniff","dojo/_base/window","dojo/window","./popup","./DropDownMenu","dojo/ready"],function(_65a,_65b,_65c,_65d,dom,_65e,_65f,_660,_661,keys,lang,on,has,win,_662,pm,_663,_664){if(!_661.isAsync){_664(0,function(){var _665=["dijit/MenuItem","dijit/PopupMenuItem","dijit/CheckedMenuItem","dijit/MenuSeparator"];_65a(_665);});}return _65c("dijit.Menu",_663,{constructor:function(){this._bindings=[];},targetNodeIds:[],contextMenuForWindow:false,leftClickToOpen:false,refocus:true,postCreate:function(){if(this.contextMenuForWindow){this.bindDomNode(win.body());}else{_65b.forEach(this.targetNodeIds,this.bindDomNode,this);}this.inherited(arguments);},_iframeContentWindow:function(_666){return _662.get(this._iframeContentDocument(_666))||this._iframeContentDocument(_666)["__parent__"]||(_666.name&&win.doc.frames[_666.name])||null;},_iframeContentDocument:function(_667){return _667.contentDocument||(_667.contentWindow&&_667.contentWindow.document)||(_667.name&&win.doc.frames[_667.name]&&win.doc.frames[_667.name].document)||null;},bindDomNode:function(node){node=dom.byId(node);var cn;if(node.tagName.toLowerCase()=="iframe"){var _668=node,_669=this._iframeContentWindow(_668);cn=win.withGlobal(_669,win.body);}else{cn=(node==win.body()?win.doc.documentElement:node);}var _66a={node:node,iframe:_668};_65e.set(node,"_dijitMenu"+this.id,this._bindings.push(_66a));var _66b=lang.hitch(this,function(cn){return [on(cn,this.leftClickToOpen?"click":"contextmenu",lang.hitch(this,function(evt){_65d.stop(evt);this._scheduleOpen(evt.target,_668,{x:evt.pageX,y:evt.pageY});})),on(cn,"keydown",lang.hitch(this,function(evt){if(evt.shiftKey&&evt.keyCode==keys.F10){_65d.stop(evt);this._scheduleOpen(evt.target,_668);}}))];});_66a.connects=cn?_66b(cn):[];if(_668){_66a.onloadHandler=lang.hitch(this,function(){var _66c=this._iframeContentWindow(_668);cn=win.withGlobal(_66c,win.body);_66a.connects=_66b(cn);});if(_668.addEventListener){_668.addEventListener("load",_66a.onloadHandler,false);}else{_668.attachEvent("onload",_66a.onloadHandler);}}},unBindDomNode:function(_66d){var node;try{node=dom.byId(_66d);}catch(e){return;}var _66e="_dijitMenu"+this.id;if(node&&_65e.has(node,_66e)){var bid=_65e.get(node,_66e)-1,b=this._bindings[bid],h;while(h=b.connects.pop()){h.remove();}var _66f=b.iframe;if(_66f){if(_66f.removeEventListener){_66f.removeEventListener("load",b.onloadHandler,false);}else{_66f.detachEvent("onload",b.onloadHandler);}}_65e.remove(node,_66e);delete this._bindings[bid];}},_scheduleOpen:function(_670,_671,_672){if(!this._openTimer){this._openTimer=setTimeout(lang.hitch(this,function(){delete this._openTimer;this._openMyself({target:_670,iframe:_671,coords:_672});}),1);}},_openMyself:function(args){var _673=args.target,_674=args.iframe,_675=args.coords;if(_675){if(_674){var ifc=_65f.position(_674,true),_676=this._iframeContentWindow(_674),_677=win.withGlobal(_676,"_docScroll",dojo);var cs=_660.getComputedStyle(_674),tp=_660.toPixelValue,left=(has("ie")&&has("quirks")?0:tp(_674,cs.paddingLeft))+(has("ie")&&has("quirks")?tp(_674,cs.borderLeftWidth):0),top=(has("ie")&&has("quirks")?0:tp(_674,cs.paddingTop))+(has("ie")&&has("quirks")?tp(_674,cs.borderTopWidth):0);_675.x+=ifc.x+left-_677.x;_675.y+=ifc.y+top-_677.y;}}else{_675=_65f.position(_673,true);_675.x+=10;_675.y+=10;}var self=this;var _678=this._focusManager.get("prevNode");var _679=this._focusManager.get("curNode");var _67a=!_679||(dom.isDescendant(_679,this.domNode))?_678:_679;function _67b(){if(self.refocus&&_67a){_67a.focus();}pm.close(self);};pm.open({popup:this,x:_675.x,y:_675.y,onExecute:_67b,onCancel:_67b,orient:this.isLeftToRight()?"L":"R"});this.focus();this._onBlur=function(){this.inherited("_onBlur",arguments);pm.close(this);};},uninitialize:function(){_65b.forEach(this._bindings,function(b){if(b){this.unBindDomNode(b.node);}},this);this.inherited(arguments);}});});},"dijit/form/_CheckBoxMixin":function(){define("dijit/form/_CheckBoxMixin",["dojo/_base/declare","dojo/dom-attr","dojo/_base/event"],function(_67c,_67d,_67e){return _67c("dijit.form._CheckBoxMixin",null,{type:"checkbox",value:"on",readOnly:false,_aria_attr:"aria-checked",_setReadOnlyAttr:function(_67f){this._set("readOnly",_67f);_67d.set(this.focusNode,"readOnly",_67f);this.focusNode.setAttribute("aria-readonly",_67f);},_setLabelAttr:undefined,postMixInProperties:function(){if(this.value==""){this.value="on";}this.inherited(arguments);},reset:function(){this.inherited(arguments);this._set("value",this.params.value||"on");_67d.set(this.focusNode,"value",this.value);},_onClick:function(e){if(this.readOnly){_67e.stop(e);return false;}return this.inherited(arguments);}});});},"dijit/layout/ContentPane":function(){define("dijit/layout/ContentPane",["dojo/_base/kernel","dojo/_base/lang","../_Widget","./_ContentPaneResizeMixin","dojo/string","dojo/html","dojo/i18n!../nls/loading","dojo/_base/array","dojo/_base/declare","dojo/_base/Deferred","dojo/dom","dojo/dom-attr","dojo/_base/window","dojo/_base/xhr","dojo/i18n"],function(_680,lang,_681,_682,_683,html,_684,_685,_686,_687,dom,_688,win,xhr,i18n){return _686("dijit.layout.ContentPane",[_681,_682],{href:"",content:"",extractContent:false,parseOnLoad:true,parserScope:_680._scopeName,preventCache:false,preload:false,refreshOnShow:false,loadingMessage:"<span class='dijitContentPaneLoading'><span class='dijitInline dijitIconLoading'></span>${loadingState}</span>",errorMessage:"<span class='dijitContentPaneError'><span class='dijitInline dijitIconError'></span>${errorState}</span>",isLoaded:false,baseClass:"dijitContentPane",ioArgs:{},onLoadDeferred:null,_setTitleAttr:null,stopParser:true,template:false,create:function(_689,_68a){if((!_689||!_689.template)&&_68a&&!("href" in _689)&&!("content" in _689)){var df=win.doc.createDocumentFragment();_68a=dom.byId(_68a);while(_68a.firstChild){df.appendChild(_68a.firstChild);}_689=lang.delegate(_689,{content:df});}this.inherited(arguments,[_689,_68a]);},postMixInProperties:function(){this.inherited(arguments);var _68b=i18n.getLocalization("dijit","loading",this.lang);this.loadingMessage=_683.substitute(this.loadingMessage,_68b);this.errorMessage=_683.substitute(this.errorMessage,_68b);},buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}this.domNode.title="";if(!_688.get(this.domNode,"role")){this.domNode.setAttribute("role","group");}},startup:function(){this.inherited(arguments);if(this._contentSetter){_685.forEach(this._contentSetter.parseResults,function(obj){if(!obj._started&&!obj._destroyed&&lang.isFunction(obj.startup)){obj.startup();obj._started=true;}},this);}},setHref:function(href){_680.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.","","2.0");return this.set("href",href);},_setHrefAttr:function(href){this.cancel();this.onLoadDeferred=new _687(lang.hitch(this,"cancel"));this.onLoadDeferred.addCallback(lang.hitch(this,"onLoad"));this._set("href",href);if(this.preload||(this._created&&this._isShown())){this._load();}else{this._hrefChanged=true;}return this.onLoadDeferred;},setContent:function(data){_680.deprecated("dijit.layout.ContentPane.setContent() is deprecated. Use set('content', ...) instead.","","2.0");this.set("content",data);},_setContentAttr:function(data){this._set("href","");this.cancel();this.onLoadDeferred=new _687(lang.hitch(this,"cancel"));if(this._created){this.onLoadDeferred.addCallback(lang.hitch(this,"onLoad"));}this._setContent(data||"");this._isDownloaded=false;return this.onLoadDeferred;},_getContentAttr:function(){return this.containerNode.innerHTML;},cancel:function(){if(this._xhrDfd&&(this._xhrDfd.fired==-1)){this._xhrDfd.cancel();}delete this._xhrDfd;this.onLoadDeferred=null;},uninitialize:function(){if(this._beingDestroyed){this.cancel();}this.inherited(arguments);},destroyRecursive:function(_68c){if(this._beingDestroyed){return;}this.inherited(arguments);},_onShow:function(){this.inherited(arguments);if(this.href){if(!this._xhrDfd&&(!this.isLoaded||this._hrefChanged||this.refreshOnShow)){return this.refresh();}}},refresh:function(){this.cancel();this.onLoadDeferred=new _687(lang.hitch(this,"cancel"));this.onLoadDeferred.addCallback(lang.hitch(this,"onLoad"));this._load();return this.onLoadDeferred;},_load:function(){this._setContent(this.onDownloadStart(),true);var self=this;var _68d={preventCache:(this.preventCache||this.refreshOnShow),url:this.href,handleAs:"text"};if(lang.isObject(this.ioArgs)){lang.mixin(_68d,this.ioArgs);}var hand=(this._xhrDfd=(this.ioMethod||xhr.get)(_68d));hand.addCallback(function(html){try{self._isDownloaded=true;self._setContent(html,false);self.onDownloadEnd();}catch(err){self._onError("Content",err);}delete self._xhrDfd;return html;});hand.addErrback(function(err){if(!hand.canceled){self._onError("Download",err);}delete self._xhrDfd;return err;});delete this._hrefChanged;},_onLoadHandler:function(data){this._set("isLoaded",true);try{this.onLoadDeferred.callback(data);}catch(e){console.error("Error "+this.widgetId+" running custom onLoad code: "+e.message);}},_onUnloadHandler:function(){this._set("isLoaded",false);try{this.onUnload();}catch(e){console.error("Error "+this.widgetId+" running custom onUnload code: "+e.message);}},destroyDescendants:function(_68e){if(this.isLoaded){this._onUnloadHandler();}var _68f=this._contentSetter;_685.forEach(this.getChildren(),function(_690){if(_690.destroyRecursive){_690.destroyRecursive(_68e);}});if(_68f){_685.forEach(_68f.parseResults,function(_691){if(_691.destroyRecursive&&_691.domNode&&_691.domNode.parentNode==win.body()){_691.destroyRecursive(_68e);}});delete _68f.parseResults;}if(!_68e){html._emptyNode(this.containerNode);}delete this._singleChild;},_setContent:function(cont,_692){this.destroyDescendants();var _693=this._contentSetter;if(!(_693&&_693 instanceof html._ContentSetter)){_693=this._contentSetter=new html._ContentSetter({node:this.containerNode,_onError:lang.hitch(this,this._onError),onContentError:lang.hitch(this,function(e){var _694=this.onContentError(e);try{this.containerNode.innerHTML=_694;}catch(e){console.error("Fatal "+this.id+" could not change content due to "+e.message,e);}})});}var _695=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||{});_693.set((lang.isObject(cont)&&cont.domNode)?cont.domNode:cont,_695);delete this._contentSetterParams;if(this.doLayout){this._checkIfSingleChild();}if(!_692){if(this._started){delete this._started;this.startup();this._scheduleLayout();}this._onLoadHandler(cont);}},_onError:function(type,err,_696){this.onLoadDeferred.errback(err);var _697=this["on"+type+"Error"].call(this,err);if(_696){console.error(_696,err);}else{if(_697){this._setContent(_697,true);}}},onLoad:function(){},onUnload:function(){},onDownloadStart:function(){return this.loadingMessage;},onContentError:function(){},onDownloadError:function(){return this.errorMessage;},onDownloadEnd:function(){}});});},"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","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","dijit/layout/utils":function(){define("dijit/layout/utils",["dojo/_base/array","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/lang",".."],function(_698,_699,_69a,_69b,lang,_69c){var _69d=lang.getObject("layout",true,_69c);_69d.marginBox2contentBox=function(node,mb){var cs=_69b.getComputedStyle(node);var me=_69a.getMarginExtents(node,cs);var pb=_69a.getPadBorderExtents(node,cs);return {l:_69b.toPixelValue(node,cs.paddingLeft),t:_69b.toPixelValue(node,cs.paddingTop),w:mb.w-(me.w+pb.w),h:mb.h-(me.h+pb.h)};};function _69e(word){return word.substring(0,1).toUpperCase()+word.substring(1);};function size(_69f,dim){var _6a0=_69f.resize?_69f.resize(dim):_69a.setMarginBox(_69f.domNode,dim);if(_6a0){lang.mixin(_69f,_6a0);}else{lang.mixin(_69f,_69a.getMarginBox(_69f.domNode));lang.mixin(_69f,dim);}};_69d.layoutChildren=function(_6a1,dim,_6a2,_6a3,_6a4){dim=lang.mixin({},dim);_699.add(_6a1,"dijitLayoutContainer");_6a2=_698.filter(_6a2,function(item){return item.region!="center"&&item.layoutAlign!="client";}).concat(_698.filter(_6a2,function(item){return item.region=="center"||item.layoutAlign=="client";}));_698.forEach(_6a2,function(_6a5){var elm=_6a5.domNode,pos=(_6a5.region||_6a5.layoutAlign);if(!pos){throw new Error("No region setting for "+_6a5.id);}var _6a6=elm.style;_6a6.left=dim.l+"px";_6a6.top=dim.t+"px";_6a6.position="absolute";_699.add(elm,"dijitAlign"+_69e(pos));var _6a7={};if(_6a3&&_6a3==_6a5.id){_6a7[_6a5.region=="top"||_6a5.region=="bottom"?"h":"w"]=_6a4;}if(pos=="top"||pos=="bottom"){_6a7.w=dim.w;size(_6a5,_6a7);dim.h-=_6a5.h;if(pos=="top"){dim.t+=_6a5.h;}else{_6a6.top=dim.t+dim.h+"px";}}else{if(pos=="left"||pos=="right"){_6a7.h=dim.h;size(_6a5,_6a7);dim.w-=_6a5.w;if(pos=="left"){dim.l+=_6a5.w;}else{_6a6.left=dim.l+dim.w+"px";}}else{if(pos=="client"||pos=="center"){size(_6a5,dim);}}}});};return {marginBox2contentBox:_69d.marginBox2contentBox,layoutChildren:_69d.layoutChildren};});},"dijit/_Contained":function(){define("dijit/_Contained",["dojo/_base/declare","./registry"],function(_6a8,_6a9){return _6a8("dijit._Contained",null,{_getSibling:function(_6aa){var node=this.domNode;do{node=node[_6aa+"Sibling"];}while(node&&node.nodeType!=1);return node&&_6a9.byNode(node);},getPreviousSibling:function(){return this._getSibling("previous");},getNextSibling:function(){return this._getSibling("next");},getIndexInParent:function(){var p=this.getParent();if(!p||!p.getIndexOfChild){return -1;}return p.getIndexOfChild(this);}});});},"dijit/_KeyNavContainer":function(){define("dijit/_KeyNavContainer",["dojo/_base/kernel","./_Container","./_FocusMixin","dojo/_base/array","dojo/keys","dojo/_base/declare","dojo/_base/event","dojo/dom-attr","dojo/_base/lang"],function(_6ab,_6ac,_6ad,_6ae,keys,_6af,_6b0,_6b1,lang){return _6af("dijit._KeyNavContainer",[_6ad,_6ac],{tabIndex:"0",connectKeyNavHandlers:function(_6b2,_6b3){var _6b4=(this._keyNavCodes={});var prev=lang.hitch(this,"focusPrev");var next=lang.hitch(this,"focusNext");_6ae.forEach(_6b2,function(code){_6b4[code]=prev;});_6ae.forEach(_6b3,function(code){_6b4[code]=next;});_6b4[keys.HOME]=lang.hitch(this,"focusFirstChild");_6b4[keys.END]=lang.hitch(this,"focusLastChild");this.connect(this.domNode,"onkeypress","_onContainerKeypress");this.connect(this.domNode,"onfocus","_onContainerFocus");},startupKeyNavChildren:function(){_6ab.deprecated("startupKeyNavChildren() call no longer needed","","2.0");},startup:function(){this.inherited(arguments);_6ae.forEach(this.getChildren(),lang.hitch(this,"_startupChild"));},addChild:function(_6b5,_6b6){this.inherited(arguments);this._startupChild(_6b5);},focus:function(){this.focusFirstChild();},focusFirstChild:function(){this.focusChild(this._getFirstFocusableChild());},focusLastChild:function(){this.focusChild(this._getLastFocusableChild());},focusNext:function(){this.focusChild(this._getNextFocusableChild(this.focusedChild,1));},focusPrev:function(){this.focusChild(this._getNextFocusableChild(this.focusedChild,-1),true);},focusChild:function(_6b7,last){if(!_6b7){return;}if(this.focusedChild&&_6b7!==this.focusedChild){this._onChildBlur(this.focusedChild);}_6b7.set("tabIndex",this.tabIndex);_6b7.focus(last?"end":"start");this._set("focusedChild",_6b7);},_startupChild:function(_6b8){_6b8.set("tabIndex","-1");this.connect(_6b8,"_onFocus",function(){_6b8.set("tabIndex",this.tabIndex);});this.connect(_6b8,"_onBlur",function(){_6b8.set("tabIndex","-1");});},_onContainerFocus:function(evt){if(evt.target!==this.domNode||this.focusedChild){return;}this.focusFirstChild();_6b1.set(this.domNode,"tabIndex","-1");},_onBlur:function(evt){if(this.tabIndex){_6b1.set(this.domNode,"tabIndex",this.tabIndex);}this.focusedChild=null;this.inherited(arguments);},_onContainerKeypress:function(evt){if(evt.ctrlKey||evt.altKey){return;}var func=this._keyNavCodes[evt.charOrCode];if(func){func();_6b0.stop(evt);}},_onChildBlur:function(){},_getFirstFocusableChild:function(){return this._getNextFocusableChild(null,1);},_getLastFocusableChild:function(){return this._getNextFocusableChild(null,-1);},_getNextFocusableChild:function(_6b9,dir){if(_6b9){_6b9=this._getSiblingOfChild(_6b9,dir);}var _6ba=this.getChildren();for(var i=0;i<_6ba.length;i++){if(!_6b9){_6b9=_6ba[(dir>0)?0:(_6ba.length-1)];}if(_6b9.isFocusable()){return _6b9;}_6b9=this._getSiblingOfChild(_6b9,dir);}return null;}});});},"dijit/form/DataList":function(){define("dijit/form/DataList",["dojo/_base/declare","dojo/dom","dojo/_base/lang","dojo/query","dojo/store/Memory","../registry"],function(_6bb,dom,lang,_6bc,_6bd,_6be){function _6bf(_6c0){return {id:_6c0.value,value:_6c0.value,name:lang.trim(_6c0.innerText||_6c0.textContent||"")};};return _6bb("dijit.form.DataList",_6bd,{constructor:function(_6c1,_6c2){this.domNode=dom.byId(_6c2);lang.mixin(this,_6c1);if(this.id){_6be.add(this);}this.domNode.style.display="none";this.inherited(arguments,[{data:_6bc("option",this.domNode).map(_6bf)}]);},destroy:function(){_6be.remove(this.id);},fetchSelectedItem:function(){var _6c3=_6bc("> option[selected]",this.domNode)[0]||_6bc("> option",this.domNode)[0];return _6c3&&_6bf(_6c3);}});});},"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<span data-dojo-attach-point=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\"></span>\n\t<span data-dojo-attach-point=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" data-dojo-attach-event=\"ondijitclick: onCancel\" title=\"${buttonCancel}\" role=\"button\" tabIndex=\"-1\">\n\t\t<span data-dojo-attach-point=\"closeText\" class=\"closeText\" title=\"${buttonCancel}\">x</span>\n\t</span>\n\t</div>\n\t\t<div data-dojo-attach-point=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n","dijit/form/CheckBox":function(){require({cache:{"url:dijit/form/templates/CheckBox.html":"<div class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><input\n\t \t${!nameAttrSetting} type=\"${type}\" ${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","dojo/dom-attr","dojo/_base/kernel","dojo/query","dojo/ready","./ToggleButton","./_CheckBoxMixin","dojo/text!./templates/CheckBox.html","dojo/NodeList-dom"],function(_6c4,_6c5,_6c6,_6c7,_6c8,_6c9,_6ca,_6cb,_6cc){if(!_6c7.isAsync){_6c9(0,function(){var _6cd=["dijit/form/RadioButton"];_6c4(_6cd);});}return _6c5("dijit.form.CheckBox",[_6ca,_6cb],{templateString:_6cc,baseClass:"dijitCheckBox",_setValueAttr:function(_6ce,_6cf){if(typeof _6ce=="string"){this._set("value",_6ce);_6c6.set(this.focusNode,"value",_6ce);_6ce=true;}if(this._created){this.set("checked",_6ce,_6cf);}},_getValueAttr:function(){return (this.checked?this.value:false);},_setIconClassAttr:null,postMixInProperties:function(){this.inherited(arguments);this.checkedAttrSetting=this.checked?"checked":"";},_fillContent:function(){},_onFocus:function(){if(this.id){_6c8("label[for='"+this.id+"']").addClass("dijitFocusedLabel");}this.inherited(arguments);},_onBlur:function(){if(this.id){_6c8("label[for='"+this.id+"']").removeClass("dijitFocusedLabel");}this.inherited(arguments);}});});},"dijit/tree/_dndSelector":function(){define("dijit/tree/_dndSelector",["dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/_base/lang","dojo/mouse","dojo/on","dojo/touch","dojo/_base/window","./_dndContainer"],function(_6d0,_6d1,_6d2,lang,_6d3,on,_6d4,win,_6d5){return _6d2("dijit.tree._dndSelector",_6d5,{constructor:function(){this.selection={};this.anchor=null;this.tree.domNode.setAttribute("aria-multiselect",!this.singular);this.events.push(on(this.tree.domNode,_6d4.press,lang.hitch(this,"onMouseDown")),on(this.tree.domNode,_6d4.release,lang.hitch(this,"onMouseUp")),on(this.tree.domNode,_6d4.move,lang.hitch(this,"onMouseMove")));},singular:false,getSelectedTreeNodes:function(){var _6d6=[],sel=this.selection;for(var i in sel){_6d6.push(sel[i]);}return _6d6;},selectNone:function(){this.setSelection([]);return this;},destroy:function(){this.inherited(arguments);this.selection=this.anchor=null;},addTreeNode:function(node,_6d7){this.setSelection(this.getSelectedTreeNodes().concat([node]));if(_6d7){this.anchor=node;}return node;},removeTreeNode:function(node){this.setSelection(this._setDifference(this.getSelectedTreeNodes(),[node]));return node;},isTreeNodeSelected:function(node){return node.id&&!!this.selection[node.id];},setSelection:function(_6d8){var _6d9=this.getSelectedTreeNodes();_6d0.forEach(this._setDifference(_6d9,_6d8),lang.hitch(this,function(node){node.setSelected(false);if(this.anchor==node){delete this.anchor;}delete this.selection[node.id];}));_6d0.forEach(this._setDifference(_6d8,_6d9),lang.hitch(this,function(node){node.setSelected(true);this.selection[node.id]=node;}));this._updateSelectionProperties();},_setDifference:function(xs,ys){_6d0.forEach(ys,function(y){y.__exclude__=true;});var ret=_6d0.filter(xs,function(x){return !x.__exclude__;});_6d0.forEach(ys,function(y){delete y["__exclude__"];});return ret;},_updateSelectionProperties:function(){var _6da=this.getSelectedTreeNodes();var _6db=[],_6dc=[];_6d0.forEach(_6da,function(node){_6dc.push(node);_6db.push(node.getTreePath());});var _6dd=_6d0.map(_6dc,function(node){return node.item;});this.tree._set("paths",_6db);this.tree._set("path",_6db[0]||[]);this.tree._set("selectedNodes",_6dc);this.tree._set("selectedNode",_6dc[0]||null);this.tree._set("selectedItems",_6dd);this.tree._set("selectedItem",_6dd[0]||null);},onMouseDown:function(e){if(!this.current||this.tree.isExpandoNode(e.target,this.current)){return;}if(!_6d3.isLeft(e)){return;}e.preventDefault();var _6de=this.current,copy=_6d1.isCopyKey(e),id=_6de.id;if(!this.singular&&!e.shiftKey&&this.selection[id]){this._doDeselect=true;return;}else{this._doDeselect=false;}this.userSelect(_6de,copy,e.shiftKey);},onMouseUp:function(e){if(!this._doDeselect){return;}this._doDeselect=false;this.userSelect(this.current,_6d1.isCopyKey(e),e.shiftKey);},onMouseMove:function(){this._doDeselect=false;},_compareNodes:function(n1,n2){if(n1===n2){return 0;}if("sourceIndex" in document.documentElement){return n1.sourceIndex-n2.sourceIndex;}else{if("compareDocumentPosition" in document.documentElement){return n1.compareDocumentPosition(n2)&2?1:-1;}else{if(document.createRange){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,_6df,_6e0){if(this.singular){if(this.anchor==node&&_6df){this.selectNone();}else{this.setSelection([node]);this.anchor=node;}}else{if(_6e0&&this.anchor){var cr=this._compareNodes(this.anchor.rowNode,node.rowNode),_6e1,end,_6e2=this.anchor;if(cr<0){_6e1=_6e2;end=node;}else{_6e1=node;end=_6e2;}var _6e3=[];while(_6e1!=end){_6e3.push(_6e1);_6e1=this.tree._getNextNode(_6e1);}_6e3.push(end);this.setSelection(_6e3);}else{if(this.selection[node.id]&&_6df){this.removeTreeNode(node);}else{if(_6df){this.addTreeNode(node,true);}else{this.setSelection([node]);this.anchor=node;}}}}},getItem:function(key){var _6e4=this.selection[key];return {data:_6e4,type:["treeNode"]};},forInSelectedItems:function(f,o){o=o||win.global;for(var id in this.selection){f.call(o,this.getItem(id),id,this);}}});});},"dijit/_Container":function(){define("dijit/_Container",["dojo/_base/array","dojo/_base/declare","dojo/dom-construct","./registry"],function(_6e5,_6e6,_6e7,_6e8){return _6e6("dijit._Container",null,{buildRendering:function(){this.inherited(arguments);if(!this.containerNode){this.containerNode=this.domNode;}},addChild:function(_6e9,_6ea){var _6eb=this.containerNode;if(_6ea&&typeof _6ea=="number"){var _6ec=this.getChildren();if(_6ec&&_6ec.length>=_6ea){_6eb=_6ec[_6ea-1].domNode;_6ea="after";}}_6e7.place(_6e9.domNode,_6eb,_6ea);if(this._started&&!_6e9._started){_6e9.startup();}},removeChild:function(_6ed){if(typeof _6ed=="number"){_6ed=this.getChildren()[_6ed];}if(_6ed){var node=_6ed.domNode;if(node&&node.parentNode){node.parentNode.removeChild(node);}}},hasChildren:function(){return this.getChildren().length>0;},_getSiblingOfChild:function(_6ee,dir){var node=_6ee.domNode,_6ef=(dir>0?"nextSibling":"previousSibling");do{node=node[_6ef];}while(node&&(node.nodeType!=1||!_6e8.byNode(node)));return node&&_6e8.byNode(node);},getIndexOfChild:function(_6f0){return _6e5.indexOf(this.getChildren(),_6f0);}});});},"dojo/data/ItemFileReadStore":function(){define("dojo/data/ItemFileReadStore",["../_base/kernel","../_base/lang","../_base/declare","../_base/array","../_base/xhr","../Evented","../_base/window","./util/filter","./util/simpleFetch","../date/stamp"],function(_6f1,lang,_6f2,_6f3,xhr,_6f4,_6f5,_6f6,_6f7,_6f8){var _6f9=_6f2("dojo.data.ItemFileReadStore",[_6f4],{constructor:function(_6fa){this._arrayOfAllItems=[];this._arrayOfTopLevelItems=[];this._loadFinished=false;this._jsonFileUrl=_6fa.url;this._ccUrl=_6fa.url;this.url=_6fa.url;this._jsonData=_6fa.data;this.data=null;this._datatypeMap=_6fa.typeMap||{};if(!this._datatypeMap["Date"]){this._datatypeMap["Date"]={type:Date,deserialize:function(_6fb){return _6f8.fromISOString(_6fb);}};}this._features={"dojo.data.api.Read":true,"dojo.data.api.Identity":true};this._itemsByIdentity=null;this._storeRefPropName="_S";this._itemNumPropName="_0";this._rootItemPropName="_RI";this._reverseRefMap="_RRM";this._loadInProgress=false;this._queuedFetches=[];if(_6fa.urlPreventCache!==undefined){this.urlPreventCache=_6fa.urlPreventCache?true:false;}if(_6fa.hierarchical!==undefined){this.hierarchical=_6fa.hierarchical?true:false;}if(_6fa.clearOnClose){this.clearOnClose=true;}if("failOk" in _6fa){this.failOk=_6fa.failOk?true:false;}},url:"",_ccUrl:"",data:null,typeMap:null,clearOnClose:false,urlPreventCache:false,failOk:false,hierarchical:true,_assertIsItem:function(item){if(!this.isItem(item)){throw new Error("dojo.data.ItemFileReadStore: Invalid item argument.");}},_assertIsAttribute:function(_6fc){if(typeof _6fc!=="string"){throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument.");}},getValue:function(item,_6fd,_6fe){var _6ff=this.getValues(item,_6fd);return (_6ff.length>0)?_6ff[0]:_6fe;},getValues:function(item,_700){this._assertIsItem(item);this._assertIsAttribute(_700);return (item[_700]||[]).slice(0);},getAttributes:function(item){this._assertIsItem(item);var _701=[];for(var key in item){if((key!==this._storeRefPropName)&&(key!==this._itemNumPropName)&&(key!==this._rootItemPropName)&&(key!==this._reverseRefMap)){_701.push(key);}}return _701;},hasAttribute:function(item,_702){this._assertIsItem(item);this._assertIsAttribute(_702);return (_702 in item);},containsValue:function(item,_703,_704){var _705=undefined;if(typeof _704==="string"){_705=_6f6.patternToRegExp(_704,false);}return this._containsValue(item,_703,_704,_705);},_containsValue:function(item,_706,_707,_708){return _6f3.some(this.getValues(item,_706),function(_709){if(_709!==null&&!lang.isObject(_709)&&_708){if(_709.toString().match(_708)){return true;}}else{if(_707===_709){return true;}}});},isItem:function(_70a){if(_70a&&_70a[this._storeRefPropName]===this){if(this._arrayOfAllItems[_70a[this._itemNumPropName]]===_70a){return true;}}return false;},isItemLoaded:function(_70b){return this.isItem(_70b);},loadItem:function(_70c){this._assertIsItem(_70c.item);},getFeatures:function(){return this._features;},getLabel:function(item){if(this._labelAttr&&this.isItem(item)){return this.getValue(item,this._labelAttr);}return undefined;},getLabelAttributes:function(item){if(this._labelAttr){return [this._labelAttr];}return null;},_fetchItems:function(_70d,_70e,_70f){var self=this,_710=function(_711,_712){var _713=[],i,key;if(_711.query){var _714,_715=_711.queryOptions?_711.queryOptions.ignoreCase:false;var _716={};for(key in _711.query){_714=_711.query[key];if(typeof _714==="string"){_716[key]=_6f6.patternToRegExp(_714,_715);}else{if(_714 instanceof RegExp){_716[key]=_714;}}}for(i=0;i<_712.length;++i){var _717=true;var _718=_712[i];if(_718===null){_717=false;}else{for(key in _711.query){_714=_711.query[key];if(!self._containsValue(_718,key,_714,_716[key])){_717=false;}}}if(_717){_713.push(_718);}}_70e(_713,_711);}else{for(i=0;i<_712.length;++i){var item=_712[i];if(item!==null){_713.push(item);}}_70e(_713,_711);}};if(this._loadFinished){_710(_70d,this._getItemsArray(_70d.queryOptions));}else{if(this._jsonFileUrl!==this._ccUrl){_6f1.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){if(this._loadInProgress){this._queuedFetches.push({args:_70d,filter:_710});}else{this._loadInProgress=true;var _719={url:self._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};var _71a=xhr.get(_719);_71a.addCallback(function(data){try{self._getItemsFromLoadedData(data);self._loadFinished=true;self._loadInProgress=false;_710(_70d,self._getItemsArray(_70d.queryOptions));self._handleQueuedFetches();}catch(e){self._loadFinished=true;self._loadInProgress=false;_70f(e,_70d);}});_71a.addErrback(function(_71b){self._loadInProgress=false;_70f(_71b,_70d);});var _71c=null;if(_70d.abort){_71c=_70d.abort;}_70d.abort=function(){var df=_71a;if(df&&df.fired===-1){df.cancel();df=null;}if(_71c){_71c.call(_70d);}};}}else{if(this._jsonData){try{this._loadFinished=true;this._getItemsFromLoadedData(this._jsonData);this._jsonData=null;_710(_70d,this._getItemsArray(_70d.queryOptions));}catch(e){_70f(e,_70d);}}else{_70f(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."),_70d);}}}},_handleQueuedFetches:function(){if(this._queuedFetches.length>0){for(var i=0;i<this._queuedFetches.length;i++){var _71d=this._queuedFetches[i],_71e=_71d.args,_71f=_71d.filter;if(_71f){_71f(_71e,this._getItemsArray(_71e.queryOptions));}else{this.fetchItemByIdentity(_71e);}}this._queuedFetches=[];}},_getItemsArray:function(_720){if(_720&&_720.deep){return this._arrayOfAllItems;}return this._arrayOfTopLevelItems;},close:function(_721){if(this.clearOnClose&&this._loadFinished&&!this._loadInProgress){if(((this._jsonFileUrl==""||this._jsonFileUrl==null)&&(this.url==""||this.url==null))&&this.data==null){}this._arrayOfAllItems=[];this._arrayOfTopLevelItems=[];this._loadFinished=false;this._itemsByIdentity=null;this._loadInProgress=false;this._queuedFetches=[];}},_getItemsFromLoadedData:function(_722){var _723=false,self=this;function _724(_725){return (_725!==null)&&(typeof _725==="object")&&(!lang.isArray(_725)||_723)&&(!lang.isFunction(_725))&&(_725.constructor==Object||lang.isArray(_725))&&(typeof _725._reference==="undefined")&&(typeof _725._type==="undefined")&&(typeof _725._value==="undefined")&&self.hierarchical;};function _726(_727){self._arrayOfAllItems.push(_727);for(var _728 in _727){var _729=_727[_728];if(_729){if(lang.isArray(_729)){var _72a=_729;for(var k=0;k<_72a.length;++k){var _72b=_72a[k];if(_724(_72b)){_726(_72b);}}}else{if(_724(_729)){_726(_729);}}}}};this._labelAttr=_722.label;var i,item;this._arrayOfAllItems=[];this._arrayOfTopLevelItems=_722.items;for(i=0;i<this._arrayOfTopLevelItems.length;++i){item=this._arrayOfTopLevelItems[i];if(lang.isArray(item)){_723=true;}_726(item);item[this._rootItemPropName]=true;}var _72c={},key;for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];for(key in item){if(key!==this._rootItemPropName){var _72d=item[key];if(_72d!==null){if(!lang.isArray(_72d)){item[key]=[_72d];}}else{item[key]=[null];}}_72c[key]=key;}}while(_72c[this._storeRefPropName]){this._storeRefPropName+="_";}while(_72c[this._itemNumPropName]){this._itemNumPropName+="_";}while(_72c[this._reverseRefMap]){this._reverseRefMap+="_";}var _72e;var _72f=_722.identifier;if(_72f){this._itemsByIdentity={};this._features["dojo.data.api.Identity"]=_72f;for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];_72e=item[_72f];var _730=_72e[0];if(!Object.hasOwnProperty.call(this._itemsByIdentity,_730)){this._itemsByIdentity[_730]=item;}else{if(this._jsonFileUrl){throw new Error("dojo.data.ItemFileReadStore: The json data as specified by: ["+this._jsonFileUrl+"] is malformed. Items within the list have identifier: ["+_72f+"]. Value collided: ["+_730+"]");}else{if(this._jsonData){throw new Error("dojo.data.ItemFileReadStore: The json data provided by the creation arguments is malformed. Items within the list have identifier: ["+_72f+"]. Value collided: ["+_730+"]");}}}}}else{this._features["dojo.data.api.Identity"]=Number;}for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];item[this._storeRefPropName]=this;item[this._itemNumPropName]=i;}for(i=0;i<this._arrayOfAllItems.length;++i){item=this._arrayOfAllItems[i];for(key in item){_72e=item[key];for(var j=0;j<_72e.length;++j){_72d=_72e[j];if(_72d!==null&&typeof _72d=="object"){if(("_type" in _72d)&&("_value" in _72d)){var type=_72d._type;var _731=this._datatypeMap[type];if(!_731){throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '"+type+"'");}else{if(lang.isFunction(_731)){_72e[j]=new _731(_72d._value);}else{if(lang.isFunction(_731.deserialize)){_72e[j]=_731.deserialize(_72d._value);}else{throw new Error("dojo.data.ItemFileReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function");}}}}if(_72d._reference){var _732=_72d._reference;if(!lang.isObject(_732)){_72e[j]=this._getItemByIdentity(_732);}else{for(var k=0;k<this._arrayOfAllItems.length;++k){var _733=this._arrayOfAllItems[k],_734=true;for(var _735 in _732){if(_733[_735]!=_732[_735]){_734=false;}}if(_734){_72e[j]=_733;}}}if(this.referenceIntegrity){var _736=_72e[j];if(this.isItem(_736)){this._addReferenceToMap(_736,item,key);}}}else{if(this.isItem(_72d)){if(this.referenceIntegrity){this._addReferenceToMap(_72d,item,key);}}}}}}}},_addReferenceToMap:function(_737,_738,_739){},getIdentity:function(item){var _73a=this._features["dojo.data.api.Identity"];if(_73a===Number){return item[this._itemNumPropName];}else{var _73b=item[_73a];if(_73b){return _73b[0];}}return null;},fetchItemByIdentity:function(_73c){var item,_73d;if(!this._loadFinished){var self=this;if(this._jsonFileUrl!==this._ccUrl){_6f1.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null&&this._jsonData==null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){if(this._loadInProgress){this._queuedFetches.push({args:_73c});}else{this._loadInProgress=true;var _73e={url:self._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk};var _73f=xhr.get(_73e);_73f.addCallback(function(data){var _740=_73c.scope?_73c.scope:_6f5.global;try{self._getItemsFromLoadedData(data);self._loadFinished=true;self._loadInProgress=false;item=self._getItemByIdentity(_73c.identity);if(_73c.onItem){_73c.onItem.call(_740,item);}self._handleQueuedFetches();}catch(error){self._loadInProgress=false;if(_73c.onError){_73c.onError.call(_740,error);}}});_73f.addErrback(function(_741){self._loadInProgress=false;if(_73c.onError){var _742=_73c.scope?_73c.scope:_6f5.global;_73c.onError.call(_742,_741);}});}}else{if(this._jsonData){self._getItemsFromLoadedData(self._jsonData);self._jsonData=null;self._loadFinished=true;item=self._getItemByIdentity(_73c.identity);if(_73c.onItem){_73d=_73c.scope?_73c.scope:_6f5.global;_73c.onItem.call(_73d,item);}}}}else{item=this._getItemByIdentity(_73c.identity);if(_73c.onItem){_73d=_73c.scope?_73c.scope:_6f5.global;_73c.onItem.call(_73d,item);}}},_getItemByIdentity:function(_743){var item=null;if(this._itemsByIdentity){if(Object.hasOwnProperty.call(this._itemsByIdentity,_743)){item=this._itemsByIdentity[_743];}}else{if(Object.hasOwnProperty.call(this._arrayOfAllItems,_743)){item=this._arrayOfAllItems[_743];}}if(item===undefined){item=null;}return item;},getIdentityAttributes:function(item){var _744=this._features["dojo.data.api.Identity"];if(_744===Number){return null;}else{return [_744];}},_forceLoad:function(){var self=this;if(this._jsonFileUrl!==this._ccUrl){_6f1.deprecated("dojo.data.ItemFileReadStore: ","To change the url, set the url property of the store,"+" not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0");this._ccUrl=this._jsonFileUrl;this.url=this._jsonFileUrl;}else{if(this.url!==this._ccUrl){this._jsonFileUrl=this.url;this._ccUrl=this.url;}}if(this.data!=null){this._jsonData=this.data;this.data=null;}if(this._jsonFileUrl){var _745={url:this._jsonFileUrl,handleAs:"json-comment-optional",preventCache:this.urlPreventCache,failOk:this.failOk,sync:true};var _746=xhr.get(_745);_746.addCallback(function(data){try{if(self._loadInProgress!==true&&!self._loadFinished){self._getItemsFromLoadedData(data);self._loadFinished=true;}else{if(self._loadInProgress){throw new Error("dojo.data.ItemFileReadStore: Unable to perform a synchronous load, an async load is in progress.");}}}catch(e){throw e;}});_746.addErrback(function(_747){throw _747;});}else{if(this._jsonData){self._getItemsFromLoadedData(self._jsonData);self._jsonData=null;self._loadFinished=true;}}}});lang.extend(_6f9,_6f7);return _6f9;});},"dojo/html":function(){define("dojo/html",["./_base/kernel","./_base/lang","./_base/array","./_base/declare","./dom","./dom-construct","./parser"],function(dojo,lang,_748,_749,dom,_74a,_74b){lang.getObject("html",true,dojo);var _74c=0;dojo.html._secureForInnerHtml=function(cont){return cont.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig,"");};dojo.html._emptyNode=_74a.empty;dojo.html._setNodeContent=function(node,cont){_74a.empty(node);if(cont){if(typeof cont=="string"){cont=_74a.toDom(cont,node.ownerDocument);}if(!cont.nodeType&&lang.isArrayLike(cont)){for(var _74d=cont.length,i=0;i<cont.length;i=_74d==cont.length?i+1:0){_74a.place(cont[i],node,"last");}}else{_74a.place(cont,node,"last");}}return node;};_749("dojo.html._ContentSetter",null,{node:"",content:"",id:"",cleanContent:false,extractContent:false,parseContent:false,parserScope:dojo._scopeName,startup:true,constructor:function(_74e,node){lang.mixin(this,_74e||{});node=this.node=dom.byId(this.node||node);if(!this.id){this.id=["Setter",(node)?node.id||node.tagName:"",_74c++].join("_");}},set:function(cont,_74f){if(undefined!==cont){this.content=cont;}if(_74f){this._mixin(_74f);}this.onBegin();this.setContent();this.onEnd();return this.node;},setContent:function(){var node=this.node;if(!node){throw new Error(this.declaredClass+": setContent given no node");}try{node=dojo.html._setNodeContent(node,this.content);}catch(e){var _750=this.onContentError(e);try{node.innerHTML=_750;}catch(e){console.error("Fatal "+this.declaredClass+".setContent could not change content due to "+e.message,e);}}this.node=node;},empty:function(){if(this.parseResults&&this.parseResults.length){_748.forEach(this.parseResults,function(w){if(w.destroy){w.destroy();}});delete this.parseResults;}dojo.html._emptyNode(this.node);},onBegin:function(){var cont=this.content;if(lang.isString(cont)){if(this.cleanContent){cont=dojo.html._secureForInnerHtml(cont);}if(this.extractContent){var _751=cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im);if(_751){cont=_751[1];}}}this.empty();this.content=cont;return this.node;},onEnd:function(){if(this.parseContent){this._parse();}return this.node;},tearDown:function(){delete this.parseResults;delete this.node;delete this.content;},onContentError:function(err){return "Error occured setting content: "+err;},_mixin:function(_752){var _753={},key;for(key in _752){if(key in _753){continue;}this[key]=_752[key];}},_parse:function(){var _754=this.node;try{var _755={};_748.forEach(["dir","lang","textDir"],function(name){if(this[name]){_755[name]=this[name];}},this);this.parseResults=_74b.parse({rootNode:_754,noStart:!this.startup,inherited:_755,scope:this.parserScope});}catch(e){this._onError("Content",e,"Error parsing in _ContentSetter#"+this.id);}},_onError:function(type,err,_756){var _757=this["on"+type+"Error"].call(this,err);if(_756){console.error(_756,err);}else{if(_757){dojo.html._setNodeContent(this.node,_757,true);}}}});dojo.html.set=function(node,cont,_758){if(undefined==cont){console.warn("dojo.html.set: no cont argument provided, using empty string");cont="";}if(!_758){return dojo.html._setNodeContent(node,cont,true);}else{var op=new dojo.html._ContentSetter(lang.mixin(_758,{content:cont,node:node}));return op.set();}};return dojo.html;});},"dijit/_PaletteMixin":function(){define("dijit/_PaletteMixin",["dojo/_base/declare","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/_base/event","dojo/keys","dojo/_base/lang","./_CssStateMixin","./focus","./typematic"],function(_759,_75a,_75b,_75c,_75d,keys,lang,_75e,_75f,_760){return _759("dijit._PaletteMixin",[_75e],{defaultTimeout:500,timeoutChangeRate:0.9,value:"",_selectedCell:-1,tabIndex:"0",cellClass:"dijitPaletteCell",dyeClass:"",summary:"",_setSummaryAttr:"paletteTableNode",_dyeFactory:function(_761){var _762=lang.getObject(this.dyeClass);return new _762(_761);},_preparePalette:function(_763,_764){this._cells=[];var url=this._blankGif;this.connect(this.gridNode,"ondijitclick","_onCellClick");for(var row=0;row<_763.length;row++){var _765=_75c.create("tr",{tabIndex:"-1"},this.gridNode);for(var col=0;col<_763[row].length;col++){var _766=_763[row][col];if(_766){var _767=this._dyeFactory(_766,row,col);var _768=_75c.create("td",{"class":this.cellClass,tabIndex:"-1",title:_764[_766],role:"gridcell"});_767.fillCell(_768,url);_75c.place(_768,_765);_768.index=this._cells.length;this._cells.push({node:_768,dye:_767});}}}this._xDim=_763[0].length;this._yDim=_763.length;var _769={UP_ARROW:-this._xDim,DOWN_ARROW:this._xDim,RIGHT_ARROW:this.isLeftToRight()?1:-1,LEFT_ARROW:this.isLeftToRight()?-1:1};for(var key in _769){this._connects.push(_760.addKeyListener(this.domNode,{charOrCode:keys[key],ctrlKey:false,altKey:false,shiftKey:false},this,function(){var _76a=_769[key];return function(_76b){this._navigateByKey(_76a,_76b);};}(),this.timeoutChangeRate,this.defaultTimeout));}},postCreate:function(){this.inherited(arguments);this._setCurrent(this._cells[0].node);},focus:function(){_75f.focus(this._currentFocus);},_onCellClick:function(evt){var _76c=evt.target;while(_76c.tagName!="TD"){if(!_76c.parentNode||_76c==this.gridNode){return;}_76c=_76c.parentNode;}var _76d=this._getDye(_76c).getValue();this._setCurrent(_76c);_75f.focus(_76c);this._setValueAttr(_76d,true);_75d.stop(evt);},_setCurrent:function(node){if("_currentFocus" in this){_75a.set(this._currentFocus,"tabIndex","-1");}this._currentFocus=node;if(node){_75a.set(node,"tabIndex",this.tabIndex);}},_setValueAttr:function(_76e,_76f){if(this._selectedCell>=0){_75b.remove(this._cells[this._selectedCell].node,this.cellClass+"Selected");}this._selectedCell=-1;if(_76e){for(var i=0;i<this._cells.length;i++){if(_76e==this._cells[i].dye.getValue()){this._selectedCell=i;_75b.add(this._cells[i].node,this.cellClass+"Selected");break;}}}this._set("value",this._selectedCell>=0?_76e:null);if(_76f||_76f===undefined){this.onChange(_76e);}},onChange:function(){},_navigateByKey:function(_770,_771){if(_771==-1){return;}var _772=this._currentFocus.index+_770;if(_772<this._cells.length&&_772>-1){var _773=this._cells[_772].node;this._setCurrent(_773);setTimeout(lang.hitch(dijit,"focus",_773),0);}},_getDye:function(cell){return this._cells[cell.index].dye;}});});},"dijit/form/ValidationTextBox":function(){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","dojo/i18n","./TextBox","../Tooltip","dojo/text!./templates/ValidationTextBox.html","dojo/i18n!./nls/validate"],function(_774,i18n,_775,_776,_777){return _774("dijit.form.ValidationTextBox",_775,{templateString:_777,baseClass:"dijitTextBox dijitValidationTextBox",required:false,promptMessage:"",invalidMessage:"$_unset_$",missingMessage:"$_unset_$",message:"",constraints:{},regExp:".*",regExpGen:function(){return this.regExp;},state:"",tooltipPosition:[],_setValueAttr:function(){this.inherited(arguments);this.validate(this.focused);},validator:function(_778,_779){return (new RegExp("^(?:"+this.regExpGen(_779)+")"+(this.required?"":"?")+"$")).test(_778)&&(!this.required||!this._isEmpty(_778))&&(this._isEmpty(_778)||this.parse(_778,_779)!==undefined);},_isValidSubset:function(){return this.textbox.value.search(this._partialre)==0;},isValid:function(){return this.validator(this.textbox.value,this.constraints);},_isEmpty:function(_77a){return (this.trim?/^\s*$/:/^$/).test(_77a);},getErrorMessage:function(){return (this.required&&this._isEmpty(this.textbox.value))?this.missingMessage:this.invalidMessage;},getPromptMessage:function(){return this.promptMessage;},_maskValidSubsetError:true,validate:function(_77b){var _77c="";var _77d=this.disabled||this.isValid(_77b);if(_77d){this._maskValidSubsetError=true;}var _77e=this._isEmpty(this.textbox.value);var _77f=!_77d&&_77b&&this._isValidSubset();this._set("state",_77d?"":(((((!this._hasBeenBlurred||_77b)&&_77e)||_77f)&&this._maskValidSubsetError)?"Incomplete":"Error"));this.focusNode.setAttribute("aria-invalid",_77d?"false":"true");if(this.state=="Error"){this._maskValidSubsetError=_77b&&_77f;_77c=this.getErrorMessage(_77b);}else{if(this.state=="Incomplete"){_77c=this.getPromptMessage(_77b);this._maskValidSubsetError=!this._hasBeenBlurred||_77b;}else{if(_77e){_77c=this.getPromptMessage(_77b);}}}this.set("message",_77c);return _77d;},displayMessage:function(_780){if(_780&&this.focused){_776.show(_780,this.domNode,this.tooltipPosition,!this.isLeftToRight());}else{_776.hide(this.domNode);}},_refreshState:function(){this.validate(this.focused);this.inherited(arguments);},constructor:function(){this.constraints={};},_setConstraintsAttr:function(_781){if(!_781.locale&&this.lang){_781.locale=this.lang;}this._set("constraints",_781);this._computePartialRE();},_computePartialRE:function(){var p=this.regExpGen(this.constraints);this.regExp=p;var _782="";if(p!=".*"){this.regExp.replace(/\\.|\[\]|\[.*?[^\\]{1}\]|\{.*?\}|\(\?[=:!]|./g,function(re){switch(re.charAt(0)){case "{":case "+":case "?":case "*":case "^":case "$":case "|":case "(":_782+=re;break;case ")":_782+="|$)";break;default:_782+="(?:"+re+"|$)";break;}});}try{"".search(_782);}catch(e){_782=this.regExp;console.warn("RegExp error in "+this.declaredClass+": "+this.regExp);}this._partialre="^(?:"+_782+")$";},postMixInProperties:function(){this.inherited(arguments);this.messages=i18n.getLocalization("dijit.form","validate",this.lang);if(this.invalidMessage=="$_unset_$"){this.invalidMessage=this.messages.invalidMessage;}if(!this.invalidMessage){this.invalidMessage=this.promptMessage;}if(this.missingMessage=="$_unset_$"){this.missingMessage=this.messages.missingMessage;}if(!this.missingMessage){this.missingMessage=this.invalidMessage;}this._setConstraintsAttr(this.constraints);},_setDisabledAttr:function(_783){this.inherited(arguments);this._refreshState();},_setRequiredAttr:function(_784){this._set("required",_784);this.focusNode.setAttribute("aria-required",_784);this._refreshState();},_setMessageAttr:function(_785){this._set("message",_785);this.displayMessage(_785);},reset:function(){this._maskValidSubsetError=true;this.inherited(arguments);},_onBlur:function(){this.displayMessage("");this.inherited(arguments);}});});},"dijit/_base/typematic":function(){define("dijit/_base/typematic",["../typematic"],function(){});},"dijit/_base":function(){define("dijit/_base",[".","./a11y","./WidgetSet","./_base/focus","./_base/manager","./_base/place","./_base/popup","./_base/scroll","./_base/sniff","./_base/typematic","./_base/wai","./_base/window"],function(_786){return _786._base;});},"dijit/layout/BorderContainer":function(){define("dijit/layout/BorderContainer",["dojo/_base/array","dojo/cookie","dojo/_base/declare","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/keys","dojo/_base/lang","dojo/on","dojo/touch","dojo/_base/window","../_WidgetBase","../_Widget","../_TemplatedMixin","./_LayoutWidget","./utils"],function(_787,_788,_789,_78a,_78b,_78c,_78d,_78e,keys,lang,on,_78f,win,_790,_791,_792,_793,_794){var _795=_789("dijit.layout._Splitter",[_791,_792],{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);_78a.add(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V"));if(this.container.persist){var _796=_788(this._cookieName);if(_796){this.child.domNode.style[this.horizontal?"height":"width"]=_796;}}},_computeMaxSize:function(){var dim=this.horizontal?"h":"w",_797=_78c.getMarginBox(this.child.domNode)[dim],_798=_787.filter(this.container.getChildren(),function(_799){return _799.region=="center";})[0],_79a=_78c.getMarginBox(_798.domNode)[dim];return Math.min(this.child.maxSize,_797+_79a);},_startDrag:function(e){if(!this.cover){this.cover=win.doc.createElement("div");_78a.add(this.cover,"dijitSplitterCover");_78b.place(this.cover,this.child.domNode,"after");}_78a.add(this.cover,"dijitSplitterCoverActive");if(this.fake){_78b.destroy(this.fake);}if(!(this._resize=this.live)){(this.fake=this.domNode.cloneNode(true)).removeAttribute("id");_78a.add(this.domNode,"dijitSplitterShadow");_78b.place(this.fake,this.domNode,"after");}_78a.add(this.domNode,"dijitSplitterActive dijitSplitter"+(this.horizontal?"H":"V")+"Active");if(this.fake){_78a.remove(this.fake,"dijitSplitterHover dijitSplitter"+(this.horizontal?"H":"V")+"Hover");}var _79b=this._factor,_79c=this.horizontal,axis=_79c?"pageY":"pageX",_79d=e[axis],_79e=this.domNode.style,dim=_79c?"h":"w",_79f=_78c.getMarginBox(this.child.domNode)[dim],max=this._computeMaxSize(),min=this.child.minSize||20,_7a0=this.region,_7a1=_7a0=="top"||_7a0=="bottom"?"top":"left",_7a2=parseInt(_79e[_7a1],10),_7a3=this._resize,_7a4=lang.hitch(this.container,"_layoutChildren",this.child.id),de=win.doc;this._handlers=this._handlers.concat([on(de,_78f.move,this._drag=function(e,_7a5){var _7a6=e[axis]-_79d,_7a7=_79b*_7a6+_79f,_7a8=Math.max(Math.min(_7a7,max),min);if(_7a3||_7a5){_7a4(_7a8);}_79e[_7a1]=_7a6+_7a2+_79b*(_7a8-_7a7)+"px";}),on(de,"dragstart",_78e.stop),on(win.body(),"selectstart",_78e.stop),on(de,_78f.release,lang.hitch(this,"_stopDrag"))]);_78e.stop(e);},_onMouse:function(e){var o=(e.type=="mouseover"||e.type=="mouseenter");_78a.toggle(this.domNode,"dijitSplitterHover",o);_78a.toggle(this.domNode,"dijitSplitter"+(this.horizontal?"H":"V")+"Hover",o);},_stopDrag:function(e){try{if(this.cover){_78a.remove(this.cover,"dijitSplitterCoverActive");}if(this.fake){_78b.destroy(this.fake);}_78a.remove(this.domNode,"dijitSplitterActive dijitSplitter"+(this.horizontal?"H":"V")+"Active dijitSplitterShadow");this._drag(e);this._drag(e,true);}finally{this._cleanupHandlers();delete this._drag;}if(this.container.persist){_788(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(e){this._resize=true;var _7a9=this.horizontal;var tick=1;switch(e.charOrCode){case _7a9?keys.UP_ARROW:keys.LEFT_ARROW:tick*=-1;case _7a9?keys.DOWN_ARROW:keys.RIGHT_ARROW:break;default:return;}var _7aa=_78c.getMarginSize(this.child.domNode)[_7a9?"h":"w"]+this._factor*tick;this.container._layoutChildren(this.child.id,Math.max(Math.min(_7aa,this._computeMaxSize()),this.child.minSize));_78e.stop(e);},destroy:function(){this._cleanupHandlers();delete this.child;delete this.container;delete this.cover;delete this.fake;this.inherited(arguments);}});var _7ab=_789("dijit.layout._Gutter",[_791,_792],{templateString:"<div class=\"dijitGutter\" role=\"presentation\"></div>",postMixInProperties:function(){this.inherited(arguments);this.horizontal=/top|bottom/.test(this.region);},buildRendering:function(){this.inherited(arguments);_78a.add(this.domNode,"dijitGutter"+(this.horizontal?"H":"V"));}});var _7ac=_789("dijit.layout.BorderContainer",_793,{design:"headline",gutters:true,liveSplitters:true,persist:false,baseClass:"dijitBorderContainer",_splitterClass:_795,postMixInProperties:function(){if(!this.gutters){this.baseClass+="NoGutter";}this.inherited(arguments);},startup:function(){if(this._started){return;}_787.forEach(this.getChildren(),this._setupChild,this);this.inherited(arguments);},_setupChild:function(_7ad){var _7ae=_7ad.region;if(_7ae){this.inherited(arguments);_78a.add(_7ad.domNode,this.baseClass+"Pane");var ltr=this.isLeftToRight();if(_7ae=="leading"){_7ae=ltr?"left":"right";}if(_7ae=="trailing"){_7ae=ltr?"right":"left";}if(_7ae!="center"&&(_7ad.splitter||this.gutters)&&!_7ad._splitterWidget){var _7af=_7ad.splitter?this._splitterClass:_7ab;if(lang.isString(_7af)){_7af=lang.getObject(_7af);}var _7b0=new _7af({id:_7ad.id+"_splitter",container:this,child:_7ad,region:_7ae,live:this.liveSplitters});_7b0.isSplitter=true;_7ad._splitterWidget=_7b0;_78b.place(_7b0.domNode,_7ad.domNode,"after");_7b0.startup();}_7ad.region=_7ae;}},layout:function(){this._layoutChildren();},addChild:function(_7b1,_7b2){this.inherited(arguments);if(this._started){this.layout();}},removeChild:function(_7b3){var _7b4=_7b3.region;var _7b5=_7b3._splitterWidget;if(_7b5){_7b5.destroy();delete _7b3._splitterWidget;}this.inherited(arguments);if(this._started){this._layoutChildren();}_78a.remove(_7b3.domNode,this.baseClass+"Pane");_78d.set(_7b3.domNode,{top:"auto",bottom:"auto",left:"auto",right:"auto",position:"static"});_78d.set(_7b3.domNode,_7b4=="top"||_7b4=="bottom"?"width":"height","auto");},getChildren:function(){return _787.filter(this.inherited(arguments),function(_7b6){return !_7b6.isSplitter;});},getSplitter:function(_7b7){return _787.filter(this.getChildren(),function(_7b8){return _7b8.region==_7b7;})[0]._splitterWidget;},resize:function(_7b9,_7ba){if(!this.cs||!this.pe){var node=this.domNode;this.cs=_78d.getComputedStyle(node);this.pe=_78c.getPadExtents(node,this.cs);this.pe.r=_78d.toPixelValue(node,this.cs.paddingRight);this.pe.b=_78d.toPixelValue(node,this.cs.paddingBottom);_78d.set(node,"padding","0px");}this.inherited(arguments);},_layoutChildren:function(_7bb,_7bc){if(!this._borderBox||!this._borderBox.h){return;}var _7bd=_787.map(this.getChildren(),function(_7be,idx){return {pane:_7be,weight:[_7be.region=="center"?Infinity:0,_7be.layoutPriority,(this.design=="sidebar"?1:-1)*(/top|bottom/.test(_7be.region)?1:-1),idx]};},this);_7bd.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;});var _7bf=[];_787.forEach(_7bd,function(_7c0){var pane=_7c0.pane;_7bf.push(pane);if(pane._splitterWidget){_7bf.push(pane._splitterWidget);}});var dim={l:this.pe.l,t:this.pe.t,w:this._borderBox.w-this.pe.w,h:this._borderBox.h-this.pe.h};_794.layoutChildren(this.domNode,dim,_7bf,_7bb,_7bc);},destroyRecursive:function(){_787.forEach(this.getChildren(),function(_7c1){var _7c2=_7c1._splitterWidget;if(_7c2){_7c2.destroy();}delete _7c1._splitterWidget;});this.inherited(arguments);}});lang.extend(_790,{region:"",layoutPriority:0,splitter:false,minSize:0,maxSize:Infinity});_7ac._Splitter=_795;_7ac._Gutter=_7ab;return _7ac;});},"dojo/window":function(){define("dojo/window",["./_base/lang","./_base/sniff","./_base/window","./dom","./dom-geometry","./dom-style"],function(lang,has,_7c3,dom,geom,_7c4){var _7c5=lang.getObject("dojo.window",true);_7c5.getBox=function(){var _7c6=(_7c3.doc.compatMode=="BackCompat")?_7c3.body():_7c3.doc.documentElement,_7c7=geom.docScroll(),w,h;if(has("touch")){var _7c8=_7c3.doc.parentWindow||_7c3.doc.defaultView;w=_7c8.innerWidth||_7c6.clientWidth;h=_7c8.innerHeight||_7c6.clientHeight;}else{w=_7c6.clientWidth;h=_7c6.clientHeight;}return {l:_7c7.x,t:_7c7.y,w:w,h:h};};_7c5.get=function(doc){if(has("ie")&&_7c5!==document.parentWindow){doc.parentWindow.execScript("document._parentWindow = window;","Javascript");var win=doc._parentWindow;doc._parentWindow=null;return win;}return doc.parentWindow||doc.defaultView;};_7c5.scrollIntoView=function(node,pos){try{node=dom.byId(node);var doc=node.ownerDocument||_7c3.doc,body=doc.body||_7c3.body(),html=doc.documentElement||body.parentNode,isIE=has("ie"),isWK=has("webkit");if((!(has("mozilla")||isIE||isWK||has("opera"))||node==body||node==html)&&(typeof node.scrollIntoView!="undefined")){node.scrollIntoView(false);return;}var _7c9=doc.compatMode=="BackCompat",_7ca=(isIE>=9&&node.ownerDocument.parentWindow.frameElement)?((html.clientHeight>0&&html.clientWidth>0&&(body.clientHeight==0||body.clientWidth==0||body.clientHeight>html.clientHeight||body.clientWidth>html.clientWidth))?html:body):(_7c9?body:html),_7cb=isWK?body:_7ca,_7cc=_7ca.clientWidth,_7cd=_7ca.clientHeight,rtl=!geom.isBodyLtr(),_7ce=pos||geom.position(node),el=node.parentNode,_7cf=function(el){return ((isIE<=6||(isIE&&_7c9))?false:(_7c4.get(el,"position").toLowerCase()=="fixed"));};if(_7cf(node)){return;}while(el){if(el==body){el=_7cb;}var _7d0=geom.position(el),_7d1=_7cf(el);if(el==_7cb){_7d0.w=_7cc;_7d0.h=_7cd;if(_7cb==html&&isIE&&rtl){_7d0.x+=_7cb.offsetWidth-_7d0.w;}if(_7d0.x<0||!isIE){_7d0.x=0;}if(_7d0.y<0||!isIE){_7d0.y=0;}}else{var pb=geom.getPadBorderExtents(el);_7d0.w-=pb.w;_7d0.h-=pb.h;_7d0.x+=pb.l;_7d0.y+=pb.t;var _7d2=el.clientWidth,_7d3=_7d0.w-_7d2;if(_7d2>0&&_7d3>0){_7d0.w=_7d2;_7d0.x+=(rtl&&(isIE||el.clientLeft>pb.l))?_7d3:0;}_7d2=el.clientHeight;_7d3=_7d0.h-_7d2;if(_7d2>0&&_7d3>0){_7d0.h=_7d2;}}if(_7d1){if(_7d0.y<0){_7d0.h+=_7d0.y;_7d0.y=0;}if(_7d0.x<0){_7d0.w+=_7d0.x;_7d0.x=0;}if(_7d0.y+_7d0.h>_7cd){_7d0.h=_7cd-_7d0.y;}if(_7d0.x+_7d0.w>_7cc){_7d0.w=_7cc-_7d0.x;}}var l=_7ce.x-_7d0.x,t=_7ce.y-Math.max(_7d0.y,0),r=l+_7ce.w-_7d0.w,bot=t+_7ce.h-_7d0.h;if(r*l>0){var s=Math[l<0?"max":"min"](l,r);if(rtl&&((isIE==8&&!_7c9)||isIE>=9)){s=-s;}_7ce.x+=el.scrollLeft;el.scrollLeft+=s;_7ce.x-=el.scrollLeft;}if(bot*t>0){_7ce.y+=el.scrollTop;el.scrollTop+=Math[t<0?"max":"min"](t,bot);_7ce.y-=el.scrollTop;}el=(el!=_7cb)&&!_7d1&&el.parentNode;}}catch(error){console.error("scrollIntoView: "+error);node.scrollIntoView(false);}};return _7c5;});},"dojo/number":function(){define("dojo/number",["./_base/kernel","./_base/lang","./i18n","./i18n!./cldr/nls/number","./string","./regexp"],function(dojo,lang,i18n,_7d4,_7d5,_7d6){lang.getObject("number",true,dojo);dojo.number.format=function(_7d7,_7d8){_7d8=lang.mixin({},_7d8||{});var _7d9=i18n.normalizeLocale(_7d8.locale),_7da=i18n.getLocalization("dojo.cldr","number",_7d9);_7d8.customs=_7da;var _7db=_7d8.pattern||_7da[(_7d8.type||"decimal")+"Format"];if(isNaN(_7d7)||Math.abs(_7d7)==Infinity){return null;}return dojo.number._applyPattern(_7d7,_7db,_7d8);};dojo.number._numberPatternRE=/[#0,]*[#0](?:\.0*#*)?/;dojo.number._applyPattern=function(_7dc,_7dd,_7de){_7de=_7de||{};var _7df=_7de.customs.group,_7e0=_7de.customs.decimal,_7e1=_7dd.split(";"),_7e2=_7e1[0];_7dd=_7e1[(_7dc<0)?1:0]||("-"+_7e2);if(_7dd.indexOf("%")!=-1){_7dc*=100;}else{if(_7dd.indexOf("‰")!=-1){_7dc*=1000;}else{if(_7dd.indexOf("¤")!=-1){_7df=_7de.customs.currencyGroup||_7df;_7e0=_7de.customs.currencyDecimal||_7e0;_7dd=_7dd.replace(/\u00a4{1,3}/,function(_7e3){var prop=["symbol","currency","displayName"][_7e3.length-1];return _7de[prop]||_7de.currency||"";});}else{if(_7dd.indexOf("E")!=-1){throw new Error("exponential notation not supported");}}}}var _7e4=dojo.number._numberPatternRE;var _7e5=_7e2.match(_7e4);if(!_7e5){throw new Error("unable to find a number expression in pattern: "+_7dd);}if(_7de.fractional===false){_7de.places=0;}return _7dd.replace(_7e4,dojo.number._formatAbsolute(_7dc,_7e5[0],{decimal:_7e0,group:_7df,places:_7de.places,round:_7de.round}));};dojo.number.round=function(_7e6,_7e7,_7e8){var _7e9=10/(_7e8||10);return (_7e9*+_7e6).toFixed(_7e7)/_7e9;};if((0.9).toFixed()==0){var _7ea=dojo.number.round;dojo.number.round=function(v,p,m){var d=Math.pow(10,-p||0),a=Math.abs(v);if(!v||a>=d||a*Math.pow(10,p+1)<5){d=0;}return _7ea(v,p,m)+(v>0?d:-d);};}dojo.number._formatAbsolute=function(_7eb,_7ec,_7ed){_7ed=_7ed||{};if(_7ed.places===true){_7ed.places=0;}if(_7ed.places===Infinity){_7ed.places=6;}var _7ee=_7ec.split("."),_7ef=typeof _7ed.places=="string"&&_7ed.places.indexOf(","),_7f0=_7ed.places;if(_7ef){_7f0=_7ed.places.substring(_7ef+1);}else{if(!(_7f0>=0)){_7f0=(_7ee[1]||[]).length;}}if(!(_7ed.round<0)){_7eb=dojo.number.round(_7eb,_7f0,_7ed.round);}var _7f1=String(Math.abs(_7eb)).split("."),_7f2=_7f1[1]||"";if(_7ee[1]||_7ed.places){if(_7ef){_7ed.places=_7ed.places.substring(0,_7ef);}var pad=_7ed.places!==undefined?_7ed.places:(_7ee[1]&&_7ee[1].lastIndexOf("0")+1);if(pad>_7f2.length){_7f1[1]=_7d5.pad(_7f2,pad,"0",true);}if(_7f0<_7f2.length){_7f1[1]=_7f2.substr(0,_7f0);}}else{if(_7f1[1]){_7f1.pop();}}var _7f3=_7ee[0].replace(",","");pad=_7f3.indexOf("0");if(pad!=-1){pad=_7f3.length-pad;if(pad>_7f1[0].length){_7f1[0]=_7d5.pad(_7f1[0],pad);}if(_7f3.indexOf("#")==-1){_7f1[0]=_7f1[0].substr(_7f1[0].length-pad);}}var _7f4=_7ee[0].lastIndexOf(","),_7f5,_7f6;if(_7f4!=-1){_7f5=_7ee[0].length-_7f4-1;var _7f7=_7ee[0].substr(0,_7f4);_7f4=_7f7.lastIndexOf(",");if(_7f4!=-1){_7f6=_7f7.length-_7f4-1;}}var _7f8=[];for(var _7f9=_7f1[0];_7f9;){var off=_7f9.length-_7f5;_7f8.push((off>0)?_7f9.substr(off):_7f9);_7f9=(off>0)?_7f9.slice(0,off):"";if(_7f6){_7f5=_7f6;delete _7f6;}}_7f1[0]=_7f8.reverse().join(_7ed.group||",");return _7f1.join(_7ed.decimal||".");};dojo.number.regexp=function(_7fa){return dojo.number._parseInfo(_7fa).regexp;};dojo.number._parseInfo=function(_7fb){_7fb=_7fb||{};var _7fc=i18n.normalizeLocale(_7fb.locale),_7fd=i18n.getLocalization("dojo.cldr","number",_7fc),_7fe=_7fb.pattern||_7fd[(_7fb.type||"decimal")+"Format"],_7ff=_7fd.group,_800=_7fd.decimal,_801=1;if(_7fe.indexOf("%")!=-1){_801/=100;}else{if(_7fe.indexOf("‰")!=-1){_801/=1000;}else{var _802=_7fe.indexOf("¤")!=-1;if(_802){_7ff=_7fd.currencyGroup||_7ff;_800=_7fd.currencyDecimal||_800;}}}var _803=_7fe.split(";");if(_803.length==1){_803.push("-"+_803[0]);}var re=_7d6.buildGroupRE(_803,function(_804){_804="(?:"+_7d6.escapeString(_804,".")+")";return _804.replace(dojo.number._numberPatternRE,function(_805){var _806={signed:false,separator:_7fb.strict?_7ff:[_7ff,""],fractional:_7fb.fractional,decimal:_800,exponent:false},_807=_805.split("."),_808=_7fb.places;if(_807.length==1&&_801!=1){_807[1]="###";}if(_807.length==1||_808===0){_806.fractional=false;}else{if(_808===undefined){_808=_7fb.pattern?_807[1].lastIndexOf("0")+1:Infinity;}if(_808&&_7fb.fractional==undefined){_806.fractional=true;}if(!_7fb.places&&(_808<_807[1].length)){_808+=","+_807[1].length;}_806.places=_808;}var _809=_807[0].split(",");if(_809.length>1){_806.groupSize=_809.pop().length;if(_809.length>1){_806.groupSize2=_809.pop().length;}}return "("+dojo.number._realNumberRegexp(_806)+")";});},true);if(_802){re=re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g,function(_80a,_80b,_80c,_80d){var prop=["symbol","currency","displayName"][_80c.length-1],_80e=_7d6.escapeString(_7fb[prop]||_7fb.currency||"");_80b=_80b?"[\\s\\xa0]":"";_80d=_80d?"[\\s\\xa0]":"";if(!_7fb.strict){if(_80b){_80b+="*";}if(_80d){_80d+="*";}return "(?:"+_80b+_80e+_80d+")?";}return _80b+_80e+_80d;});}return {regexp:re.replace(/[\xa0 ]/g,"[\\s\\xa0]"),group:_7ff,decimal:_800,factor:_801};};dojo.number.parse=function(_80f,_810){var info=dojo.number._parseInfo(_810),_811=(new RegExp("^"+info.regexp+"$")).exec(_80f);if(!_811){return NaN;}var _812=_811[1];if(!_811[1]){if(!_811[2]){return NaN;}_812=_811[2];info.factor*=-1;}_812=_812.replace(new RegExp("["+info.group+"\\s\\xa0"+"]","g"),"").replace(info.decimal,".");return _812*info.factor;};dojo.number._realNumberRegexp=function(_813){_813=_813||{};if(!("places" in _813)){_813.places=Infinity;}if(typeof _813.decimal!="string"){_813.decimal=".";}if(!("fractional" in _813)||/^0/.test(_813.places)){_813.fractional=[true,false];}if(!("exponent" in _813)){_813.exponent=[true,false];}if(!("eSigned" in _813)){_813.eSigned=[true,false];}var _814=dojo.number._integerRegexp(_813),_815=_7d6.buildGroupRE(_813.fractional,function(q){var re="";if(q&&(_813.places!==0)){re="\\"+_813.decimal;if(_813.places==Infinity){re="(?:"+re+"\\d+)?";}else{re+="\\d{"+_813.places+"}";}}return re;},true);var _816=_7d6.buildGroupRE(_813.exponent,function(q){if(q){return "([eE]"+dojo.number._integerRegexp({signed:_813.eSigned})+")";}return "";});var _817=_814+_815;if(_815){_817="(?:(?:"+_817+")|(?:"+_815+"))";}return _817+_816;};dojo.number._integerRegexp=function(_818){_818=_818||{};if(!("signed" in _818)){_818.signed=[true,false];}if(!("separator" in _818)){_818.separator="";}else{if(!("groupSize" in _818)){_818.groupSize=3;}}var _819=_7d6.buildGroupRE(_818.signed,function(q){return q?"[-+]":"";},true);var _81a=_7d6.buildGroupRE(_818.separator,function(sep){if(!sep){return "(?:\\d+)";}sep=_7d6.escapeString(sep);if(sep==" "){sep="\\s";}else{if(sep==" "){sep="\\s\\xa0";}}var grp=_818.groupSize,grp2=_818.groupSize2;if(grp2){var _81b="(?:0|[1-9]\\d{0,"+(grp2-1)+"}(?:["+sep+"]\\d{"+grp2+"})*["+sep+"]\\d{"+grp+"})";return ((grp-grp2)>0)?"(?:"+_81b+"|(?:0|[1-9]\\d{0,"+(grp-1)+"}))":_81b;}return "(?:0|[1-9]\\d{0,"+(grp-1)+"}(?:["+sep+"]\\d{"+grp+"})*)";},true);return _819+_81a;};return dojo.number;});},"dijit/_FocusMixin":function(){define("dijit/_FocusMixin",["./focus","./_WidgetBase","dojo/_base/declare","dojo/_base/lang"],function(_81c,_81d,_81e,lang){lang.extend(_81d,{focused:false,onFocus:function(){},onBlur:function(){},_onFocus:function(){this.onFocus();},_onBlur:function(){this.onBlur();}});return _81e("dijit._FocusMixin",null,{_focusManager:_81c});});},"dojo/data/util/filter":function(){define("dojo/data/util/filter",["dojo/_base/lang"],function(lang){var _81f=lang.getObject("dojo.data.util.filter",true);_81f.patternToRegExp=function(_820,_821){var rxp="^";var c=null;for(var i=0;i<_820.length;i++){c=_820.charAt(i);switch(c){case "\\":rxp+=c;i++;rxp+=_820.charAt(i);break;case "*":rxp+=".*";break;case "?":rxp+=".";break;case "$":case "^":case "/":case "+":case ".":case "|":case "(":case ")":case "{":case "}":case "[":case "]":rxp+="\\";default:rxp+=c;}}rxp+="$";if(_821){return new RegExp(rxp,"mi");}else{return new RegExp(rxp,"m");}};return _81f;});},"dijit/_WidgetsInTemplateMixin":function(){define("dijit/_WidgetsInTemplateMixin",["dojo/_base/array","dojo/_base/declare","dojo/parser","dijit/registry"],function(_822,_823,_824,_825){return _823("dijit._WidgetsInTemplateMixin",null,{_earlyTemplatedStartup:false,widgetsInTemplate:true,_beforeFillContent:function(){if(this.widgetsInTemplate){var node=this.domNode;var cw=(this._startupWidgets=_824.parse(node,{noStart:!this._earlyTemplatedStartup,template:true,inherited:{dir:this.dir,lang:this.lang,textDir:this.textDir},propsThis:this,scope:"dojo"}));this._supportingWidgets=_825.findWidgets(node);this._attachTemplateNodes(cw,function(n,p){return n[p];});}},startup:function(){_822.forEach(this._startupWidgets,function(w){if(w&&!w._started&&w.startup){w.startup();}});this.inherited(arguments);}});});},"dojo/fx/Toggler":function(){define("dojo/fx/Toggler",["../_base/lang","../_base/declare","../_base/fx","../_base/connect"],function(lang,_826,_827,_828){return _826("dojo.fx.Toggler",null,{node:null,showFunc:_827.fadeIn,hideFunc:_827.fadeOut,showDuration:200,hideDuration:200,constructor:function(args){var _829=this;lang.mixin(_829,args);_829.node=args.node;_829._showArgs=lang.mixin({},args);_829._showArgs.node=_829.node;_829._showArgs.duration=_829.showDuration;_829.showAnim=_829.showFunc(_829._showArgs);_829._hideArgs=lang.mixin({},args);_829._hideArgs.node=_829.node;_829._hideArgs.duration=_829.hideDuration;_829.hideAnim=_829.hideFunc(_829._hideArgs);_828.connect(_829.showAnim,"beforeBegin",lang.hitch(_829.hideAnim,"stop",true));_828.connect(_829.hideAnim,"beforeBegin",lang.hitch(_829.showAnim,"stop",true));},show:function(_82a){return this.showAnim.play(_82a||0);},hide:function(_82b){return this.hideAnim.play(_82b||0);}});});},"dijit/form/FilteringSelect":function(){define("dijit/form/FilteringSelect",["dojo/data/util/filter","dojo/_base/declare","dojo/_base/Deferred","dojo/_base/lang","./MappedTextBox","./ComboBoxMixin"],function(_82c,_82d,_82e,lang,_82f,_830){return _82d("dijit.form.FilteringSelect",[_82f,_830],{required:true,_lastDisplayedValue:"",_isValidSubset:function(){return this._opened;},isValid:function(){return !!this.item||(!this.required&&this.get("displayedValue")=="");},_refreshState:function(){if(!this.searchTimer){this.inherited(arguments);}},_callbackSetLabel:function(_831,_832,_833,_834){if((_832&&_832[this.searchAttr]!==this._lastQuery)||(!_832&&_831.length&&this.store.getIdentity(_831[0])!=this._lastQuery)){return;}if(!_831.length){this.set("value","",_834||(_834===undefined&&!this.focused),this.textbox.value,null);}else{this.set("item",_831[0],_834);}},_openResultList:function(_835,_836,_837){if(_836[this.searchAttr]!==this._lastQuery){return;}this.inherited(arguments);if(this.item===undefined){this.validate(true);}},_getValueAttr:function(){return this.valueNode.value;},_getValueField:function(){return "value";},_setValueAttr:function(_838,_839,_83a,item){if(!this._onChangeActive){_839=null;}if(item===undefined){if(_838===null||_838===""){_838="";if(!lang.isString(_83a)){this._setDisplayedValueAttr(_83a||"",_839);return;}}var self=this;this._lastQuery=_838;_82e.when(this.store.get(_838),function(item){self._callbackSetLabel(item?[item]:[],undefined,undefined,_839);});}else{this.valueNode.value=_838;this.inherited(arguments);}},_setItemAttr:function(item,_83b,_83c){this.inherited(arguments);this._lastDisplayedValue=this.textbox.value;},_getDisplayQueryString:function(text){return text.replace(/([\\\*\?])/g,"\\$1");},_setDisplayedValueAttr:function(_83d,_83e){if(_83d==null){_83d="";}if(!this._created){if(!("displayedValue" in this.params)){return;}_83e=false;}if(this.store){this.closeDropDown();var _83f=lang.clone(this.query);var qs=this._getDisplayQueryString(_83d),q;if(this.store._oldAPI){q=qs;}else{q=_82c.patternToRegExp(qs,this.ignoreCase);q.toString=function(){return qs;};}this._lastQuery=_83f[this.searchAttr]=q;this.textbox.value=_83d;this._lastDisplayedValue=_83d;this._set("displayedValue",_83d);var _840=this;var _841={ignoreCase:this.ignoreCase,deep:true};lang.mixin(_841,this.fetchProperties);this._fetchHandle=this.store.query(_83f,_841);_82e.when(this._fetchHandle,function(_842){_840._fetchHandle=null;_840._callbackSetLabel(_842||[],_83f,_841,_83e);},function(err){_840._fetchHandle=null;if(!_840._cancelingQuery){console.error("dijit.form.FilteringSelect: "+err.toString());}});}},undo:function(){this.set("displayedValue",this._lastDisplayedValue);}});});},"dojo/data/util/sorter":function(){define("dojo/data/util/sorter",["dojo/_base/lang"],function(lang){var _843=lang.getObject("dojo.data.util.sorter",true);_843.basicComparator=function(a,b){var r=-1;if(a===null){a=undefined;}if(b===null){b=undefined;}if(a==b){r=0;}else{if(a>b||a==null){r=1;}}return r;};_843.createSortFunction=function(_844,_845){var _846=[];function _847(attr,dir,comp,s){return function(_848,_849){var a=s.getValue(_848,attr);var b=s.getValue(_849,attr);return dir*comp(a,b);};};var _84a;var map=_845.comparatorMap;var bc=_843.basicComparator;for(var i=0;i<_844.length;i++){_84a=_844[i];var attr=_84a.attribute;if(attr){var dir=(_84a.descending)?-1:1;var comp=bc;if(map){if(typeof attr!=="string"&&("toString" in attr)){attr=attr.toString();}comp=map[attr]||bc;}_846.push(_847(attr,dir,comp,_845));}}return function(rowA,rowB){var i=0;while(i<_846.length){var ret=_846[i++](rowA,rowB);if(ret!==0){return ret;}}return 0;};};return _843;});},"dijit/form/_ButtonMixin":function(){define("dijit/form/_ButtonMixin",["dojo/_base/declare","dojo/dom","dojo/_base/event","../registry"],function(_84b,dom,_84c,_84d){return _84b("dijit.form._ButtonMixin",null,{label:"",type:"button",_onClick:function(e){if(this.disabled){_84c.stop(e);return false;}var _84e=this.onClick(e)===false;if(!_84e&&this.type=="submit"&&!(this.valueNode||this.focusNode).form){for(var node=this.domNode;node.parentNode;node=node.parentNode){var _84f=_84d.byNode(node);if(_84f&&typeof _84f._onSubmit=="function"){_84f._onSubmit(e);_84e=true;break;}}}if(_84e){e.preventDefault();}return !_84e;},postCreate:function(){this.inherited(arguments);dom.setSelectable(this.focusNode,false);},onClick:function(){return true;},_setLabelAttr:function(_850){this._set("label",_850);(this.containerNode||this.focusNode).innerHTML=_850;}});});},"dojo/colors":function(){define("dojo/colors",["./_base/kernel","./_base/lang","./_base/Color","./_base/array"],function(dojo,lang,_851,_852){var _853=lang.getObject("dojo.colors",true);var _854=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=_851.fromRgb=function(_855,obj){var m=_855.toLowerCase().match(/^(rgba?|hsla?)\(([\s\.\-,%0-9]+)\)/);if(m){var c=m[2].split(/\s*,\s*/),l=c.length,t=m[1],a;if((t=="rgb"&&l==3)||(t=="rgba"&&l==4)){var r=c[0];if(r.charAt(r.length-1)=="%"){a=_852.map(c,function(x){return parseFloat(x)*2.56;});if(l==4){a[3]=c[3];}return _851.fromArray(a,obj);}return _851.fromArray(c,obj);}if((t=="hsl"&&l==3)||(t=="hsla"&&l==4)){var H=((parseFloat(c[0])%360)+360)%360/360,S=parseFloat(c[1])/100,L=parseFloat(c[2])/100,m2=L<=0.5?L*(S+1):L+S-L*S,m1=2*L-m2;a=[_854(m1,m2,H+1/3)*256,_854(m1,m2,H)*256,_854(m1,m2,H-1/3)*256,1];if(l==4){a[3]=c[3];}return _851.fromArray(a,obj);}}return null;};var _856=function(c,low,high){c=Number(c);return isNaN(c)?high:c<low?low:c>high?high:c;};_851.prototype.sanitize=function(){var t=this;t.r=Math.round(_856(t.r,0,255));t.g=Math.round(_856(t.g,0,255));t.b=Math.round(_856(t.b,0,255));t.a=_856(t.a,0,1);return this;};_853.makeGrey=_851.makeGrey=function(g,a){return _851.fromArray([g,g,g,a]);};lang.mixin(_851.named,{"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],"turquoise":[64,224,208],"violet":[238,130,238],"wheat":[245,222,179],"whitesmoke":[245,245,245],"yellowgreen":[154,205,50]});return _851;});},"dijit/registry":function(){define("dijit/registry",["dojo/_base/array","dojo/_base/sniff","dojo/_base/unload","dojo/_base/window","."],function(_857,has,_858,win,_859){var _85a={},hash={};var _85b={length:0,add:function(_85c){if(hash[_85c.id]){throw new Error("Tried to register widget with id=="+_85c.id+" but that id is already registered");}hash[_85c.id]=_85c;this.length++;},remove:function(id){if(hash[id]){delete hash[id];this.length--;}},byId:function(id){return typeof id=="string"?hash[id]:id;},byNode:function(node){return hash[node.getAttribute("widgetId")];},toArray:function(){var ar=[];for(var id in hash){ar.push(hash[id]);}return ar;},getUniqueId:function(_85d){var id;do{id=_85d+"_"+(_85d in _85a?++_85a[_85d]:_85a[_85d]=0);}while(hash[id]);return _859._scopeName=="dijit"?id:_859._scopeName+"_"+id;},findWidgets:function(root){var _85e=[];function _85f(root){for(var node=root.firstChild;node;node=node.nextSibling){if(node.nodeType==1){var _860=node.getAttribute("widgetId");if(_860){var _861=hash[_860];if(_861){_85e.push(_861);}}else{_85f(node);}}}};_85f(root);return _85e;},_destroyAll:function(){_859._curFocus=null;_859._prevFocus=null;_859._activeStack=[];_857.forEach(_85b.findWidgets(win.body()),function(_862){if(!_862._destroyed){if(_862.destroyRecursive){_862.destroyRecursive();}else{if(_862.destroy){_862.destroy();}}}});},getEnclosingWidget:function(node){while(node){var id=node.getAttribute&&node.getAttribute("widgetId");if(id){return hash[id];}node=node.parentNode;}return null;},_hash:hash};if(has("ie")){_858.addOnWindowUnload(function(){_85b._destroyAll();});}_859.registry=_85b;return _85b;});},"dijit/tree/_dndContainer":function(){define("dijit/tree/_dndContainer",["dojo/aspect","dojo/_base/declare","dojo/dom-class","dojo/_base/event","dojo/_base/lang","dojo/mouse","dojo/on"],function(_863,_864,_865,_866,lang,_867,on){return _864("dijit.tree._dndContainer",null,{constructor:function(tree,_868){this.tree=tree;this.node=tree.domNode;lang.mixin(this,_868);this.current=null;this.containerState="";_865.add(this.node,"dojoDndContainer");this.events=[on(this.node,_867.enter,lang.hitch(this,"onOverEvent")),on(this.node,_867.leave,lang.hitch(this,"onOutEvent")),_863.after(this.tree,"_onNodeMouseEnter",lang.hitch(this,"onMouseOver"),true),_863.after(this.tree,"_onNodeMouseLeave",lang.hitch(this,"onMouseOut"),true),on(this.node,"dragstart",lang.hitch(_866,"stop")),on(this.node,"selectstart",lang.hitch(_866,"stop"))];},destroy:function(){var h;while(h=this.events.pop()){h.remove();}this.node=this.parent=null;},onMouseOver:function(_869){this.current=_869;},onMouseOut:function(){this.current=null;},_changeState:function(type,_86a){var _86b="dojoDnd"+type;var _86c=type.toLowerCase()+"State";_865.replace(this.node,_86b+_86a,_86b+this[_86c]);this[_86c]=_86a;},_addItemClass:function(node,type){_865.add(node,"dojoDndItem"+type);},_removeItemClass:function(node,type){_865.remove(node,"dojoDndItem"+type);},onOverEvent:function(){this._changeState("Container","Over");},onOutEvent:function(){this._changeState("Container","");}});});},"url:dijit/templates/InlineEditBox.html":"<span data-dojo-attach-point=\"editNode\" role=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\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","dijit/_base/wai":function(){define("dijit/_base/wai",["dojo/dom-attr","dojo/_base/lang","..","../hccss"],function(_86d,lang,_86e){lang.mixin(_86e,{hasWaiRole:function(elem,role){var _86f=this.getWaiRole(elem);return role?(_86f.indexOf(role)>-1):(_86f.length>0);},getWaiRole:function(elem){return lang.trim((_86d.get(elem,"role")||"").replace("wairole:",""));},setWaiRole:function(elem,role){_86d.set(elem,"role",role);},removeWaiRole:function(elem,role){var _870=_86d.get(elem,"role");if(!_870){return;}if(role){var t=lang.trim((" "+_870+" ").replace(" "+role+" "," "));_86d.set(elem,"role",t);}else{elem.removeAttribute("role");}},hasWaiState:function(elem,_871){return elem.hasAttribute?elem.hasAttribute("aria-"+_871):!!elem.getAttribute("aria-"+_871);},getWaiState:function(elem,_872){return elem.getAttribute("aria-"+_872)||"";},setWaiState:function(elem,_873,_874){elem.setAttribute("aria-"+_873,_874);},removeWaiState:function(elem,_875){elem.removeAttribute("aria-"+_875);}});return _86e;});},"dijit/form/_FormSelectWidget":function(){define("dijit/form/_FormSelectWidget",["dojo/_base/array","dojo/aspect","dojo/data/util/sorter","dojo/_base/declare","dojo/dom","dojo/dom-class","dojo/_base/kernel","dojo/_base/lang","dojo/query","./_FormValueWidget"],function(_876,_877,_878,_879,dom,_87a,_87b,lang,_87c,_87d){return _879("dijit.form._FormSelectWidget",_87d,{multiple:false,options:null,store:null,query:null,queryOptions:null,onFetch:null,sortByLabel:true,loadChildrenOnOpen:false,getOptions:function(_87e){var _87f=_87e,opts=this.options||[],l=opts.length;if(_87f===undefined){return opts;}if(lang.isArray(_87f)){return _876.map(_87f,"return this.getOptions(item);",this);}if(lang.isObject(_87e)){if(!_876.some(this.options,function(o,idx){if(o===_87f||(o.value&&o.value===_87f.value)){_87f=idx;return true;}return false;})){_87f=-1;}}if(typeof _87f=="string"){for(var i=0;i<l;i++){if(opts[i].value===_87f){_87f=i;break;}}}if(typeof _87f=="number"&&_87f>=0&&_87f<l){return this.options[_87f];}return null;},addOption:function(_880){if(!lang.isArray(_880)){_880=[_880];}_876.forEach(_880,function(i){if(i&&lang.isObject(i)){this.options.push(i);}},this);this._loadChildren();},removeOption:function(_881){if(!lang.isArray(_881)){_881=[_881];}var _882=this.getOptions(_881);_876.forEach(_882,function(i){if(i){this.options=_876.filter(this.options,function(node){return (node.value!==i.value||node.label!==i.label);});this._removeOptionItem(i);}},this);this._loadChildren();},updateOption:function(_883){if(!lang.isArray(_883)){_883=[_883];}_876.forEach(_883,function(i){var _884=this.getOptions(i),k;if(_884){for(k in i){_884[k]=i[k];}}},this);this._loadChildren();},setStore:function(_885,_886,_887){var _888=this.store;_887=_887||{};if(_888!==_885){var h;while(h=this._notifyConnections.pop()){h.remove();}if(_885&&_885.getFeatures()["dojo.data.api.Notification"]){this._notifyConnections=[_877.after(_885,"onNew",lang.hitch(this,"_onNewItem"),true),_877.after(_885,"onDelete",lang.hitch(this,"_onDeleteItem"),true),_877.after(_885,"onSet",lang.hitch(this,"_onSetItem"),true)];}this._set("store",_885);}this._onChangeActive=false;if(this.options&&this.options.length){this.removeOption(this.options);}if(_885){this._loadingStore=true;_885.fetch(lang.delegate(_887,{onComplete:function(_889,opts){if(this.sortByLabel&&!_887.sort&&_889.length){_889.sort(_878.createSortFunction([{attribute:_885.getLabelAttributes(_889[0])[0]}],_885));}if(_887.onFetch){_889=_887.onFetch.call(this,_889,opts);}_876.forEach(_889,function(i){this._addOptionForItem(i);},this);this._loadingStore=false;this.set("value","_pendingValue" in this?this._pendingValue:_886);delete this._pendingValue;if(!this.loadChildrenOnOpen){this._loadChildren();}else{this._pseudoLoadChildren(_889);}this._fetchedWith=opts;this._lastValueReported=this.multiple?[]:null;this._onChangeActive=true;this.onSetStore();this._handleOnChange(this.value);},scope:this}));}else{delete this._fetchedWith;}return _888;},_setValueAttr:function(_88a,_88b){if(this._loadingStore){this._pendingValue=_88a;return;}var opts=this.getOptions()||[];if(!lang.isArray(_88a)){_88a=[_88a];}_876.forEach(_88a,function(i,idx){if(!lang.isObject(i)){i=i+"";}if(typeof i==="string"){_88a[idx]=_876.filter(opts,function(node){return node.value===i;})[0]||{value:"",label:""};}},this);_88a=_876.filter(_88a,function(i){return i&&i.value;});if(!this.multiple&&(!_88a[0]||!_88a[0].value)&&opts.length){_88a[0]=opts[0];}_876.forEach(opts,function(i){i.selected=_876.some(_88a,function(v){return v.value===i.value;});});var val=_876.map(_88a,function(i){return i.value;}),disp=_876.map(_88a,function(i){return i.label;});this._set("value",this.multiple?val:val[0]);this._setDisplay(this.multiple?disp:disp[0]);this._updateSelection();this._handleOnChange(this.value,_88b);},_getDisplayedValueAttr:function(){var val=this.get("value");if(!lang.isArray(val)){val=[val];}var ret=_876.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(){if(this._loadingStore){return;}_876.forEach(this._getChildren(),function(_88c){_88c.destroyRecursive();});_876.forEach(this.options,this._addOptionItem,this);this._updateSelection();},_updateSelection:function(){this._set("value",this._getValueFromOpts());var val=this.value;if(!lang.isArray(val)){val=[val];}if(val&&val[0]){_876.forEach(this._getChildren(),function(_88d){var _88e=_876.some(val,function(v){return _88d.option&&(v===_88d.option.value);});_87a.toggle(_88d.domNode,this.baseClass+"SelectedOption",_88e);_88d.domNode.setAttribute("aria-selected",_88e);},this);}},_getValueFromOpts:function(){var opts=this.getOptions()||[];if(!this.multiple&&opts.length){var opt=_876.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){return _876.map(_876.filter(opts,function(i){return i.selected;}),function(i){return i.value;})||[];}}return "";},_onNewItem:function(item,_88f){if(!_88f||!_88f.parent){this._addOptionForItem(item);}},_onDeleteItem:function(item){var _890=this.store;this.removeOption(_890.getIdentity(item));},_onSetItem:function(item){this.updateOption(this._getOptionObjForItem(item));},_getOptionObjForItem:function(item){var _891=this.store,_892=_891.getLabel(item),_893=(_892?_891.getIdentity(item):null);return {value:_893,label:_892,item:item};},_addOptionForItem:function(item){var _894=this.store;if(!_894.isItemLoaded(item)){_894.loadItem({item:item,onItem:function(i){this._addOptionForItem(i);},scope:this});return;}var _895=this._getOptionObjForItem(item);this.addOption(_895);},constructor:function(_896){this._oValue=(_896||{}).value||null;this._notifyConnections=[];},buildRendering:function(){this.inherited(arguments);dom.setSelectable(this.focusNode,false);},_fillContent:function(){var opts=this.options;if(!opts){opts=this.options=this.srcNodeRef?_87c("> *",this.srcNodeRef).map(function(node){if(node.getAttribute("type")==="separator"){return {value:"",label:"",selected:false,disabled:false};}return {value:(node.getAttribute("data-"+_87b._scopeName+"-value")||node.getAttribute("value")),label:String(node.innerHTML),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(){this.inherited(arguments);this.connect(this,"onChange","_updateSelection");this.connect(this,"startup","_loadChildren");this._setValueAttr(this.value,null);},startup:function(){this.inherited(arguments);var _897=this.store,_898={};_876.forEach(["query","queryOptions","onFetch"],function(i){if(this[i]){_898[i]=this[i];}delete this[i];},this);if(_897&&_897.getFeatures()["dojo.data.api.Identity"]){this.store=null;this.setStore(_897,this._oValue,_898);}},destroy:function(){var h;while(h=this._notifyConnections.pop()){h.remove();}this.inherited(arguments);},_addOptionItem:function(){},_removeOptionItem:function(){},_setDisplay:function(){},_getChildren:function(){return [];},_getSelectedOptionsAttr:function(){return this.getOptions(this.get("value"));},_pseudoLoadChildren:function(){},onSetStore:function(){}});});},"dijit/form/Select":function(){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=\"combobox\" aria-haspopup=\"true\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" role=\"presentation\"\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\" data-dojo-attach-point=\"containerNode,_popupStateNode\"></span\n\t\t\t><input type=\"hidden\" ${!nameAttrSetting} data-dojo-attach-point=\"valueNode\" value=\"${value}\" aria-hidden=\"true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdata-dojo-attach-point=\"titleNode\" role=\"presentation\"\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></tr></tbody\n></table>\n"}});define("dijit/form/Select",["dojo/_base/array","dojo/_base/declare","dojo/dom-attr","dojo/dom-class","dojo/dom-construct","dojo/dom-geometry","dojo/_base/event","dojo/i18n","dojo/_base/lang","./_FormSelectWidget","../_HasDropDown","../Menu","../MenuItem","../MenuSeparator","../Tooltip","dojo/text!./templates/Select.html","dojo/i18n!./nls/validate"],function(_899,_89a,_89b,_89c,_89d,_89e,_89f,i18n,lang,_8a0,_8a1,Menu,_8a2,_8a3,_8a4,_8a5){var _8a6=_89a("dijit.form._SelectMenu",Menu,{buildRendering:function(){this.inherited(arguments);var o=(this.menuTableNode=this.domNode);var n=(this.domNode=_89d.create("div",{style:{overflowX:"hidden",overflowY:"scroll"}}));if(o.parentNode){o.parentNode.replaceChild(n,o);}_89c.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(){this.inherited(arguments);this.connect(this.domNode,"onmousemove",_89f.stop);},resize:function(mb){if(mb){_89e.setMarginBox(this.domNode,mb);if("w" in mb){this.menuTableNode.style.width="100%";}}}});var _8a7=_89a("dijit.form.Select",[_8a0,_8a1],{baseClass:"dijitSelect",templateString:_8a5,required:false,state:"",message:"",tooltipPosition:[],emptyLabel:" ",_isLoaded:false,_childrenLoaded:false,_fillContent:function(){this.inherited(arguments);if(this.options.length&&!this.value&&this.srcNodeRef){var si=this.srcNodeRef.selectedIndex||0;this.value=this.options[si>=0?si:0].value;}this.dropDown=new _8a6({id:this.id+"_menu"});_89c.add(this.dropDown.domNode,this.baseClass+"Menu");},_getMenuItemForOption:function(_8a8){if(!_8a8.value&&!_8a8.label){return new _8a3();}else{var _8a9=lang.hitch(this,"_setValueAttr",_8a8);var item=new _8a2({option:_8a8,label:_8a8.label||this.emptyLabel,onClick:_8a9,disabled:_8a8.disabled||false});item.focusNode.setAttribute("role","listitem");return item;}},_addOptionItem:function(_8aa){if(this.dropDown){this.dropDown.addChild(this._getMenuItemForOption(_8aa));}},_getChildren:function(){if(!this.dropDown){return [];}return this.dropDown.getChildren();},_loadChildren:function(_8ab){if(_8ab===true){if(this.dropDown){delete this.dropDown.focusedChild;}if(this.options.length){this.inherited(arguments);}else{_899.forEach(this._getChildren(),function(_8ac){_8ac.destroyRecursive();});var item=new _8a2({label:" "});this.dropDown.addChild(item);}}else{this._updateSelection();}this._isLoaded=false;this._childrenLoaded=true;if(!this._loadingStore){this._setValueAttr(this.value);}},_setValueAttr:function(_8ad){this.inherited(arguments);_89b.set(this.valueNode,"value",this.get("value"));this.validate(this.focused);},_setDisabledAttr:function(_8ae){this.inherited(arguments);this.validate(this.focused);},_setRequiredAttr:function(_8af){this._set("required",_8af);this.focusNode.setAttribute("aria-required",_8af);this.validate(this.focused);},_setDisplay:function(_8b0){var lbl=_8b0||this.emptyLabel;this.containerNode.innerHTML="<span class=\"dijitReset dijitInline "+this.baseClass+"Label\">"+lbl+"</span>";this.focusNode.setAttribute("aria-valuetext",lbl);},validate:function(_8b1){var _8b2=this.disabled||this.isValid(_8b1);this._set("state",_8b2?"":"Incomplete");this.focusNode.setAttribute("aria-invalid",_8b2?"false":"true");var _8b3=_8b2?"":this._missingMsg;if(_8b3&&this.focused&&this._hasBeenBlurred){_8a4.show(_8b3,this.domNode,this.tooltipPosition,!this.isLeftToRight());}else{_8a4.hide(this.domNode);}this._set("message",_8b3);return _8b2;},isValid:function(){return (!this.required||this.value===0||!(/^\s*$/.test(this.value||"")));},reset:function(){this.inherited(arguments);_8a4.hide(this.domNode);this.validate(this.focused);},postMixInProperties:function(){this.inherited(arguments);this._missingMsg=i18n.getLocalization("dijit.form","validate",this.lang).missingMessage;},postCreate:function(){this.inherited(arguments);this.connect(this.domNode,"onmousemove",_89f.stop);},_setStyleAttr:function(_8b4){this.inherited(arguments);_89c.toggle(this.domNode,this.baseClass+"FixedWidth",!!this.domNode.style.width);},isLoaded:function(){return this._isLoaded;},loadDropDown:function(_8b5){this._loadChildren(true);this._isLoaded=true;_8b5();},closeDropDown:function(){this.inherited(arguments);if(this.dropDown&&this.dropDown.menuTableNode){this.dropDown.menuTableNode.style.width="";}},uninitialize:function(_8b6){if(this.dropDown&&!this.dropDown._destroyed){this.dropDown.destroyRecursive(_8b6);delete this.dropDown;}this.inherited(arguments);},_onFocus:function(){this.validate(true);this.inherited(arguments);},_onBlur:function(){_8a4.hide(this.domNode);this.inherited(arguments);}});_8a7._Menu=_8a6;return _8a7;});},"dojo/store/util/QueryResults":function(){define("dojo/store/util/QueryResults",["../../_base/array","../../_base/lang","../../_base/Deferred"],function(_8b7,lang,_8b8){var util=lang.getObject("dojo.store.util",true);util.QueryResults=function(_8b9){if(!_8b9){return _8b9;}if(_8b9.then){_8b9=lang.delegate(_8b9);}function _8ba(_8bb){if(!_8b9[_8bb]){_8b9[_8bb]=function(){var args=arguments;return _8b8.when(_8b9,function(_8bc){Array.prototype.unshift.call(args,_8bc);return util.QueryResults(_8b7[_8bb].apply(_8b7,args));});};}};_8ba("forEach");_8ba("filter");_8ba("map");if(!_8b9.total){_8b9.total=_8b8.when(_8b9,function(_8bd){return _8bd.length;});}return _8b9;};return util.QueryResults;});},"dijit/form/_ListBase":function(){define("dijit/form/_ListBase",["dojo/_base/declare","dojo/window"],function(_8be,_8bf){return _8be("dijit.form._ListBase",null,{selected:null,_getTarget:function(evt){var tgt=evt.target;var _8c0=this.containerNode;if(tgt==_8c0||tgt==this.domNode){return null;}while(tgt&&tgt.parentNode!=_8c0){tgt=tgt.parentNode;}return tgt;},selectFirstNode:function(){var _8c1=this.containerNode.firstChild;while(_8c1&&_8c1.style.display=="none"){_8c1=_8c1.nextSibling;}this._setSelectedAttr(_8c1);},selectLastNode:function(){var last=this.containerNode.lastChild;while(last&&last.style.display=="none"){last=last.previousSibling;}this._setSelectedAttr(last);},selectNextNode:function(){var _8c2=this._getSelectedAttr();if(!_8c2){this.selectFirstNode();}else{var next=_8c2.nextSibling;while(next&&next.style.display=="none"){next=next.nextSibling;}if(!next){this.selectFirstNode();}else{this._setSelectedAttr(next);}}},selectPreviousNode:function(){var _8c3=this._getSelectedAttr();if(!_8c3){this.selectLastNode();}else{var prev=_8c3.previousSibling;while(prev&&prev.style.display=="none"){prev=prev.previousSibling;}if(!prev){this.selectLastNode();}else{this._setSelectedAttr(prev);}}},_setSelectedAttr:function(node){if(this.selected!=node){var _8c4=this._getSelectedAttr();if(_8c4){this.onDeselect(_8c4);this.selected=null;}if(node&&node.parentNode==this.containerNode){this.selected=node;_8bf.scrollIntoView(node);this.onSelect(node);}}else{if(node){this.onSelect(node);}}},_getSelectedAttr:function(){var v=this.selected;return (v&&v.parentNode==this.containerNode)?v:(this.selected=null);}});});},"dijit/form/_FormWidget":function(){define("dijit/form/_FormWidget",["dojo/_base/declare","dojo/_base/kernel","dojo/ready","../_Widget","../_CssStateMixin","../_TemplatedMixin","./_FormWidgetMixin"],function(_8c5,_8c6,_8c7,_8c8,_8c9,_8ca,_8cb){if(!_8c6.isAsync){_8c7(0,function(){var _8cc=["dijit/form/_FormValueWidget"];require(_8cc);});}return _8c5("dijit.form._FormWidget",[_8c8,_8ca,_8c9,_8cb],{setDisabled:function(_8cd){_8c6.deprecated("setDisabled("+_8cd+") is deprecated. Use set('disabled',"+_8cd+") instead.","","2.0");this.set("disabled",_8cd);},setValue:function(_8ce){_8c6.deprecated("dijit.form._FormWidget:setValue("+_8ce+") is deprecated. Use set('value',"+_8ce+") instead.","","2.0");this.set("value",_8ce);},getValue:function(){_8c6.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.","","2.0");return this.get("value");},postMixInProperties:function(){this.nameAttrSetting=this.name?("name=\""+this.name.replace(/'/g,""")+"\""):"";this.inherited(arguments);},_setTypeAttr:null});});},"dojo/DeferredList":function(){define("dojo/DeferredList",["./_base/kernel","./_base/Deferred","./_base/array"],function(dojo,_8cf,_8d0){dojo.DeferredList=function(list,_8d1,_8d2,_8d3,_8d4){var _8d5=[];_8cf.call(this);var self=this;if(list.length===0&&!_8d1){this.resolve([0,[]]);}var _8d6=0;_8d0.forEach(list,function(item,i){item.then(function(_8d7){if(_8d1){self.resolve([i,_8d7]);}else{_8d8(true,_8d7);}},function(_8d9){if(_8d2){self.reject(_8d9);}else{_8d8(false,_8d9);}if(_8d3){return null;}throw _8d9;});function _8d8(_8da,_8db){_8d5[i]=[_8da,_8db];_8d6++;if(_8d6===list.length){self.resolve(_8d5);}};});};dojo.DeferredList.prototype=new _8cf();dojo.DeferredList.prototype.gatherResults=function(_8dc){var d=new dojo.DeferredList(_8dc,false,true,false);d.addCallback(function(_8dd){var ret=[];_8d0.forEach(_8dd,function(_8de){ret.push(_8de[1]);});return ret;});return d;};return dojo.DeferredList;});},"dojo/dnd/common":function(){define("dojo/dnd/common",["../main"],function(dojo){dojo.getObject("dnd",true,dojo);dojo.dnd.getCopyKeyState=dojo.isCopyKey;dojo.dnd._uniqueId=0;dojo.dnd.getUniqueId=function(){var id;do{id=dojo._scopeName+"Unique"+(++dojo.dnd._uniqueId);}while(dojo.byId(id));return id;};dojo.dnd._empty={};dojo.dnd.isFormElement=function(e){var t=e.target;if(t.nodeType==3){t=t.parentNode;}return " button textarea input select option ".indexOf(" "+t.tagName.toLowerCase()+" ")>=0;};return dojo.dnd;});},"dijit/_base/place":function(){define("dijit/_base/place",["dojo/_base/array","dojo/_base/lang","dojo/window","../place",".."],function(_8df,lang,_8e0,_8e1,_8e2){_8e2.getViewport=function(){return _8e0.getBox();};_8e2.placeOnScreen=_8e1.at;_8e2.placeOnScreenAroundElement=function(node,_8e3,_8e4,_8e5){var _8e6;if(lang.isArray(_8e4)){_8e6=_8e4;}else{_8e6=[];for(var key in _8e4){_8e6.push({aroundCorner:key,corner:_8e4[key]});}}return _8e1.around(node,_8e3,_8e6,true,_8e5);};_8e2.placeOnScreenAroundNode=_8e2.placeOnScreenAroundElement;_8e2.placeOnScreenAroundRectangle=_8e2.placeOnScreenAroundElement;_8e2.getPopupAroundAlignment=function(_8e7,_8e8){var _8e9={};_8df.forEach(_8e7,function(pos){var ltr=_8e8;switch(pos){case "after":_8e9[_8e8?"BR":"BL"]=_8e8?"BL":"BR";break;case "before":_8e9[_8e8?"BL":"BR"]=_8e8?"BR":"BL";break;case "below-alt":ltr=!ltr;case "below":_8e9[ltr?"BL":"BR"]=ltr?"TL":"TR";_8e9[ltr?"BR":"BL"]=ltr?"TR":"TL";break;case "above-alt":ltr=!ltr;case "above":default:_8e9[ltr?"TL":"TR"]=ltr?"BL":"BR";_8e9[ltr?"TR":"TL"]=ltr?"BR":"BL";break;}});return _8e9;};return _8e2;});},"dijit/MenuSeparator":function(){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","dojo/dom","./_WidgetBase","./_TemplatedMixin","./_Contained","dojo/text!./templates/MenuSeparator.html"],function(_8ea,dom,_8eb,_8ec,_8ed,_8ee){return _8ea("dijit.MenuSeparator",[_8eb,_8ec,_8ed],{templateString:_8ee,buildRendering:function(){this.inherited(arguments);dom.setSelectable(this.domNode,false);},isFocusable:function(){return false;}});});},"dijit/form/_ComboBoxMenu":function(){define("dijit/form/_ComboBoxMenu",["dojo/_base/declare","dojo/dom-class","dojo/dom-construct","dojo/dom-style","dojo/keys","../_WidgetBase","../_TemplatedMixin","./_ComboBoxMenuMixin","./_ListMouseMixin"],function(_8ef,_8f0,_8f1,_8f2,keys,_8f3,_8f4,_8f5,_8f6){return _8ef("dijit.form._ComboBoxMenu",[_8f3,_8f4,_8f6,_8f5],{templateString:"<div class='dijitReset dijitMenu' data-dojo-attach-point='containerNode' style='overflow: auto; overflow-x: hidden;'>"+"<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()){_8f0.add(this.previousButton,"dijitMenuItemRtl");_8f0.add(this.nextButton,"dijitMenuItemRtl");}},_createMenuItem:function(){return _8f1.create("div",{"class":"dijitReset dijitMenuItem"+(this.isLeftToRight()?"":" dijitMenuItemRtl"),role:"option"});},onHover:function(node){_8f0.add(node,"dijitMenuItemHover");},onUnhover:function(node){_8f0.remove(node,"dijitMenuItemHover");},onSelect:function(node){_8f0.add(node,"dijitMenuItemSelected");},onDeselect:function(node){_8f0.remove(node,"dijitMenuItemSelected");},_page:function(up){var _8f7=0;var _8f8=this.domNode.scrollTop;var _8f9=_8f2.get(this.domNode,"height");if(!this.getHighlightedOption()){this.selectNextNode();}while(_8f7<_8f9){var _8fa=this.getHighlightedOption();if(up){if(!_8fa.previousSibling||_8fa.previousSibling.style.display=="none"){break;}this.selectPreviousNode();}else{if(!_8fa.nextSibling||_8fa.nextSibling.style.display=="none"){break;}this.selectNextNode();}var _8fb=this.domNode.scrollTop;_8f7+=(_8fb-_8f8)*(up?-1:1);_8f8=_8fb;}},handleKey:function(evt){switch(evt.charOrCode){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;}}});});},"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>","dijit/Dialog":function(){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<span data-dojo-attach-point=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\"></span>\n\t<span data-dojo-attach-point=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" data-dojo-attach-event=\"ondijitclick: onCancel\" title=\"${buttonCancel}\" role=\"button\" tabIndex=\"-1\">\n\t\t<span data-dojo-attach-point=\"closeText\" class=\"closeText\" title=\"${buttonCancel}\">x</span>\n\t</span>\n\t</div>\n\t\t<div data-dojo-attach-point=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n"}});define("dijit/Dialog",["require","dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/_base/Deferred","dojo/dom","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/_base/fx","dojo/i18n","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/on","dojo/ready","dojo/_base/sniff","dojo/_base/window","dojo/window","dojo/dnd/Moveable","dojo/dnd/TimedMoveable","./focus","./_base/manager","./_Widget","./_TemplatedMixin","./_CssStateMixin","./form/_FormMixin","./_DialogMixin","./DialogUnderlay","./layout/ContentPane","dojo/text!./templates/Dialog.html",".","dojo/i18n!./nls/common"],function(_8fc,_8fd,_8fe,_8ff,_900,dom,_901,_902,_903,_904,fx,i18n,_905,keys,lang,on,_906,has,win,_907,_908,_909,_90a,_90b,_90c,_90d,_90e,_90f,_910,_911,_912,_913,_914){var _915=_8ff("dijit._DialogBase",[_90d,_90f,_910,_90e],{templateString:_913,baseClass:"dijitDialog",cssStateNodes:{closeButtonNode:"dijitDialogCloseIcon"},_setTitleAttr:[{node:"titleNode",type:"innerHTML"},{node:"titleBar",type:"attribute"}],open:false,duration:_90b.defaultDuration,refocus:true,autofocus:true,_firstFocusItem:null,_lastFocusItem:null,doLayout:false,draggable:true,"aria-describedby":"",postMixInProperties:function(){var _916=i18n.getLocalization("dijit","common");lang.mixin(this,_916);this.inherited(arguments);},postCreate:function(){_903.set(this.domNode,{display:"none",position:"absolute"});win.body().appendChild(this.domNode);this.inherited(arguments);this.connect(this,"onExecute","hide");this.connect(this,"onCancel","hide");this._modalconnects=[];},onLoad:function(){this._position();if(this.autofocus&&_917.isTop(this)){this._getFocusItems(this.domNode);_90a.focus(this._firstFocusItem);}this.inherited(arguments);},_endDrag:function(){var _918=_902.position(this.domNode),_919=_907.getBox();_918.y=Math.min(Math.max(_918.y,0),(_919.h-_918.h));_918.x=Math.min(Math.max(_918.x,0),(_919.w-_918.w));this._relativePosition=_918;this._position();},_setup:function(){var node=this.domNode;if(this.titleBar&&this.draggable){this._moveable=new ((has("ie")==6)?_909:_908)(node,{handle:this.titleBar});this.connect(this._moveable,"onMoveStop","_endDrag");}else{_901.add(node,"dijitDialogFixed");}this.underlayAttrs={dialogId:this.id,"class":_8fd.map(this["class"].split(/\s/),function(s){return s+"_underlay";}).join(" ")};},_size:function(){this._checkIfSingleChild();if(this._singleChild){if(this._singleChildOriginalStyle){this._singleChild.domNode.style.cssText=this._singleChildOriginalStyle;}delete this._singleChildOriginalStyle;}else{_903.set(this.containerNode,{width:"auto",height:"auto"});}var bb=_902.position(this.domNode);var _91a=_907.getBox();if(bb.w>=_91a.w||bb.h>=_91a.h){var w=Math.min(bb.w,Math.floor(_91a.w*0.75)),h=Math.min(bb.h,Math.floor(_91a.h*0.75));if(this._singleChild&&this._singleChild.resize){this._singleChildOriginalStyle=this._singleChild.domNode.style.cssText;this._singleChild.resize({w:w,h:h});}else{_903.set(this.containerNode,{width:w+"px",height:h+"px",overflow:"auto",position:"relative"});}}else{if(this._singleChild&&this._singleChild.resize){this._singleChild.resize();}}},_position:function(){if(!_901.contains(win.body(),"dojoMove")){var node=this.domNode,_91b=_907.getBox(),p=this._relativePosition,bb=p?null:_902.position(node),l=Math.floor(_91b.l+(p?p.x:(_91b.w-bb.w)/2)),t=Math.floor(_91b.t+(p?p.y:(_91b.h-bb.h)/2));_903.set(node,{left:l+"px",top:t+"px"});}},_onKey:function(evt){if(evt.charOrCode){var node=evt.target;if(evt.charOrCode===keys.TAB){this._getFocusItems(this.domNode);}var _91c=(this._firstFocusItem==this._lastFocusItem);if(node==this._firstFocusItem&&evt.shiftKey&&evt.charOrCode===keys.TAB){if(!_91c){_90a.focus(this._lastFocusItem);}_904.stop(evt);}else{if(node==this._lastFocusItem&&evt.charOrCode===keys.TAB&&!evt.shiftKey){if(!_91c){_90a.focus(this._firstFocusItem);}_904.stop(evt);}else{while(node){if(node==this.domNode||_901.contains(node,"dijitPopup")){if(evt.charOrCode==keys.ESCAPE){this.onCancel();}else{return;}}node=node.parentNode;}if(evt.charOrCode!==keys.TAB){_904.stop(evt);}else{if(!has("opera")){try{this._firstFocusItem.focus();}catch(e){}}}}}}},show:function(){if(this.open){return;}if(!this._started){this.startup();}if(!this._alreadyInitialized){this._setup();this._alreadyInitialized=true;}if(this._fadeOutDeferred){this._fadeOutDeferred.cancel();}this._modalconnects.push(on(window,"scroll",lang.hitch(this,"layout")));this._modalconnects.push(on(window,"resize",lang.hitch(this,function(){var _91d=_907.getBox();if(!this._oldViewport||_91d.h!=this._oldViewport.h||_91d.w!=this._oldViewport.w){this.layout();this._oldViewport=_91d;}})));this._modalconnects.push(on(this.domNode,_8fe._keypress,lang.hitch(this,"_onKey")));_903.set(this.domNode,{opacity:0,display:""});this._set("open",true);this._onShow();this._size();this._position();var _91e;this._fadeInDeferred=new _900(lang.hitch(this,function(){_91e.stop();delete this._fadeInDeferred;}));_91e=fx.fadeIn({node:this.domNode,duration:this.duration,beforeBegin:lang.hitch(this,function(){_917.show(this,this.underlayAttrs);}),onEnd:lang.hitch(this,function(){if(this.autofocus&&_917.isTop(this)){this._getFocusItems(this.domNode);_90a.focus(this._firstFocusItem);}this._fadeInDeferred.callback(true);delete this._fadeInDeferred;})}).play();return this._fadeInDeferred;},hide:function(){if(!this._alreadyInitialized){return;}if(this._fadeInDeferred){this._fadeInDeferred.cancel();}var _91f;this._fadeOutDeferred=new _900(lang.hitch(this,function(){_91f.stop();delete this._fadeOutDeferred;}));this._fadeOutDeferred.then(lang.hitch(this,"onHide"));_91f=fx.fadeOut({node:this.domNode,duration:this.duration,onEnd:lang.hitch(this,function(){this.domNode.style.display="none";_917.hide(this);this._fadeOutDeferred.callback(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;},layout:function(){if(this.domNode.style.display!="none"){if(_914._underlay){_914._underlay.layout();}this._position();}},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();}_917.hide(this);this.inherited(arguments);}});var _920=_8ff("dijit.Dialog",[_912,_915],{});_920._DialogBase=_915;var _917=_920._DialogLevelManager={_beginZIndex:950,show:function(_921,_922){ds[ds.length-1].focus=_90a.curNode;var _923=_914._underlay;if(!_923||_923._destroyed){_923=_914._underlay=new _911(_922);}else{_923.set(_921.underlayAttrs);}var _924=ds[ds.length-1].dialog?ds[ds.length-1].zIndex+2:_920._DialogLevelManager._beginZIndex;if(ds.length==1){_923.show();}_903.set(_914._underlay.domNode,"zIndex",_924-1);_903.set(_921.domNode,"zIndex",_924);ds.push({dialog:_921,underlayAttrs:_922,zIndex:_924});},hide:function(_925){if(ds[ds.length-1].dialog==_925){ds.pop();var pd=ds[ds.length-1];if(ds.length==1){if(!_914._underlay._destroyed){_914._underlay.hide();}}else{_903.set(_914._underlay.domNode,"zIndex",pd.zIndex-1);_914._underlay.set(pd.underlayAttrs);}if(_925.refocus){var _926=pd.focus;if(pd.dialog&&(!_926||!dom.isDescendant(_926,pd.dialog.domNode))){pd.dialog._getFocusItems(pd.dialog.domNode);_926=pd.dialog._firstFocusItem;}if(_926){try{_926.focus();}catch(e){}}}}else{var idx=_8fd.indexOf(_8fd.map(ds,function(elem){return elem.dialog;}),_925);if(idx!=-1){ds.splice(idx,1);}}},isTop:function(_927){return ds[ds.length-1].dialog==_927;}};var ds=_920._dialogStack=[{dialog:null,focus:null,underlayAttrs:null}];if(!_905.isAsync){_906(0,function(){var _928=["dijit/TooltipDialog"];_8fc(_928);});}return _920;});},"dijit/_base/focus":function(){define("dijit/_base/focus",["dojo/_base/array","dojo/dom","dojo/_base/lang","dojo/topic","dojo/_base/window","../focus",".."],function(_929,dom,lang,_92a,win,_92b,_92c){lang.mixin(_92c,{_curFocus:null,_prevFocus:null,isCollapsed:function(){return _92c.getBookmark().isCollapsed;},getBookmark:function(){var bm,rg,tg,sel=win.doc.selection,cf=_92b.curNode;if(win.global.getSelection){sel=win.global.getSelection();if(sel){if(sel.isCollapsed){tg=cf?cf.tagName:"";if(tg){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};}}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){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={};try{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;},moveToBookmark:function(_92d){var _92e=win.doc,mark=_92d.mark;if(mark){if(win.global.getSelection){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(_92e.selection&&mark){var rg;if(mark.pRange){rg=mark.range;}else{if(lang.isArray(mark)){rg=_92e.body.createControlRange();_929.forEach(mark,function(n){rg.addElement(n);});}else{rg=_92e.body.createTextRange();rg.moveToBookmark(mark);}}rg.select();}}}},getFocus:function(menu,_92f){var node=!_92b.curNode||(menu&&dom.isDescendant(_92b.curNode,menu.domNode))?_92c._prevFocus:_92b.curNode;return {node:node,bookmark:node&&(node==_92b.curNode)&&win.withGlobal(_92f||win.global,_92c.getBookmark),openedForWindow:_92f};},_activeStack:[],registerIframe:function(_930){return _92b.registerIframe(_930);},unregisterIframe:function(_931){_931&&_931.remove();},registerWin:function(_932,_933){return _92b.registerWin(_932,_933);},unregisterWin:function(_934){_934&&_934.remove();}});_92b.focus=function(_935){if(!_935){return;}var node="node" in _935?_935.node:_935,_936=_935.bookmark,_937=_935.openedForWindow,_938=_936?_936.isCollapsed:false;if(node){var _939=(node.tagName.toLowerCase()=="iframe")?node.contentWindow:node;if(_939&&_939.focus){try{_939.focus();}catch(e){}}_92b._onFocusNode(node);}if(_936&&win.withGlobal(_937||win.global,_92c.isCollapsed)&&!_938){if(_937){_937.focus();}try{win.withGlobal(_937||win.global,_92c.moveToBookmark,null,[_936]);}catch(e2){}}};_92b.watch("curNode",function(name,_93a,_93b){_92c._curFocus=_93b;_92c._prevFocus=_93a;if(_93b){_92a.publish("focusNode",_93b);}});_92b.watch("activeStack",function(name,_93c,_93d){_92c._activeStack=_93d;});_92b.on("widget-blur",function(_93e,by){_92a.publish("widgetBlur",_93e,by);});_92b.on("widget-focus",function(_93f,by){_92a.publish("widgetFocus",_93f,by);});return _92c;});},"dijit/tree/dndSource":function(){define("dijit/tree/dndSource",["dojo/_base/array","dojo/_base/connect","dojo/_base/declare","dojo/dom-class","dojo/dom-geometry","dojo/_base/lang","dojo/on","dojo/touch","dojo/topic","dojo/dnd/Manager","./_dndSelector"],function(_940,_941,_942,_943,_944,lang,on,_945,_946,_947,_948){return _942("dijit.tree.dndSource",_948,{isSource:true,accept:["text","treeNode"],copyOnly:false,dragThreshold:5,betweenThreshold:0,constructor:function(tree,_949){if(!_949){_949={};}lang.mixin(this,_949);this.isSource=typeof _949.isSource=="undefined"?true:_949.isSource;var type=_949.accept instanceof Array?_949.accept:["text","treeNode"];this.accept=null;if(type.length){this.accept={};for(var i=0;i<type.length;++i){this.accept[type[i]]=1;}}this.isDragging=false;this.mouseDown=false;this.targetAnchor=null;this.targetBox=null;this.dropPosition="";this._lastX=0;this._lastY=0;this.sourceState="";if(this.isSource){_943.add(this.node,"dojoDndSource");}this.targetState="";if(this.accept){_943.add(this.node,"dojoDndTarget");}this.topics=[_946.subscribe("/dnd/source/over",lang.hitch(this,"onDndSourceOver")),_946.subscribe("/dnd/start",lang.hitch(this,"onDndStart")),_946.subscribe("/dnd/drop",lang.hitch(this,"onDndDrop")),_946.subscribe("/dnd/cancel",lang.hitch(this,"onDndCancel"))];},checkAcceptance:function(){return true;},copyState:function(_94a){return this.copyOnly||_94a;},destroy:function(){this.inherited(arguments);var h;while(h=this.topics.pop()){h.remove();}this.targetAnchor=null;},_onDragMouse:function(e){var m=_947.manager(),_94b=this.targetAnchor,_94c=this.current,_94d=this.dropPosition;var _94e="Over";if(_94c&&this.betweenThreshold>0){if(!this.targetBox||_94b!=_94c){this.targetBox=_944.position(_94c.rowNode,true);}if((e.pageY-this.targetBox.y)<=this.betweenThreshold){_94e="Before";}else{if((e.pageY-this.targetBox.y)>=(this.targetBox.h-this.betweenThreshold)){_94e="After";}}}if(_94c!=_94b||_94e!=_94d){if(_94b){this._removeItemClass(_94b.rowNode,_94d);}if(_94c){this._addItemClass(_94c.rowNode,_94e);}if(!_94c){m.canDrop(false);}else{if(_94c==this.tree.rootNode&&_94e!="Over"){m.canDrop(false);}else{var _94f=this.tree.model,_950=false;if(m.source==this){for(var _951 in this.selection){var _952=this.selection[_951];if(_952.item===_94c.item){_950=true;break;}}}if(_950){m.canDrop(false);}else{if(this.checkItemAcceptance(_94c.rowNode,m.source,_94e.toLowerCase())&&!this._isParentChildDrop(m.source,_94c.rowNode)){m.canDrop(true);}else{m.canDrop(false);}}}}this.targetAnchor=_94c;this.dropPosition=_94e;}},onMouseMove:function(e){if(this.isDragging&&this.targetState=="Disabled"){return;}this.inherited(arguments);var m=_947.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 _953=this.getSelectedTreeNodes();if(_953.length){if(_953.length>1){var seen=this.selection,i=0,r=[],n,p;nextitem:while((n=_953[i++])){for(p=n.getParent();p&&p!==this.tree;p=p.getParent()){if(seen[p.id]){continue nextitem;}}r.push(n);}_953=r;}_953=_940.map(_953,function(n){return n.domNode;});m.startDrag(this,_953,this.copyState(_941.isCopyKey(e)));}}}},onMouseDown:function(e){this.mouseDown=true;this.mouseButton=e.button;this._lastX=e.pageX;this._lastY=e.pageY;this.inherited(arguments);},onMouseUp:function(e){if(this.mouseDown){this.mouseDown=false;this.inherited(arguments);}},onMouseOut:function(){this.inherited(arguments);this._unmarkTargetAnchor();},checkItemAcceptance:function(){return true;},onDndSourceOver:function(_954){if(this!=_954){this.mouseDown=false;this._unmarkTargetAnchor();}else{if(this.isDragging){var m=_947.manager();m.canDrop(false);}}},onDndStart:function(_955,_956,copy){if(this.isSource){this._changeState("Source",this==_955?(copy?"Copied":"Moved"):"");}var _957=this.checkAcceptance(_955,_956);this._changeState("Target",_957?"":"Disabled");if(this==_955){_947.manager().overSource(this);}this.isDragging=true;},itemCreator:function(_958){return _940.map(_958,function(node){return {"id":node.id,"name":node.textContent||node.innerText||""};});},onDndDrop:function(_959,_95a,copy){if(this.containerState=="Over"){var tree=this.tree,_95b=tree.model,_95c=this.targetAnchor;this.isDragging=false;var _95d;var _95e;_95d=(_95c&&_95c.item)||tree.item;if(this.dropPosition=="Before"||this.dropPosition=="After"){_95d=(_95c.getParent()&&_95c.getParent().item)||tree.item;_95e=_95c.getIndexInParent();if(this.dropPosition=="After"){_95e=_95c.getIndexInParent()+1;}}else{_95d=(_95c&&_95c.item)||tree.item;}var _95f;_940.forEach(_95a,function(node,idx){var _960=_959.getItem(node.id);if(_940.indexOf(_960.type,"treeNode")!=-1){var _961=_960.data,_962=_961.item,_963=_961.getParent().item;}if(_959==this){if(typeof _95e=="number"){if(_95d==_963&&_961.getIndexInParent()<_95e){_95e-=1;}}_95b.pasteItem(_962,_963,_95d,copy,_95e);}else{if(_95b.isItem(_962)){_95b.pasteItem(_962,_963,_95d,copy,_95e);}else{if(!_95f){_95f=this.itemCreator(_95a,_95c.rowNode,_959);}_95b.newItem(_95f[idx],_95d,_95e);}}},this);this.tree._expandNode(_95c);}this.onDndCancel();},onDndCancel:function(){this._unmarkTargetAnchor();this.isDragging=false;this.mouseDown=false;delete this.mouseButton;this._changeState("Source","");this._changeState("Target","");},onOverEvent:function(){this.inherited(arguments);_947.manager().overSource(this);},onOutEvent:function(){this._unmarkTargetAnchor();var m=_947.manager();if(this.isDragging){m.canDrop(false);}m.outSource(this);this.inherited(arguments);},_isParentChildDrop:function(_964,_965){if(!_964.tree||_964.tree!=this.tree){return false;}var root=_964.tree.domNode;var ids=_964.selection;var node=_965.parentNode;while(node!=root&&!ids[node.id]){node=node.parentNode;}return node.id&&ids[node.id];},_unmarkTargetAnchor:function(){if(!this.targetAnchor){return;}this._removeItemClass(this.targetAnchor.rowNode,this.dropPosition);this.targetAnchor=null;this.targetBox=null;this.dropPosition=null;},_markDndStatus:function(copy){this._changeState("Source",copy?"Copied":"Moved");}});});},"dijit/a11y":function(){define("dijit/a11y",["dojo/_base/array","dojo/_base/config","dojo/_base/declare","dojo/dom","dojo/dom-attr","dojo/dom-style","dojo/_base/sniff","./_base/manager","."],function(_966,_967,_968,dom,_969,_96a,has,_96b,_96c){var _96d=(_96c._isElementShown=function(elem){var s=_96a.get(elem);return (s.visibility!="hidden")&&(s.visibility!="collapsed")&&(s.display!="none")&&(_969.get(elem,"type")!="hidden");});_96c.hasDefaultTabStop=function(elem){switch(elem.nodeName.toLowerCase()){case "a":return _969.has(elem,"href");case "area":case "button":case "input":case "object":case "select":case "textarea":return true;case "iframe":var body;try{var _96e=elem.contentDocument;if("designMode" in _96e&&_96e.designMode=="on"){return true;}body=_96e.body;}catch(e1){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 _96f=(_96c.isTabNavigable=function(elem){if(_969.get(elem,"disabled")){return false;}else{if(_969.has(elem,"tabIndex")){return _969.get(elem,"tabIndex")>=0;}else{return _96c.hasDefaultTabStop(elem);}}});_96c._getTabNavigable=function(root){var _970,last,_971,_972,_973,_974,_975={};function _976(node){return node&&node.tagName.toLowerCase()=="input"&&node.type&&node.type.toLowerCase()=="radio"&&node.name&&node.name.toLowerCase();};var _977=function(_978){for(var _979=_978.firstChild;_979;_979=_979.nextSibling){if(_979.nodeType!=1||(has("ie")&&_979.scopeName!=="HTML")||!_96d(_979)){continue;}if(_96f(_979)){var _97a=_969.get(_979,"tabIndex");if(!_969.has(_979,"tabIndex")||_97a==0){if(!_970){_970=_979;}last=_979;}else{if(_97a>0){if(!_971||_97a<_972){_972=_97a;_971=_979;}if(!_973||_97a>=_974){_974=_97a;_973=_979;}}}var rn=_976(_979);if(_969.get(_979,"checked")&&rn){_975[rn]=_979;}}if(_979.nodeName.toUpperCase()!="SELECT"){_977(_979);}}};if(_96d(root)){_977(root);}function rs(node){return _975[_976(node)]||node;};return {first:rs(_970),last:rs(last),lowest:rs(_971),highest:rs(_973)};};_96c.getFirstInTabbingOrder=function(root){var _97b=_96c._getTabNavigable(dom.byId(root));return _97b.lowest?_97b.lowest:_97b.first;};_96c.getLastInTabbingOrder=function(root){var _97c=_96c._getTabNavigable(dom.byId(root));return _97c.last?_97c.last:_97c.highest;};return {hasDefaultTabStop:_96c.hasDefaultTabStop,isTabNavigable:_96c.isTabNavigable,_getTabNavigable:_96c._getTabNavigable,getFirstInTabbingOrder:_96c.getFirstInTabbingOrder,getLastInTabbingOrder:_96c.getLastInTabbingOrder};});},"dijit/form/_ToggleButtonMixin":function(){define("dijit/form/_ToggleButtonMixin",["dojo/_base/declare","dojo/dom-attr"],function(_97d,_97e){return _97d("dijit.form._ToggleButtonMixin",null,{checked:false,_aria_attr:"aria-pressed",_onClick:function(evt){var _97f=this.checked;this._set("checked",!_97f);var ret=this.inherited(arguments);this.set("checked",ret?this.checked:_97f);return ret;},_setCheckedAttr:function(_980,_981){this._set("checked",_980);_97e.set(this.focusNode||this.domNode,"checked",_980);(this.focusNode||this.domNode).setAttribute(this._aria_attr,_980?"true":"false");this._handleOnChange(_980,_981);},reset:function(){this._hasBeenBlurred=false;this.set("checked",this.params.checked||false);}});});},"dijit/_Widget":function(){define("dijit/_Widget",["dojo/aspect","dojo/_base/config","dojo/_base/connect","dojo/_base/declare","dojo/_base/kernel","dojo/_base/lang","dojo/query","dojo/ready","./registry","./_WidgetBase","./_OnDijitClickMixin","./_FocusMixin","dojo/uacss","./hccss"],function(_982,_983,_984,_985,_986,lang,_987,_988,_989,_98a,_98b,_98c){function _98d(){};function _98e(_98f){return function(obj,_990,_991,_992){if(obj&&typeof _990=="string"&&obj[_990]==_98d){return obj.on(_990.substring(2).toLowerCase(),lang.hitch(_991,_992));}return _98f.apply(_984,arguments);};};_982.around(_984,"connect",_98e);if(_986.connect){_982.around(_986,"connect",_98e);}var _993=_985("dijit._Widget",[_98a,_98b,_98c],{onClick:_98d,onDblClick:_98d,onKeyDown:_98d,onKeyPress:_98d,onKeyUp:_98d,onMouseDown:_98d,onMouseMove:_98d,onMouseOut:_98d,onMouseOver:_98d,onMouseLeave:_98d,onMouseEnter:_98d,onMouseUp:_98d,constructor:function(_994){this._toConnect={};for(var name in _994){if(this[name]===_98d){this._toConnect[name.replace(/^on/,"").toLowerCase()]=_994[name];delete _994[name];}}},postCreate:function(){this.inherited(arguments);for(var name in this._toConnect){this.on(name,this._toConnect[name]);}delete this._toConnect;},on:function(type,func){if(this[this._onMap(type)]===_98d){return _984.connect(this.domNode,type.toLowerCase(),this,func);}return this.inherited(arguments);},_setFocusedAttr:function(val){this._focused=val;this._set("focused",val);},setAttribute:function(attr,_995){_986.deprecated(this.declaredClass+"::setAttribute(attr, value) is deprecated. Use set() instead.","","2.0");this.set(attr,_995);},attr:function(name,_996){if(_983.isDebug){var _997=arguments.callee._ach||(arguments.callee._ach={}),_998=(arguments.callee.caller||"unknown caller").toString();if(!_997[_998]){_986.deprecated(this.declaredClass+"::attr() is deprecated. Use get() or set() instead, called from "+_998,"","2.0");_997[_998]=true;}}var args=arguments.length;if(args>=2||typeof name==="object"){return this.set.apply(this,arguments);}else{return this.get(name);}},getDescendants:function(){_986.deprecated(this.declaredClass+"::getDescendants() is deprecated. Use getChildren() instead.","","2.0");return this.containerNode?_987("[widgetId]",this.containerNode).map(_989.byNode):[];},_onShow:function(){this.onShow();},onShow:function(){},onHide:function(){},onClose:function(){return true;}});if(!_986.isAsync){_988(0,function(){var _999=["dijit/_base"];require(_999);});}return _993;});},"dojo/touch":function(){define("dojo/touch",["./_base/kernel","./on","./has","./mouse"],function(dojo,on,has,_99a){function _99b(type){return function(node,_99c){return on(node,type,_99c);};};var _99d=has("touch");dojo.touch={press:_99b(_99d?"touchstart":"mousedown"),move:_99b(_99d?"touchmove":"mousemove"),release:_99b(_99d?"touchend":"mouseup"),cancel:_99d?_99b("touchcancel"):_99a.leave};return dojo.touch;});},"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=\"combobox\" aria-haspopup=\"true\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" role=\"presentation\"\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\" data-dojo-attach-point=\"containerNode,_popupStateNode\"></span\n\t\t\t><input type=\"hidden\" ${!nameAttrSetting} data-dojo-attach-point=\"valueNode\" value=\"${value}\" aria-hidden=\"true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdata-dojo-attach-point=\"titleNode\" role=\"presentation\"\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></tr></tbody\n></table>\n","dojo/fx":function(){define("dojo/fx",["./_base/lang","./Evented","./_base/kernel","./_base/array","./_base/connect","./_base/fx","./dom","./dom-style","./dom-geometry","./ready","require"],function(lang,_99e,dojo,_99f,_9a0,_9a1,dom,_9a2,geom,_9a3,_9a4){if(!dojo.isAsync){_9a3(0,function(){var _9a5=["./fx/Toggler"];_9a4(_9a5);});}var _9a6=dojo.fx={};var _9a7={_fire:function(evt,args){if(this[evt]){this[evt].apply(this,args||[]);}return this;}};var _9a8=function(_9a9){this._index=-1;this._animations=_9a9||[];this._current=this._onAnimateCtx=this._onEndCtx=null;this.duration=0;_99f.forEach(this._animations,function(a){this.duration+=a.duration;if(a.delay){this.duration+=a.delay;}},this);};_9a8.prototype=new _99e();lang.extend(_9a8,{_onAnimate:function(){this._fire("onAnimate",arguments);},_onEnd:function(){_9a0.disconnect(this._onAnimateCtx);_9a0.disconnect(this._onEndCtx);this._onAnimateCtx=this._onEndCtx=null;if(this._index+1==this._animations.length){this._fire("onEnd");}else{this._current=this._animations[++this._index];this._onAnimateCtx=_9a0.connect(this._current,"onAnimate",this,"_onAnimate");this._onEndCtx=_9a0.connect(this._current,"onEnd",this,"_onEnd");this._current.play(0,true);}},play:function(_9aa,_9ab){if(!this._current){this._current=this._animations[this._index=0];}if(!_9ab&&this._current.status()=="playing"){return this;}var _9ac=_9a0.connect(this._current,"beforeBegin",this,function(){this._fire("beforeBegin");}),_9ad=_9a0.connect(this._current,"onBegin",this,function(arg){this._fire("onBegin",arguments);}),_9ae=_9a0.connect(this._current,"onPlay",this,function(arg){this._fire("onPlay",arguments);_9a0.disconnect(_9ac);_9a0.disconnect(_9ad);_9a0.disconnect(_9ae);});if(this._onAnimateCtx){_9a0.disconnect(this._onAnimateCtx);}this._onAnimateCtx=_9a0.connect(this._current,"onAnimate",this,"_onAnimate");if(this._onEndCtx){_9a0.disconnect(this._onEndCtx);}this._onEndCtx=_9a0.connect(this._current,"onEnd",this,"_onEnd");this._current.play.apply(this._current,arguments);return this;},pause:function(){if(this._current){var e=_9a0.connect(this._current,"onPause",this,function(arg){this._fire("onPause",arguments);_9a0.disconnect(e);});this._current.pause();}return this;},gotoPercent:function(_9af,_9b0){this.pause();var _9b1=this.duration*_9af;this._current=null;_99f.some(this._animations,function(a){if(a.duration<=_9b1){this._current=a;return true;}_9b1-=a.duration;return false;});if(this._current){this._current.gotoPercent(_9b1/this._current.duration,_9b0);}return this;},stop:function(_9b2){if(this._current){if(_9b2){for(;this._index+1<this._animations.length;++this._index){this._animations[this._index].stop(true);}this._current=this._animations[this._index];}var e=_9a0.connect(this._current,"onStop",this,function(arg){this._fire("onStop",arguments);_9a0.disconnect(e);});this._current.stop();}return this;},status:function(){return this._current?this._current.status():"stopped";},destroy:function(){if(this._onAnimateCtx){_9a0.disconnect(this._onAnimateCtx);}if(this._onEndCtx){_9a0.disconnect(this._onEndCtx);}}});lang.extend(_9a8,_9a7);_9a6.chain=function(_9b3){return new _9a8(_9b3);};var _9b4=function(_9b5){this._animations=_9b5||[];this._connects=[];this._finished=0;this.duration=0;_99f.forEach(_9b5,function(a){var _9b6=a.duration;if(a.delay){_9b6+=a.delay;}if(this.duration<_9b6){this.duration=_9b6;}this._connects.push(_9a0.connect(a,"onEnd",this,"_onEnd"));},this);this._pseudoAnimation=new _9a1.Animation({curve:[0,1],duration:this.duration});var self=this;_99f.forEach(["beforeBegin","onBegin","onPlay","onAnimate","onPause","onStop","onEnd"],function(evt){self._connects.push(_9a0.connect(self._pseudoAnimation,evt,function(){self._fire(evt,arguments);}));});};lang.extend(_9b4,{_doAction:function(_9b7,args){_99f.forEach(this._animations,function(a){a[_9b7].apply(a,args);});return this;},_onEnd:function(){if(++this._finished>this._animations.length){this._fire("onEnd");}},_call:function(_9b8,args){var t=this._pseudoAnimation;t[_9b8].apply(t,args);},play:function(_9b9,_9ba){this._finished=0;this._doAction("play",arguments);this._call("play",arguments);return this;},pause:function(){this._doAction("pause",arguments);this._call("pause",arguments);return this;},gotoPercent:function(_9bb,_9bc){var ms=this.duration*_9bb;_99f.forEach(this._animations,function(a){a.gotoPercent(a.duration<ms?1:(ms/a.duration),_9bc);});this._call("gotoPercent",arguments);return this;},stop:function(_9bd){this._doAction("stop",arguments);this._call("stop",arguments);return this;},status:function(){return this._pseudoAnimation.status();},destroy:function(){_99f.forEach(this._connects,_9a0.disconnect);}});lang.extend(_9b4,_9a7);_9a6.combine=function(_9be){return new _9b4(_9be);};_9a6.wipeIn=function(args){var node=args.node=dom.byId(args.node),s=node.style,o;var anim=_9a1.animateProperty(lang.mixin({properties:{height:{start:function(){o=s.overflow;s.overflow="hidden";if(s.visibility=="hidden"||s.display=="none"){s.height="1px";s.display="";s.visibility="";return 1;}else{var _9bf=_9a2.get(node,"height");return Math.max(_9bf,1);}},end:function(){return node.scrollHeight;}}}},args));var fini=function(){s.height="auto";s.overflow=o;};_9a0.connect(anim,"onStop",fini);_9a0.connect(anim,"onEnd",fini);return anim;};_9a6.wipeOut=function(args){var node=args.node=dom.byId(args.node),s=node.style,o;var anim=_9a1.animateProperty(lang.mixin({properties:{height:{end:1}}},args));_9a0.connect(anim,"beforeBegin",function(){o=s.overflow;s.overflow="hidden";s.display="";});var fini=function(){s.overflow=o;s.height="auto";s.display="none";};_9a0.connect(anim,"onStop",fini);_9a0.connect(anim,"onEnd",fini);return anim;};_9a6.slideTo=function(args){var node=args.node=dom.byId(args.node),top=null,left=null;var init=(function(n){return function(){var cs=_9a2.getComputedStyle(n);var pos=cs.position;top=(pos=="absolute"?n.offsetTop:parseInt(cs.top)||0);left=(pos=="absolute"?n.offsetLeft:parseInt(cs.left)||0);if(pos!="absolute"&&pos!="relative"){var ret=geom.position(n,true);top=ret.y;left=ret.x;n.style.position="absolute";n.style.top=top+"px";n.style.left=left+"px";}};})(node);init();var anim=_9a1.animateProperty(lang.mixin({properties:{top:args.top||0,left:args.left||0}},args));_9a0.connect(anim,"beforeBegin",anim,init);return anim;};return _9a6;});},"dijit/_DialogMixin":function(){define("dijit/_DialogMixin",["dojo/_base/declare","./a11y"],function(_9c0,a11y){return _9c0("dijit._DialogMixin",null,{execute:function(){},onCancel:function(){},onExecute:function(){},_onSubmit:function(){this.onExecute();this.execute(this.get("value"));},_getFocusItems:function(){var _9c1=a11y._getTabNavigable(this.containerNode);this._firstFocusItem=_9c1.lowest||_9c1.first||this.closeButtonNode||this.domNode;this._lastFocusItem=_9c1.last||_9c1.highest||this._firstFocusItem;}});});},"dijit/Tree":function(){require({cache:{"url:dijit/templates/TreeNode.html":"<div class=\"dijitTreeNode\" role=\"presentation\"\n\t><div data-dojo-attach-point=\"rowNode\" class=\"dijitTreeRow\" role=\"presentation\" data-dojo-attach-event=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\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\" data-dojo-attach-event=\"onfocus:_onLabelFocus\"></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\tdata-dojo-attach-event=\"onkeypress:_onKeyPress\">\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","dojo/_base/connect","dojo/cookie","dojo/_base/declare","dojo/_base/Deferred","dojo/DeferredList","dojo/dom","dojo/dom-class","dojo/dom-geometry","dojo/dom-style","dojo/_base/event","dojo/fx","dojo/_base/kernel","dojo/keys","dojo/_base/lang","dojo/topic","./focus","./registry","./_base/manager","./_Widget","./_TemplatedMixin","./_Container","./_Contained","./_CssStateMixin","dojo/text!./templates/TreeNode.html","dojo/text!./templates/Tree.html","./tree/TreeStoreModel","./tree/ForestStoreModel","./tree/_dndSelector"],function(_9c2,_9c3,_9c4,_9c5,_9c6,_9c7,dom,_9c8,_9c9,_9ca,_9cb,_9cc,_9cd,keys,lang,_9ce,_9cf,_9d0,_9d1,_9d2,_9d3,_9d4,_9d5,_9d6,_9d7,_9d8,_9d9,_9da,_9db){var _9dc=_9c5("dijit._TreeNode",[_9d2,_9d3,_9d4,_9d5,_9d6],{item:null,isTreeNode:true,label:"",_setLabelAttr:{node:"labelNode",type:"innerText"},isExpandable:null,isExpanded:false,state:"UNCHECKED",templateString:_9d7,baseClass:"dijitTreeNode",cssStateNodes:{rowNode:"dijitTreeRow",labelNode:"dijitTreeLabel"},_setTooltipAttr:{node:"rowNode",type:"attribute",attribute:"title"},buildRendering:function(){this.inherited(arguments);this._setExpando();this._updateItemClasses(this.item);if(this.isExpandable){this.labelNode.setAttribute("aria-expanded",this.isExpanded);}this.setSelected(false);},_setIndentAttr:function(_9dd){var _9de=(Math.max(_9dd,0)*this.tree._nodePixelIndent)+"px";_9ca.set(this.domNode,"backgroundPosition",_9de+" 0px");_9ca.set(this.rowNode,this.isLeftToRight()?"paddingLeft":"paddingRight",_9de);_9c2.forEach(this.getChildren(),function(_9df){_9df.set("indent",_9dd+1);});this._set("indent",_9dd);},markProcessing:function(){this.state="LOADING";this._setExpando(true);},unmarkProcessing:function(){this._setExpando(false);},_updateItemClasses:function(item){var tree=this.tree,_9e0=tree.model;if(tree._v10Compat&&item===_9e0.root){item=null;}this._applyClassAndStyle(item,"icon","Icon");this._applyClassAndStyle(item,"label","Label");this._applyClassAndStyle(item,"row","Row");},_applyClassAndStyle:function(item,_9e1,_9e2){var _9e3="_"+_9e1+"Class";var _9e4=_9e1+"Node";var _9e5=this[_9e3];this[_9e3]=this.tree["get"+_9e2+"Class"](item,this.isExpanded);_9c8.replace(this[_9e4],this[_9e3]||"",_9e5||"");_9ca.set(this[_9e4],this.tree["get"+_9e2+"Style"](item,this.isExpanded)||{});},_updateLayout:function(){var _9e6=this.getParent();if(!_9e6||!_9e6.rowNode||_9e6.rowNode.style.display=="none"){_9c8.add(this.domNode,"dijitTreeIsRoot");}else{_9c8.toggle(this.domNode,"dijitTreeIsLast",!this.getNextSibling());}},_setExpando:function(_9e7){var _9e8=["dijitTreeExpandoLoading","dijitTreeExpandoOpened","dijitTreeExpandoClosed","dijitTreeExpandoLeaf"],_9e9=["*","-","+","*"],idx=_9e7?0:(this.isExpandable?(this.isExpanded?1:2):3);_9c8.replace(this.expandoNode,_9e8[idx],_9e8);this.expandoNodeText.innerHTML=_9e9[idx];},expand:function(){if(this._expandDeferred){return this._expandDeferred;}this._wipeOut&&this._wipeOut.stop();this.isExpanded=true;this.labelNode.setAttribute("aria-expanded","true");if(this.tree.showRoot||this!==this.tree.rootNode){this.containerNode.setAttribute("role","group");}_9c8.add(this.contentNode,"dijitTreeContentExpanded");this._setExpando();this._updateItemClasses(this.item);if(this==this.tree.rootNode){this.tree.domNode.setAttribute("aria-expanded","true");}var def,_9ea=_9cc.wipeIn({node:this.containerNode,duration:_9d1.defaultDuration,onEnd:function(){def.callback(true);}});def=(this._expandDeferred=new _9c6(function(){_9ea.stop();}));_9ea.play();return def;},collapse:function(){if(!this.isExpanded){return;}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.domNode.setAttribute("aria-expanded","false");}_9c8.remove(this.contentNode,"dijitTreeContentExpanded");this._setExpando();this._updateItemClasses(this.item);if(!this._wipeOut){this._wipeOut=_9cc.wipeOut({node:this.containerNode,duration:_9d1.defaultDuration});}this._wipeOut.play();},indent:0,setChildItems:function(_9eb){var tree=this.tree,_9ec=tree.model,defs=[];_9c2.forEach(this.getChildren(),function(_9ed){_9d4.prototype.removeChild.call(this,_9ed);},this);this.state="LOADED";if(_9eb&&_9eb.length>0){this.isExpandable=true;_9c2.forEach(_9eb,function(item){var id=_9ec.getIdentity(item),_9ee=tree._itemNodesMap[id],node;if(_9ee){for(var i=0;i<_9ee.length;i++){if(_9ee[i]&&!_9ee[i].getParent()){node=_9ee[i];node.set("indent",this.indent+1);break;}}}if(!node){node=this.tree._createTreeNode({item:item,tree:tree,isExpandable:_9ec.mayHaveChildren(item),label:tree.getLabel(item),tooltip:tree.getTooltip(item),dir:tree.dir,lang:tree.lang,textDir:tree.textDir,indent:this.indent+1});if(_9ee){_9ee.push(node);}else{tree._itemNodesMap[id]=[node];}}this.addChild(node);if(this.tree.autoExpand||this.tree._state(node)){defs.push(tree._expandNode(node));}},this);_9c2.forEach(this.getChildren(),function(_9ef){_9ef._updateLayout();});}else{this.isExpandable=false;}if(this._setExpando){this._setExpando(false);}this._updateItemClasses(this.item);if(this==tree.rootNode){var fc=this.tree.showRoot?this:this.getChildren()[0];if(fc){fc.setFocusable(true);tree.lastFocused=fc;}else{tree.domNode.setAttribute("tabIndex","0");}}return new _9c7(defs);},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(node){this.inherited(arguments);var _9f0=this.getChildren();if(_9f0.length==0){this.isExpandable=false;this.collapse();}_9c2.forEach(_9f0,function(_9f1){_9f1._updateLayout();});},makeExpandable:function(){this.isExpandable=true;this._setExpando(false);},_onLabelFocus:function(){this.tree._onNodeFocus(this);},setSelected:function(_9f2){this.labelNode.setAttribute("aria-selected",_9f2);_9c8.toggle(this.rowNode,"dijitTreeRowSelected",_9f2);},setFocusable:function(_9f3){this.labelNode.setAttribute("tabIndex",_9f3?"0":"-1");},_onClick:function(evt){this.tree._onClick(this,evt);},_onDblClick:function(evt){this.tree._onDblClick(this,evt);},_onMouseEnter:function(evt){this.tree._onNodeMouseEnter(this,evt);},_onMouseLeave:function(evt){this.tree._onNodeMouseLeave(this,evt);},_setTextDirAttr:function(_9f4){if(_9f4&&((this.textDir!=_9f4)||!this._created)){this._set("textDir",_9f4);this.applyTextDir(this.labelNode,this.labelNode.innerText||this.labelNode.textContent||"");_9c2.forEach(this.getChildren(),function(_9f5){_9f5.set("textDir",_9f4);},this);}}});var Tree=_9c5("dijit.Tree",[_9d2,_9d3],{store:null,model:null,query:null,label:"",showRoot:true,childrenAttr:["children"],paths:[],path:[],selectedItems:null,selectedItem:null,openOnClick:false,openOnDblClick:false,templateString:_9d8,persist:true,autoExpand:false,dndController:_9db,dndParams:["onDndDrop","itemCreator","onDndCancel","checkAcceptance","checkItemAcceptance","dragThreshold","betweenThreshold"],onDndDrop:null,itemCreator:null,onDndCancel:null,checkAcceptance:null,checkItemAcceptance:null,dragThreshold:5,betweenThreshold:0,_nodePixelIndent:19,_publish:function(_9f6,_9f7){_9ce.publish(this.id,lang.mixin({tree:this,event:_9f6},_9f7||{}));},postMixInProperties:function(){this.tree=this;if(this.autoExpand){this.persist=false;}this._itemNodesMap={};if(!this.cookieName&&this.id){this.cookieName=this.id+"SaveStateCookie";}this._loadDeferred=new _9c6();this.inherited(arguments);},postCreate:function(){this._initState();if(!this.model){this._store2model();}this.connect(this.model,"onChange","_onItemChange");this.connect(this.model,"onChildrenChange","_onItemChildrenChange");this.connect(this.model,"onDelete","_onItemDelete");this._load();this.inherited(arguments);if(this.dndController){if(lang.isString(this.dndController)){this.dndController=lang.getObject(this.dndController);}var _9f8={};for(var i=0;i<this.dndParams.length;i++){if(this[this.dndParams[i]]){_9f8[this.dndParams[i]]=this[this.dndParams[i]];}}this.dndController=new this.dndController(this,_9f8);}},_store2model:function(){this._v10Compat=true;_9cd.deprecated("Tree: from version 2.0, should specify a model object rather than a store/query");var _9f9={id:this.id+"_ForestStoreModel",store:this.store,query:this.query,childrenAttrs:this.childrenAttr};if(this.params.mayHaveChildren){_9f9.mayHaveChildren=lang.hitch(this,"mayHaveChildren");}if(this.params.getItemChildren){_9f9.getChildren=lang.hitch(this,function(item,_9fa,_9fb){this.getItemChildren((this._v10Compat&&item===this.model.root)?null:item,_9fa,_9fb);});}this.model=new _9da(_9f9);this.showRoot=Boolean(this.label);},onLoad:function(){},_load:function(){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";this.domNode.setAttribute("role","presentation");rn.labelNode.setAttribute("role","presentation");rn.containerNode.setAttribute("role","tree");}this.domNode.appendChild(rn.domNode);var _9fc=this.model.getIdentity(item);if(this._itemNodesMap[_9fc]){this._itemNodesMap[_9fc].push(rn);}else{this._itemNodesMap[_9fc]=[rn];}rn._updateLayout();this._expandNode(rn).addCallback(lang.hitch(this,function(){this._loadDeferred.callback(true);this.onLoad();}));}),function(err){console.error(this,": error loading root: ",err);});},getNodesByItem:function(item){if(!item){return [];}var _9fd=lang.isString(item)?item:this.model.getIdentity(item);return [].concat(this._itemNodesMap[_9fd]);},_setSelectedItemAttr:function(item){this.set("selectedItems",[item]);},_setSelectedItemsAttr:function(_9fe){var tree=this;this._loadDeferred.addCallback(lang.hitch(this,function(){var _9ff=_9c2.map(_9fe,function(item){return (!item||lang.isString(item))?item:tree.model.getIdentity(item);});var _a00=[];_9c2.forEach(_9ff,function(id){_a00=_a00.concat(tree._itemNodesMap[id]||[]);});this.set("selectedNodes",_a00);}));},_setPathAttr:function(path){if(path.length){return this.set("paths",[path]);}else{return this.set("paths",[]);}},_setPathsAttr:function(_a01){var tree=this;return new _9c7(_9c2.map(_a01,function(path){var d=new _9c6();path=_9c2.map(path,function(item){return lang.isString(item)?item:tree.model.getIdentity(item);});if(path.length){tree._loadDeferred.addCallback(function(){_a02(path,[tree.rootNode],d);});}else{d.errback("Empty path");}return d;})).addCallback(_a03);function _a02(path,_a04,def){var _a05=path.shift();var _a06=_9c2.filter(_a04,function(node){return node.getIdentity()==_a05;})[0];if(!!_a06){if(path.length){tree._expandNode(_a06).addCallback(function(){_a02(path,_a06.getChildren(),def);});}else{def.callback(_a06);}}else{def.errback("Could not expand path at "+_a05);}};function _a03(_a07){tree.set("selectedNodes",_9c2.map(_9c2.filter(_a07,function(x){return x[0];}),function(x){return x[1];}));};},_setSelectedNodeAttr:function(node){this.set("selectedNodes",[node]);},_setSelectedNodesAttr:function(_a08){this._loadDeferred.addCallback(lang.hitch(this,function(){this.dndController.setSelection(_a08);}));},mayHaveChildren:function(){},getItemChildren:function(){},getLabel:function(item){return this.model.getLabel(item);},getIconClass:function(item,_a09){return (!item||this.model.mayHaveChildren(item))?(_a09?"dijitFolderOpened":"dijitFolderClosed"):"dijitLeaf";},getLabelClass:function(){},getRowClass:function(){},getIconStyle:function(){},getLabelStyle:function(){},getRowStyle:function(){},getTooltip:function(){return "";},_onKeyPress:function(e){if(e.altKey){return;}var _a0a=_9d0.getEnclosingWidget(e.target);if(!_a0a){return;}var key=e.charOrCode;if(typeof key=="string"&&key!=" "){if(!e.altKey&&!e.ctrlKey&&!e.shiftKey&&!e.metaKey){this._onLetterKeyNav({node:_a0a,key:key.toLowerCase()});_9cb.stop(e);}}else{if(this._curSearch){clearTimeout(this._curSearch.timer);delete this._curSearch;}var map=this._keyHandlerMap;if(!map){map={};map[keys.ENTER]="_onEnterKey";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]){this[this._keyHandlerMap[key]]({node:_a0a,item:_a0a.item,evt:e});_9cb.stop(e);}}},_onEnterKey:function(_a0b){this._publish("execute",{item:_a0b.item,node:_a0b.node});this.dndController.userSelect(_a0b.node,_9c3.isCopyKey(_a0b.evt),_a0b.evt.shiftKey);this.onClick(_a0b.item,_a0b.node,_a0b.evt);},_onDownArrow:function(_a0c){var node=this._getNextNode(_a0c.node);if(node&&node.isTreeNode){this.focusNode(node);}},_onUpArrow:function(_a0d){var node=_a0d.node;var _a0e=node.getPreviousSibling();if(_a0e){node=_a0e;while(node.isExpandable&&node.isExpanded&&node.hasChildren()){var _a0f=node.getChildren();node=_a0f[_a0f.length-1];}}else{var _a10=node.getParent();if(!(!this.showRoot&&_a10===this.rootNode)){node=_a10;}}if(node&&node.isTreeNode){this.focusNode(node);}},_onRightArrow:function(_a11){var node=_a11.node;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(_a12){var node=_a12.node;if(node.isExpandable&&node.isExpanded){this._collapseNode(node);}else{var _a13=node.getParent();if(_a13&&_a13.isTreeNode&&!(!this.showRoot&&_a13===this.rootNode)){this.focusNode(_a13);}}},_onHomeKey:function(){var node=this._getRootOrFirstNode();if(node){this.focusNode(node);}},_onEndKey:function(){var node=this.rootNode;while(node.isExpanded){var c=node.getChildren();node=c[c.length-1];}if(node&&node.isTreeNode){this.focusNode(node);}},multiCharSearchDuration:250,_onLetterKeyNav:function(_a14){var cs=this._curSearch;if(cs){cs.pattern=cs.pattern+_a14.key;clearTimeout(cs.timer);}else{cs=this._curSearch={pattern:_a14.key,startNode:_a14.node};}var self=this;cs.timer=setTimeout(function(){delete self._curSearch;},this.multiCharSearchDuration);var node=cs.startNode;do{node=this._getNextNode(node);if(!node){node=this._getRootOrFirstNode();}}while(node!==cs.startNode&&(node.label.toLowerCase().substr(0,cs.pattern.length)!=cs.pattern));if(node&&node.isTreeNode){if(node!==cs.startNode){this.focusNode(node);}}},isExpandoNode:function(node,_a15){return dom.isDescendant(node,_a15.expandoNode);},_onClick:function(_a16,e){var _a17=e.target,_a18=this.isExpandoNode(_a17,_a16);if((this.openOnClick&&_a16.isExpandable)||_a18){if(_a16.isExpandable){this._onExpandoClick({node:_a16});}}else{this._publish("execute",{item:_a16.item,node:_a16,evt:e});this.onClick(_a16.item,_a16,e);this.focusNode(_a16);}_9cb.stop(e);},_onDblClick:function(_a19,e){var _a1a=e.target,_a1b=(_a1a==_a19.expandoNode||_a1a==_a19.expandoNodeText);if((this.openOnDblClick&&_a19.isExpandable)||_a1b){if(_a19.isExpandable){this._onExpandoClick({node:_a19});}}else{this._publish("execute",{item:_a19.item,node:_a19,evt:e});this.onDblClick(_a19.item,_a19,e);this.focusNode(_a19);}_9cb.stop(e);},_onExpandoClick:function(_a1c){var node=_a1c.node;this.focusNode(node);if(node.isExpanded){this._collapseNode(node);}else{this._expandNode(node);}},onClick:function(){},onDblClick:function(){},onOpen:function(){},onClose:function(){},_getNextNode:function(node){if(node.isExpandable&&node.isExpanded&&node.hasChildren()){return node.getChildren()[0];}else{while(node&&node.isTreeNode){var _a1d=node.getNextSibling();if(_a1d){return _a1d;}node=node.getParent();}return null;}},_getRootOrFirstNode:function(){return this.showRoot?this.rootNode:this.rootNode.getChildren()[0];},_collapseNode:function(node){if(node._expandNodeDeferred){delete node._expandNodeDeferred;}if(node.isExpandable){if(node.state=="LOADING"){return;}node.collapse();this.onClose(node.item,node);this._state(node,false);}},_expandNode:function(node,_a1e){if(node._expandNodeDeferred&&!_a1e){return node._expandNodeDeferred;}var _a1f=this.model,item=node.item,_a20=this;switch(node.state){case "UNCHECKED":node.markProcessing();var def=(node._expandNodeDeferred=new _9c6());_a1f.getChildren(item,function(_a21){node.unmarkProcessing();var scid=node.setChildItems(_a21);var ed=_a20._expandNode(node,true);scid.addCallback(function(){ed.addCallback(function(){def.callback();});});},function(err){console.error(_a20,": error loading root children: ",err);});break;default:def=(node._expandNodeDeferred=node.expand());this.onOpen(node.item,node);this._state(node,true);}return def;},focusNode:function(node){_9cf.focus(node.labelNode);},_onNodeFocus:function(node){if(node&&node!=this.lastFocused){if(this.lastFocused&&!this.lastFocused._destroyed){this.lastFocused.setFocusable(false);}node.setFocusable(true);this.lastFocused=node;}},_onNodeMouseEnter:function(){},_onNodeMouseLeave:function(){},_onItemChange:function(item){var _a22=this.model,_a23=_a22.getIdentity(item),_a24=this._itemNodesMap[_a23];if(_a24){var _a25=this.getLabel(item),_a26=this.getTooltip(item);_9c2.forEach(_a24,function(node){node.set({item:item,label:_a25,tooltip:_a26});node._updateItemClasses(item);});}},_onItemChildrenChange:function(_a27,_a28){var _a29=this.model,_a2a=_a29.getIdentity(_a27),_a2b=this._itemNodesMap[_a2a];if(_a2b){_9c2.forEach(_a2b,function(_a2c){_a2c.setChildItems(_a28);});}},_onItemDelete:function(item){var _a2d=this.model,_a2e=_a2d.getIdentity(item),_a2f=this._itemNodesMap[_a2e];if(_a2f){_9c2.forEach(_a2f,function(node){this.dndController.removeTreeNode(node);var _a30=node.getParent();if(_a30){_a30.removeChild(node);}node.destroyRecursive();},this);delete this._itemNodesMap[_a2e];}},_initState:function(){this._openedNodes={};if(this.persist&&this.cookieName){var oreo=_9c4(this.cookieName);if(oreo){_9c2.forEach(oreo.split(","),function(item){this._openedNodes[item]=true;},this);}}},_state:function(node,_a31){if(!this.persist){return false;}var path=_9c2.map(node.getTreePath(),function(item){return this.model.getIdentity(item);},this).join("/");if(arguments.length===1){return this._openedNodes[path];}else{if(_a31){this._openedNodes[path]=true;}else{delete this._openedNodes[path];}var ary=[];for(var id in this._openedNodes){ary.push(id);}_9c4(this.cookieName,ary.join(","),{expires:365});}},destroy:function(){if(this._curSearch){clearTimeout(this._curSearch.timer);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(){this.destroy();},resize:function(_a32){if(_a32){_9c9.setMarginBox(this.domNode,_a32);}this._nodePixelIndent=_9c9.position(this.tree.indentDetector).w;if(this.tree.rootNode){this.tree.rootNode.set("indent",this.showRoot?0:-1);}},_createTreeNode:function(args){return new _9dc(args);},_setTextDirAttr:function(_a33){if(_a33&&this.textDir!=_a33){this._set("textDir",_a33);this.rootNode.set("textDir",_a33);}}});Tree._TreeNode=_9dc;return Tree;});},"dijit/form/_FormValueWidget":function(){define("dijit/form/_FormValueWidget",["dojo/_base/declare","dojo/_base/sniff","./_FormWidget","./_FormValueMixin"],function(_a34,has,_a35,_a36){return _a34("dijit.form._FormValueWidget",[_a35,_a36],{_layoutHackIE7:function(){if(has("ie")==7){var _a37=this.domNode;var _a38=_a37.parentNode;var _a39=_a37.firstChild||_a37;var _a3a=_a39.style.filter;var _a3b=this;while(_a38&&_a38.clientHeight==0){(function ping(){var _a3c=_a3b.connect(_a38,"onscroll",function(){_a3b.disconnect(_a3c);_a39.style.filter=(new Date()).getMilliseconds();setTimeout(function(){_a39.style.filter=_a3a;},0);});})();_a38=_a38.parentNode;}}}});});},"*now":function(r){r(["dojo/i18n!*preload*dojo/nls/tt-rss-layer*[\"ar\",\"ca\",\"cs\",\"da\",\"de-de\",\"el\",\"en-gb\",\"en-us\",\"es-es\",\"fi-fi\",\"fr-fr\",\"he-il\",\"hu\",\"it-it\",\"ja-jp\",\"ko-kr\",\"nl-nl\",\"nb\",\"pl\",\"pt-br\",\"pt-pt\",\"ru\",\"sk\",\"sl\",\"sv\",\"th\",\"tr\",\"zh-tw\",\"zh-cn\",\"ROOT\"]"]);}}});define("dojo/tt-rss-layer",[],1); \ No newline at end of file diff --git a/lib/dojo/tt-rss-layer.js.uncompressed.js b/lib/dojo/tt-rss-layer.js.uncompressed.js index 81d4302d..cc43d872 100644 --- a/lib/dojo/tt-rss-layer.js.uncompressed.js +++ b/lib/dojo/tt-rss-layer.js.uncompressed.js @@ -1,11943 +1,13100 @@ -/* - Copyright (c) 2004-2011, The Dojo Foundation All Rights Reserved. - Available via Academic Free License >= 2.1 OR the modified BSD license. - see: http://dojotoolkit.org/license for details -*/ +require({cache:{ +'dijit/form/TextBox':function(){ +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/_base/sniff", // has("ie") has("mozilla") + "dojo/_base/window", // win.doc.selection.createRange + "./_FormValueWidget", + "./_TextBoxMixin", + "dojo/text!./templates/TextBox.html", + ".." // to export dijit._setSelectionRange, remove in 2.0 +], function(declare, domConstruct, domStyle, kernel, lang, has, win, + _FormValueWidget, _TextBoxMixin, template, dijit){ -/* - This is an optimized version of Dojo, built for deployment and not for - development. To get sources and documentation, please visit: +/*===== + var _FormValueWidget = dijit.form._FormValueWidget; + var _TextBoxMixin = dijit.form._TextBoxMixin; +=====*/ - http://dojotoolkit.org -*/ + // module: + // dijit/form/TextBox + // summary: + // A base class for textbox form inputs -dojo.provide("tt-rss-layer"); -if(!dojo._hasResource["dojo.date.stamp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.date.stamp"] = true; -dojo.provide("dojo.date.stamp"); + var TextBox = declare(/*====="dijit.form.TextBox", =====*/ [_FormValueWidget, _TextBoxMixin], { + // summary: + // A base class for textbox form inputs -dojo.getObject("date.stamp", true, dojo); + templateString: template, + _singleNodeTemplate: '<input class="dijit dijitReset dijitLeft dijitInputField" data-dojo-attach-point="textbox,focusNode" autocomplete="off" type="${type}" ${!nameAttrSetting} />', -// Methods to convert dates to or from a wire (string) format using well-known conventions + _buttonInputDisabled: has("ie") ? "disabled" : "", // allows IE to disallow focus, but Firefox cannot be disabled for mousedown events -dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/defaultTime){ - // summary: - // Returns a Date object given a string formatted according to a subset of the ISO-8601 standard. - // - // description: - // Accepts a string formatted according to a profile of ISO8601 as defined by - // [RFC3339](http://www.ietf.org/rfc/rfc3339.txt), except that partial input is allowed. - // Can also process dates as specified [by the W3C](http://www.w3.org/TR/NOTE-datetime) - // The following combinations are valid: - // - // * dates only - // | * yyyy - // | * yyyy-MM - // | * yyyy-MM-dd - // * times only, with an optional time zone appended - // | * THH:mm - // | * THH:mm:ss - // | * THH:mm:ss.SSS - // * and "datetimes" which could be any combination of the above - // - // timezones may be specified as Z (for UTC) or +/- followed by a time expression HH:mm - // Assumes the local time zone if not specified. Does not validate. Improperly formatted - // input may return null. Arguments which are out of bounds will be handled - // by the Date constructor (e.g. January 32nd typically gets resolved to February 1st) - // Only years between 100 and 9999 are supported. - // - // formattedString: - // A string such as 2005-06-30T08:05:00-07:00 or 2005-06-30 or T08:05:00 - // - // defaultTime: - // Used for defaults for fields omitted in the formattedString. - // Uses 1970-01-01T00:00:00.0Z by default. + baseClass: "dijitTextBox", - if(!dojo.date.stamp._isoRegExp){ - dojo.date.stamp._isoRegExp = -//TODO: could be more restrictive and check for 00-59, etc. - /^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/; - } + 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); + }, - var match = dojo.date.stamp._isoRegExp.exec(formattedString), - result = null; + _onInput: function(e){ + this.inherited(arguments); + if(this.intermediateChanges){ // _TextBoxMixin uses onInput + var _this = this; + // the setTimeout allows the key to post to the widget input box + setTimeout(function(){ _this._handleOnChange(_this.get('value'), false); }, 0); + } + }, - if(match){ - match.shift(); - if(match[1]){match[1]--;} // Javascript Date months are 0-based - if(match[6]){match[6] *= 1000;} // Javascript Date expects fractional seconds as milliseconds + _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',{className:'dijitPlaceHolder dijitInputField'},this.textbox,'after'); + } + this._phspan.innerHTML=""; + this._phspan.appendChild(document.createTextNode(v)); + this._updatePlaceHolder(); + }, - if(defaultTime){ - // mix in defaultTime. Relatively expensive, so use || operators for the fast path of defaultTime === 0 - defaultTime = new Date(defaultTime); - dojo.forEach(dojo.map(["FullYear", "Month", "Date", "Hours", "Minutes", "Seconds", "Milliseconds"], function(prop){ - return defaultTime["get" + prop](); - }), function(value, index){ - match[index] = match[index] || value; - }); - } - result = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0); //TODO: UTC defaults - if(match[0] < 100){ - result.setFullYear(match[0] || 1970); - } + _updatePlaceHolder: function(){ + if(this._phspan){ + this._phspan.style.display=(this.placeHolder&&!this.focused&&!this.textbox.value)?"":"none"; + } + }, - var offset = 0, - zoneSign = match[7] && match[7].charAt(0); - if(zoneSign != 'Z'){ - offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0); - if(zoneSign != '-'){ offset *= -1; } - } - if(zoneSign){ - offset -= result.getTimezoneOffset(); - } - if(offset){ - result.setTime(result.getTime() + offset * 60000); - } - } + _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ + this.inherited(arguments); + this._updatePlaceHolder(); + }, - return result; // Date or null -}; + getDisplayedValue: function(){ + // summary: + // Deprecated. Use get('displayedValue') instead. + // tags: + // deprecated + kernel.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use set('displayedValue') instead.", "", "2.0"); + return this.get('displayedValue'); + }, -/*===== - dojo.date.stamp.__Options = function(){ - // selector: String - // "date" or "time" for partial formatting of the Date object. - // Both date and time will be formatted by default. - // zulu: Boolean - // if true, UTC/GMT is used for a timezone - // milliseconds: Boolean - // if true, output milliseconds - this.selector = selector; - this.zulu = zulu; - this.milliseconds = milliseconds; - } -=====*/ + 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); + }, -dojo.date.stamp.toISOString = function(/*Date*/dateObject, /*dojo.date.stamp.__Options?*/options){ - // summary: - // Format a Date object as a string according a subset of the ISO-8601 standard - // - // description: - // When options.selector is omitted, output follows [RFC3339](http://www.ietf.org/rfc/rfc3339.txt) - // The local time zone is included as an offset from GMT, except when selector=='time' (time without a date) - // Does not check bounds. Only years between 100 and 9999 are supported. - // - // dateObject: - // A Date object + _onBlur: function(e){ + if(this.disabled){ return; } + this.inherited(arguments); + this._updatePlaceHolder(); + }, - var _ = function(n){ return (n < 10) ? "0" + n : n; }; - options = options || {}; - var formattedDate = [], - getter = options.zulu ? "getUTC" : "get", - date = ""; - if(options.selector != "time"){ - var year = dateObject[getter+"FullYear"](); - date = ["0000".substr((year+"").length)+year, _(dateObject[getter+"Month"]()+1), _(dateObject[getter+"Date"]())].join('-'); - } - formattedDate.push(date); - if(options.selector != "date"){ - var time = [_(dateObject[getter+"Hours"]()), _(dateObject[getter+"Minutes"]()), _(dateObject[getter+"Seconds"]())].join(':'); - var millis = dateObject[getter+"Milliseconds"](); - if(options.milliseconds){ - time += "."+ (millis < 100 ? "0" : "") + _(millis); - } - if(options.zulu){ - time += "Z"; - }else if(options.selector != "time"){ - var timezoneOffset = dateObject.getTimezoneOffset(); - var absOffset = Math.abs(timezoneOffset); - time += (timezoneOffset > 0 ? "-" : "+") + - _(Math.floor(absOffset/60)) + ":" + _(absOffset%60); + _onFocus: function(/*String*/ by){ + if(this.disabled || this.readOnly){ return; } + this.inherited(arguments); + this._updatePlaceHolder(); } - formattedDate.push(time); - } - return formattedDate.join('T'); // String -}; + }); -} + if(has("ie")){ + TextBox = declare(/*===== "dijit.form.TextBox.IEMixin", =====*/ TextBox, { + declaredClass: "dijit.form.TextBox", // for user code referencing declaredClass -if(!dojo._hasResource["dojo.parser"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.parser"] = true; -dojo.provide("dojo.parser"); + _isTextSelected: function(){ + var range = win.doc.selection.createRange(); + var parent = range.parentElement(); + return parent == this.textbox && range.text.length == 0; + }, + + postCreate: function(){ + this.inherited(arguments); + // IE INPUT tag fontFamily has to be set directly using STYLE + // the setTimeout gives IE a chance to render the TextBox and to deal with font inheritance + setTimeout(lang.hitch(this, 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.*/} + }), 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(); + } + } + }else if(has("mozilla")){ + TextBox = declare(/*===== "dijit.form.TextBox.MozMixin", =====*/TextBox, { + declaredClass: "dijit.form.TextBox", // for user code referencing declaredClass + _onBlur: function(e){ + this.inherited(arguments); + if(this.selectOnClick){ + // clear selection so that the next mouse click doesn't reselect + this.textbox.selectionStart = this.textbox.selectionEnd = undefined; + } + } + }); + }else{ + TextBox.prototype.declaredClass = "dijit.form.TextBox"; + } + lang.setObject("dijit.form.TextBox", TextBox); // don't do direct assignment, it confuses API doc parser -new Date("X"); // workaround for #11279, new Date("") == NaN + return TextBox; +}); -dojo.parser = new function(){ +}, +'dijit/_base/scroll':function(){ +define("dijit/_base/scroll", [ + "dojo/window", // windowUtils.scrollIntoView + ".." // export symbol to dijit +], function(windowUtils, dijit){ + // module: + // dijit/_base/scroll // summary: - // The Dom/Widget parsing package + // Back compatibility module, new code should use windowUtils directly instead of using this module. - var d = dojo; - - function val2type(/*Object*/ value){ + dijit.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){ // summary: - // Returns name of type of given value. - - if(d.isString(value)){ return "string"; } - if(typeof value == "number"){ return "number"; } - if(typeof value == "boolean"){ return "boolean"; } - if(d.isFunction(value)){ return "function"; } - if(d.isArray(value)){ return "array"; } // typeof [] == "object" - if(value instanceof Date) { return "date"; } // assume timestamp - if(value instanceof d._Url){ return "url"; } - return "object"; - } - - function str2obj(/*String*/ value, /*String*/ type){ - // summary: - // Convert given string value to given type - switch(type){ - case "string": - return value; - case "number": - return value.length ? Number(value) : NaN; - case "boolean": - // for checked/disabled value might be "" or "checked". interpret as true. - return typeof value == "boolean" ? value : !(value.toLowerCase()=="false"); - case "function": - if(d.isFunction(value)){ - // IE gives us a function, even when we say something like onClick="foo" - // (in which case it gives us an invalid function "function(){ foo }"). - // Therefore, convert to string - value=value.toString(); - value=d.trim(value.substring(value.indexOf('{')+1, value.length-1)); - } - try{ - if(value === "" || value.search(/[^\w\.]+/i) != -1){ - // The user has specified some text for a function like "return x+5" - return new Function(value); - }else{ - // The user has specified the name of a function like "myOnClick" - // or a single word function "return" - return d.getObject(value, false) || new Function(value); - } - }catch(e){ return new Function(); } - case "array": - return value ? value.split(/\s*,\s*/) : []; - case "date": - switch(value){ - case "": return new Date(""); // the NaN of dates - case "now": return new Date(); // current date - default: return d.date.stamp.fromISOString(value); - } - case "url": - return d.baseUrl + value; - default: - return d.fromJson(value); - } - } + // Scroll the passed node into view, if it is not already. + // Deprecated, use `windowUtils.scrollIntoView` instead. - var dummyClass = {}, instanceClasses = { - // map from fully qualified name (like "dijit.Button") to structure like - // { cls: dijit.Button, params: {label: "string", disabled: "boolean"} } + windowUtils.scrollIntoView(node, pos); }; +}); - // Widgets like BorderContainer add properties to _Widget via dojo.extend(). - // If BorderContainer is loaded after _Widget's parameter list has been cached, - // we need to refresh that parameter list (for _Widget and all widgets that extend _Widget). - // TODO: remove this in 2.0, when we stop caching parameters. - d.connect(d, "extend", function(){ - instanceClasses = {}; - }); +}, +'dijit/_TemplatedMixin':function(){ +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/_base/sniff", // has("ie") + "dojo/_base/unload", // unload.addOnWindowUnload + "dojo/_base/window" // win.doc +], function(lang, touch, _WidgetBase, string, cache, array, declare, domConstruct, has, unload, win) { - function getProtoInfo(cls, params){ - // cls: A prototype - // The prototype of the class to check props on - // params: Object - // The parameters object to mix found parameters onto. - for(var name in cls){ - if(name.charAt(0)=="_"){ continue; } // skip internal properties - if(name in dummyClass){ continue; } // skip "constructor" and "toString" - params[name] = val2type(cls[name]); - } - return params; - } +/*===== + var _WidgetBase = dijit._WidgetBase; +=====*/ - function getClassInfo(/*String*/ className, /*Boolean*/ skipParamsLookup){ - // summary: - // Maps a widget name string like "dijit.form.Button" to the widget constructor itself, - // and a list of that widget's parameters and their types - // className: - // fully qualified name (like "dijit.form.Button") - // returns: - // structure like - // { - // cls: dijit.Button, - // params: { label: "string", disabled: "boolean"} - // } - - var c = instanceClasses[className]; - if(!c){ - // get pointer to widget class - var cls = d.getObject(className), params = null; - if(!cls){ return null; } // class not defined [yet] - if(!skipParamsLookup){ // from fastpath, we don't need to lookup the attrs on the proto because they are explicit - params = getProtoInfo(cls.prototype, {}) - } - c = { cls: cls, params: params }; - - }else if(!skipParamsLookup && !c.params){ - // if we're calling getClassInfo and have a cls proto, but no params info, scan that cls for params now - // and update the pointer in instanceClasses[className]. This happens when a widget appears in another - // widget's template which still uses dojoType, but an instance of the widget appears prior with a data-dojo-type, - // skipping this lookup the first time. - c.params = getProtoInfo(c.cls.prototype, {}); - } - - return c; - } + // module: + // dijit/_TemplatedMixin + // summary: + // Mixin for widgets that are instantiated from a template - this._functionFromScript = function(script, attrData){ + var _TemplatedMixin = declare("dijit._TemplatedMixin", null, { // summary: - // Convert a <script type="dojo/method" args="a, b, c"> ... </script> - // into a function - // script: DOMNode - // The <script> DOMNode - // attrData: String - // For HTML5 compliance, searches for attrData + "args" (typically - // "data-dojo-args") instead of "args" - var preamble = ""; - var suffix = ""; - var argsStr = (script.getAttribute(attrData + "args") || script.getAttribute("args")); - if(argsStr){ - d.forEach(argsStr.split(/\s*,\s*/), function(part, idx){ - preamble += "var "+part+" = arguments["+idx+"]; "; - }); - } - var withStr = script.getAttribute("with"); - if(withStr && withStr.length){ - d.forEach(withStr.split(/\s*,\s*/), function(part){ - preamble += "with("+part+"){"; - suffix += "}"; - }); - } - return new Function(preamble+script.innerHTML+suffix); - }; + // Mixin for widgets that are instantiated from a template - this.instantiate = function(/* Array */nodes, /* Object? */mixin, /* Object? */args){ - // summary: - // Takes array of nodes, and turns them into class instances and - // potentially calls a startup method to allow them to connect with - // any children. - // nodes: Array - // Array of nodes or objects like - // | { - // | type: "dijit.form.Button", - // | node: DOMNode, - // | scripts: [ ... ], // array of <script type="dojo/..."> children of node - // | inherited: { ... } // settings inherited from ancestors like dir, theme, etc. - // | } - // mixin: Object? - // An object that will be mixed in with each node in the array. - // Values in the mixin will override values in the node, if they - // exist. - // args: Object? - // An object used to hold kwArgs for instantiation. - // See parse.args argument for details. + // templateString: [protected] String + // A string that represents the widget template. + // Use in conjunction with dojo.cache() to load from a file. + templateString: null, - var thelist = [], - mixin = mixin||{}; - args = args||{}; + // 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, - // TODO: for 2.0 default to data-dojo- regardless of scopeName (or maybe scopeName won't exist in 2.0) - var attrName = (args.scope || d._scopeName) + "Type", // typically "dojoType" - attrData = "data-" + (args.scope || d._scopeName) + "-"; // typically "data-dojo-" + // 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, - d.forEach(nodes, function(obj){ - if(!obj){ return; } + // _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, - // Get pointers to DOMNode, dojoType string, and clsInfo (metadata about the dojoType), etc. - var node, type, clsInfo, clazz, scripts, fastpath; - if(obj.node){ - // new format of nodes[] array, object w/lots of properties pre-computed for me - node = obj.node; - type = obj.type; - fastpath = obj.fastpath; - clsInfo = obj.clsInfo || (type && getClassInfo(type, fastpath)); - clazz = clsInfo && clsInfo.cls; - scripts = obj.scripts; - }else{ - // old (backwards compatible) format of nodes[] array, simple array of DOMNodes. no fastpath/data-dojo-type support here. - node = obj; - type = attrName in mixin ? mixin[attrName] : node.getAttribute(attrName); - clsInfo = type && getClassInfo(type); - clazz = clsInfo && clsInfo.cls; - scripts = (clazz && (clazz._noScript || clazz.prototype._noScript) ? [] : - d.query("> script[type^='dojo/']", node)); - } - if(!clsInfo){ - throw new Error("Could not load class '" + type); - } +/*===== + // _attachPoints: [private] String[] + // List of widget attribute names associated with data-dojo-attach-point=... in the + // template, ex: ["containerNode", "labelNode"] + _attachPoints: [], + =====*/ - // Setup hash to hold parameter settings for this widget. Start with the parameter - // settings inherited from ancestors ("dir" and "lang"). - // Inherited setting may later be overridden by explicit settings on node itself. - var params = {}; - - if(args.defaults){ - // settings for the document itself (or whatever subtree is being parsed) - d._mixin(params, args.defaults); - } - if(obj.inherited){ - // settings from dir=rtl or lang=... on a node above this node - d._mixin(params, obj.inherited); +/*===== + // _attachEvents: [private] Handle[] + // List of connections associated with data-dojo-attach-event=... in the + // template + _attachEvents: [], + =====*/ + + constructor: function(){ + 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}); } - - // mix things found in data-dojo-props into the params - if(fastpath){ - var extra = node.getAttribute(attrData + "props"); - if(extra && extra.length){ - try{ - extra = d.fromJson.call(args.propsThis, "{" + extra + "}"); - d._mixin(params, extra); - }catch(e){ - // give the user a pointer to their invalid parameters. FIXME: can we kill this in production? - throw new Error(e.toString() + " in data-dojo-props='" + extra + "'"); - } + + // 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); + + var node; + if(lang.isString(cached)){ + node = domConstruct.toDom(this._stringRepl(cached)); + 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); + } - // For the benefit of _Templated, check if node has data-dojo-attach-point/data-dojo-attach-event - // and mix those in as though they were parameters - var attachPoint = node.getAttribute(attrData + "attach-point"); - if(attachPoint){ - params.dojoAttachPoint = attachPoint; + 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); } - var attachEvent = node.getAttribute(attrData + "attach-event"); - if(attachEvent){ - params.dojoAttachEvent = attachEvent; + } + }, + + _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<nodes.length; x++){ + var baseNode = (x == -1) ? rootNode : nodes[x]; + if(this.widgetsInTemplate && (getAttrFunc(baseNode, "dojoType") || getAttrFunc(baseNode, "data-dojo-type"))){ + continue; } - dojo.mixin(params, mixin); - }else{ - // FIXME: we need something like "deprecateOnce()" to throw dojo.deprecation for something. - // remove this logic in 2.0 - // read parameters (ie, attributes) specified on DOMNode - - var attributes = node.attributes; - - // clsInfo.params lists expected params like {"checked": "boolean", "n": "number"} - for(var name in clsInfo.params){ - var item = name in mixin ? { value:mixin[name], specified:true } : attributes.getNamedItem(name); - if(!item || (!item.specified && (!dojo.isIE || name.toLowerCase()!="value"))){ continue; } - var value = item.value; - // Deal with IE quirks for 'class' and 'style' - switch(name){ - case "class": - value = "className" in mixin ? mixin.className : node.className; - break; - case "style": - value = "style" in mixin ? mixin.style : (node.style && node.style.cssText); // FIXME: Opera? - } - var _type = clsInfo.params[name]; - if(typeof value == "string"){ - params[name] = str2obj(value, _type); - }else{ - params[name] = value; + // 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 <script type="dojo/*"> script tags - // <script type="dojo/method" event="foo"> tags are added to params, and passed to - // the widget on instantiation. - // <script type="dojo/method"> tags (with no event) are executed after instantiation - // <script type="dojo/connect" event="foo"> tags are dojo.connected after instantiation - // note: dojo/* script tags cannot exist in self closing widgets, like <input /> - var connects = [], // functions to connect after instantiation - calls = []; // functions to call after instantiation - - d.forEach(scripts, function(script){ - node.removeChild(script); - // FIXME: drop event="" support in 2.0. use data-dojo-event="" instead - var event = (script.getAttribute(attrData + "event") || script.getAttribute("event")), - type = script.getAttribute("type"), - nf = d.parser._functionFromScript(script, attrData); - if(event){ - if(type == "dojo/connect"){ - connects.push({event: event, func: nf}); - }else{ - params[event] = nf; + // 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)); + } } - }else{ - calls.push(nf); } - }); + } + }, - var markupFactory = clazz.markupFactory || clazz.prototype && clazz.prototype.markupFactory; - // create the instance - var instance = markupFactory ? markupFactory(params, node, clazz) : new clazz(params, node); - thelist.push(instance); + destroyRendering: function(){ + // Delete all attach points to prevent IE6 memory leaks. + array.forEach(this._attachPoints, function(point){ + delete this[point]; + }, this); + this._attachPoints = []; - // map it to the JS namespace if that makes sense - // FIXME: in 2.0, drop jsId support. use data-dojo-id instead - var jsname = (node.getAttribute(attrData + "id") || node.getAttribute("jsId")); - if(jsname){ - d.setObject(jsname, instance); - } + // And same for event handlers + array.forEach(this._attachEvents, this.disconnect, this); + this._attachEvents = []; - // process connections and startup functions - d.forEach(connects, function(connect){ - d.connect(instance, connect.event, null, connect.func); - }); - d.forEach(calls, function(func){ - func.call(instance); - }); - }); + this.inherited(arguments); + } + }); - // Call startup on each top level instance if it makes sense (as for - // widgets). Parent widgets will recursively call startup on their - // (non-top level) children - if(!mixin._started){ - // TODO: for 2.0, when old instantiate() API is desupported, store parent-child - // relationships in the nodes[] array so that no getParent() call is needed. - // Note that will require a parse() call from ContentPane setting a param that the - // ContentPane is the parent widget (so that the parse doesn't call startup() on the - // ContentPane's children) - d.forEach(thelist, function(instance){ - if( !args.noStart && instance && - dojo.isFunction(instance.startup) && - !instance._started && - (!instance.getParent || !instance.getParent()) - ){ - instance.startup(); + // key is templateString; object is either string or DOM tree + _TemplatedMixin._templateCache = {}; + + _TemplatedMixin.getCachedTemplate = function(templateString, alwaysUseString){ + // 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 + // 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 == win.doc){ + // 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); + if(node.nodeType != 1){ + throw new Error("Invalid template: " + templateString); + } + return (tmplts[key] = node); //Node } - return thelist; }; - this.parse = function(rootNode, args){ - // summary: - // Scan the DOM for class instances, and instantiate them. - // - // description: - // Search specified node (or root node) recursively for class instances, - // and instantiate them. Searches for either data-dojo-type="Class" or - // dojoType="Class" where "Class" is a a fully qualified class name, - // like `dijit.form.Button` - // - // Using `data-dojo-type`: - // Attributes using can be mixed into the parameters used to instantitate the - // Class by using a `data-dojo-props` attribute on the node being converted. - // `data-dojo-props` should be a string attribute to be converted from JSON. - // - // Using `dojoType`: - // Attributes are read from the original domNode and converted to appropriate - // types by looking up the Class prototype values. This is the default behavior - // from Dojo 1.0 to Dojo 1.5. `dojoType` support is deprecated, and will - // go away in Dojo 2.0. - // - // rootNode: DomNode? - // A default starting root node from which to start the parsing. Can be - // omitted, defaulting to the entire document. If omitted, the `args` - // object can be passed in this place. If the `args` object has a - // `rootNode` member, that is used. - // - // args: Object - // a kwArgs object passed along to instantiate() - // - // * noStart: Boolean? - // when set will prevent the parser from calling .startup() - // when locating the nodes. - // * rootNode: DomNode? - // identical to the function's `rootNode` argument, though - // allowed to be passed in via this `args object. - // * template: Boolean - // If true, ignores ContentPane's stopParser flag and parses contents inside of - // a ContentPane inside of a template. This allows dojoAttachPoint on widgets/nodes - // nested inside the ContentPane to work. - // * inherited: Object - // Hash possibly containing dir and lang settings to be applied to - // parsed widgets, unless there's another setting on a sub-node that overrides - // * scope: String - // 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.) - // * propsThis: Object - // If specified, "this" referenced from data-dojo-props will refer to propsThis. - // Intended for use from the widgets-in-template feature of `dijit._Templated` - // - // example: - // Parse all widgets on a page: - // | dojo.parser.parse(); - // - // example: - // Parse all classes within the node with id="foo" - // | dojo.parser.parse(dojo.byId('foo')); - // - // example: - // Parse all classes in a page, but do not call .startup() on any - // child - // | dojo.parser.parse({ noStart: true }) - // - // example: - // Parse all classes in a node, but do not call .startup() - // | dojo.parser.parse(someNode, { noStart:true }); - // | // or - // | dojo.parser.parse({ noStart:true, rootNode: someNode }); - - // determine the root node based on the passed arguments. - var root; - if(!args && rootNode && rootNode.rootNode){ - args = rootNode; - root = args.rootNode; - }else{ - root = rootNode; - } - root = root ? dojo.byId(root) : dojo.body(); - args = args || {}; - - var attrName = (args.scope || d._scopeName) + "Type", // typically "dojoType" - attrData = "data-" + (args.scope || d._scopeName) + "-"; // typically "data-dojo-" - - function scan(parent, list){ - // summary: - // Parent is an Object representing a DOMNode, with or without a dojoType specified. - // Scan parent's children looking for nodes with dojoType specified, storing in list[]. - // If parent has a dojoType, also collects <script type=dojo/*> children and stores in parent.scripts[]. - // parent: Object - // Object representing the parent node, like - // | { - // | node: DomNode, // scan children of this node - // | inherited: {dir: "rtl"}, // dir/lang setting inherited from above node - // | - // | // attributes only set if node has dojoType specified - // | scripts: [], // empty array, put <script type=dojo/*> in here - // | clsInfo: { cls: dijit.form.Button, ...} - // | } - // list: DomNode[] - // Output array of objects (same format as parent) representing nodes to be turned into widgets - - // Effective dir and lang settings on parent node, either set directly or inherited from grandparent - var inherited = dojo.clone(parent.inherited); - dojo.forEach(["dir", "lang"], function(name){ - // TODO: what if this is a widget and dir/lang are declared in data-dojo-props? - var val = parent.node.getAttribute(name); - if(val){ - inherited[name] = val; + 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); } - }); - - // if parent is a widget, then search for <script type=dojo/*> tags and put them in scripts[]. - var scripts = parent.clsInfo && !parent.clsInfo.cls.prototype._noScript ? parent.scripts : null; + delete cache[key]; + } + }); + } - // unless parent is a widget with the stopParser flag set, continue search for dojoType, recursively - var recurse = (!parent.clsInfo || !parent.clsInfo.cls.prototype.stopParser) || (args && args.template); + // 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.) + lang.extend(_WidgetBase,{ + dojoAttachEvent: "", + dojoAttachPoint: "" + }); - // scan parent's children looking for dojoType and <script type=dojo/*> - for(var child = parent.node.firstChild; child; child = child.nextSibling){ - if(child.nodeType == 1){ - // FIXME: desupport dojoType in 2.0. use data-dojo-type instead - var type, html5 = recurse && child.getAttribute(attrData + "type"); - if(html5){ - type = html5; - }else{ - // fallback to backward compatible mode, using dojoType. remove in 2.0 - type = recurse && child.getAttribute(attrName); - } - - var fastpath = html5 == type; - - if(type){ - // if dojoType/data-dojo-type specified, add to output array of nodes to instantiate - var params = { - "type": type, - fastpath: fastpath, - clsInfo: getClassInfo(type, fastpath), // note: won't find classes declared via dojo.Declaration - node: child, - scripts: [], // <script> nodes that are parent's children - inherited: inherited // dir & lang attributes inherited from parent - }; - list.push(params); - - // Recurse, collecting <script type="dojo/..."> children, and also looking for - // descendant nodes with dojoType specified (unless the widget has the stopParser flag), - scan(params, list); - }else if(scripts && child.nodeName.toLowerCase() == "script"){ - // if <script type="dojo/...">, save in scripts[] - type = child.getAttribute("type"); - if (type && /^dojo\/\w/i.test(type)) { - scripts.push(child); - } - }else if(recurse){ - // Recurse, looking for grandchild nodes with dojoType specified - scan({ - node: child, - inherited: inherited - }, list); - } - } - } - } + return _TemplatedMixin; +}); - // Ignore bogus entries in inherited hash like {dir: ""} - var inherited = {}; - if(args && args.inherited){ - for(var key in args.inherited){ - if(args.inherited[key]){ inherited[key] = args.inherited[key]; } - } - } +}, +'dijit/_CssStateMixin':function(){ +define("dijit/_CssStateMixin", [ + "dojo/touch", + "dojo/_base/array", // array.forEach array.map + "dojo/_base/declare", // declare + "dojo/dom-class", // domClass.toggle + "dojo/_base/lang", // lang.hitch + "dojo/_base/window" // win.body +], function(touch, array, declare, domClass, lang, win){ + +// module: +// 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. - // Make list of all nodes on page w/dojoType specified - var list = []; - scan({ - node: root, - inherited: inherited - }, list); +return 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). - // go build the object instances - var mixin = args && args.template ? {template: true} : null; - return this.instantiate(list, mixin, args); // Array - }; -}(); + // 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: {}, -//Register the parser callback. It should be the first callback -//after the a11y test. + // hovering: [readonly] Boolean + // True if cursor is over this widget + hovering: false, -(function(){ - var parseRunner = function(){ - if(dojo.config.parseOnLoad){ - dojo.parser.parse(); - } - }; + // active: [readonly] Boolean + // True if mouse was pressed while over this widget, and hasn't been released yet + active: false, - // FIXME: need to clobber cross-dependency!! - if(dojo.getObject("dijit.wai.onload") === dojo._loaders[0]){ - dojo._loaders.splice(1, 0, parseRunner); - }else{ - dojo._loaders.unshift(parseRunner); - } -})(); + _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); -if(!dojo._hasResource["dojo.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.window"] = true; -dojo.provide("dojo.window"); + // Automatically monitor mouse events (essentially :hover and :active) on this.domNode + array.forEach(["onmouseenter", "onmouseleave", touch.press], function(e){ + this.connect(this.domNode, e, "_cssMouseEvent"); + }, this); -dojo.getObject("window", true, dojo); + // Monitoring changes to disabled, readonly, etc. state, and update CSS class of root node + array.forEach(["disabled", "readOnly", "checked", "selected", "focused", "state", "hovering", "active"], function(attr){ + this.watch(attr, lang.hitch(this, "_setStateClass")); + }, this); -dojo.window.getBox = function(){ - // summary: - // Returns the dimensions and scroll position of the viewable area of a browser window + // Events on sub nodes within the widget + for(var ap in this.cssStateNodes){ + this._trackMouseState(this[ap], this.cssStateNodes[ap]); + } + // 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(); + }, - var scrollRoot = (dojo.doc.compatMode == 'BackCompat') ? dojo.body() : dojo.doc.documentElement; + _cssMouseEvent: function(/*Event*/ event){ + // summary: + // Sets hovering and active properties depending on mouse state, + // which triggers _setStateClass() to set appropriate CSS classes for this.domNode. - // get scroll position - var scroll = dojo._docScroll(); // scrollRoot.scrollTop/Left should work - return { w: scrollRoot.clientWidth, h: scrollRoot.clientHeight, l: scroll.x, t: scroll.y }; -}; + if(!this.disabled){ + switch(event.type){ + case "mouseenter": + case "mouseover": // generated on non-IE browsers even though we connected to mouseenter + this._set("hovering", true); + this._set("active", this._mouseDown); + break; -dojo.window.get = function(doc){ - // summary: - // Get window object associated with document doc + case "mouseleave": + case "mouseout": // generated on non-IE browsers even though we connected to mouseleave + this._set("hovering", false); + this._set("active", false); + break; - // In some IE versions (at least 6.0), document.parentWindow does not return a - // reference to the real window object (maybe a copy), so we must fix it as well - // We use IE specific execScript to attach the real window reference to - // document._parentWindow for later use - if(dojo.isIE && window !== document.parentWindow){ - /* - In IE 6, only the variable "window" can be used to connect events (others - may be only copies). - */ - doc.parentWindow.execScript("document._parentWindow = window;", "Javascript"); - //to prevent memory leak, unset it after use - //another possibility is to add an onUnload handler which seems overkill to me (liucougar) - var win = doc._parentWindow; - doc._parentWindow = null; - return win; // Window - } + case "mousedown": + case "touchpress": + this._set("active", true); + this._mouseDown = true; + // Set a global event to handle mouseup, so it fires properly + // even if the cursor leaves this.domNode before the mouse up event. + // Alternately could set active=false on mouseout. + var mouseUpConnector = this.connect(win.body(), touch.release, function(){ + this._mouseDown = false; + this._set("active", false); + this.disconnect(mouseUpConnector); + }); + break; + } + } + }, - return doc.parentWindow || doc.defaultView; // Window -}; + _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 -dojo.window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){ - // summary: - // Scroll the passed node into view, if it is not already. - - // don't rely on node.scrollIntoView working just because the function is there + // Compute new set of classes + var newStateClasses = this.baseClass.split(" "); - try{ // catch unexpected/unrecreatable errors (#7808) since we can recover using a semi-acceptable native method - node = dojo.byId(node); - var doc = node.ownerDocument || dojo.doc, - body = doc.body || dojo.body(), - html = doc.documentElement || body.parentNode, - isIE = dojo.isIE, isWK = dojo.isWebKit; - // if an untested browser, then use the native method - if((!(dojo.isMoz || isIE || isWK || dojo.isOpera) || node == body || node == html) && (typeof node.scrollIntoView != "undefined")){ - node.scrollIntoView(false); // short-circuit to native if possible - return; + function multiply(modifier){ + newStateClasses = newStateClasses.concat(array.map(newStateClasses, function(c){ return c+modifier; }), "dijit"+modifier); } - var backCompat = doc.compatMode == 'BackCompat', - clientAreaRoot = (isIE >= 9 && node.ownerDocument.parentWindow.frameElement) - ? ((html.clientHeight > 0 && html.clientWidth > 0 && (body.clientHeight == 0 || body.clientWidth == 0 || body.clientHeight > html.clientHeight || body.clientWidth > html.clientWidth)) ? html : body) - : (backCompat ? body : html), - scrollRoot = isWK ? body : clientAreaRoot, - rootWidth = clientAreaRoot.clientWidth, - rootHeight = clientAreaRoot.clientHeight, - rtl = !dojo._isBodyLtr(), - nodePos = pos || dojo.position(node), - el = node.parentNode, - isFixed = function(el){ - return ((isIE <= 6 || (isIE && backCompat))? false : (dojo.style(el, 'position').toLowerCase() == "fixed")); - }; - if(isFixed(node)){ return; } // nothing to do - while(el){ - if(el == body){ el = scrollRoot; } - var elPos = dojo.position(el), - fixedPos = isFixed(el); - - if(el == scrollRoot){ - elPos.w = rootWidth; elPos.h = rootHeight; - if(scrollRoot == html && isIE && rtl){ elPos.x += scrollRoot.offsetWidth-elPos.w; } // IE workaround where scrollbar causes negative x - if(elPos.x < 0 || !isIE){ elPos.x = 0; } // IE can have values > 0 - if(elPos.y < 0 || !isIE){ elPos.y = 0; } - }else{ - var pb = dojo._getPadBorderExtents(el); - elPos.w -= pb.w; elPos.h -= pb.h; elPos.x += pb.l; elPos.y += pb.t; - var clientSize = el.clientWidth, - scrollBarSize = elPos.w - clientSize; - if(clientSize > 0 && scrollBarSize > 0){ - elPos.w = clientSize; - elPos.x += (rtl && (isIE || el.clientLeft > pb.l/*Chrome*/)) ? scrollBarSize : 0; - } - clientSize = el.clientHeight; - scrollBarSize = elPos.h - clientSize; - if(clientSize > 0 && scrollBarSize > 0){ - elPos.h = clientSize; - } - } - if(fixedPos){ // bounded by viewport, not parents - if(elPos.y < 0){ - elPos.h += elPos.y; elPos.y = 0; - } - if(elPos.x < 0){ - elPos.w += elPos.x; elPos.x = 0; - } - if(elPos.y + elPos.h > rootHeight){ - elPos.h = rootHeight - elPos.y; - } - if(elPos.x + elPos.w > rootWidth){ - elPos.w = rootWidth - elPos.x; - } - } - // calculate overflow in all 4 directions - var l = nodePos.x - elPos.x, // beyond left: < 0 - t = nodePos.y - Math.max(elPos.y, 0), // beyond top: < 0 - r = l + nodePos.w - elPos.w, // beyond right: > 0 - bot = t + nodePos.h - elPos.h; // beyond bottom: > 0 - if(r * l > 0){ - var s = Math[l < 0? "max" : "min"](l, r); - if(rtl && ((isIE == 8 && !backCompat) || isIE >= 9)){ s = -s; } - nodePos.x += el.scrollLeft; - el.scrollLeft += s; - nodePos.x -= el.scrollLeft; - } - if(bot * t > 0){ - nodePos.y += el.scrollTop; - el.scrollTop += Math[t < 0? "max" : "min"](t, bot); - nodePos.y -= el.scrollTop; - } - el = (el != scrollRoot) && !fixedPos && el.parentNode; + if(!this.isLeftToRight()){ + // For RTL mode we need to set an addition class like dijitTextBoxRtl. + multiply("Rtl"); } - }catch(error){ - console.error('scrollIntoView: ' + error); - node.scrollIntoView(false); - } -}; -} + 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(!dojo._hasResource["dijit._base.manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._base.manager"] = true; -dojo.provide("dijit._base.manager"); + 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"); + } -dojo.declare("dijit.WidgetSet", null, { - // summary: - // A set of widgets indexed by id. A default instance of this class is - // available as `dijit.registry` - // - // example: - // Create a small list of widgets: - // | var ws = new dijit.WidgetSet(); - // | ws.add(dijit.byId("one")); - // | ws.add(dijit.byId("two")); - // | // destroy both: - // | ws.forEach(function(w){ w.destroy(); }); - // - // example: - // Using dijit.registry: - // | dijit.registry.forEach(function(w){ /* do something */ }); + // 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 - constructor: function(){ - this._hash = {}; - this.length = 0; - }, + array.forEach(tn.className.split(" "), function(c){ classHash[c] = true; }); - add: function(/*dijit._Widget*/ widget){ - // summary: - // Add a widget to this list. If a duplicate ID is detected, a error is thrown. - // - // widget: dijit._Widget - // Any dijit._Widget subclass. - if(this._hash[widget.id]){ - throw new Error("Tried to register widget with id==" + widget.id + " but that id is already registered"); + if("_stateClasses" in this){ + array.forEach(this._stateClasses, function(c){ delete classHash[c]; }); } - 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--; + 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; }, - forEach: function(/*Function*/ func, /* Object? */thisObj){ + _trackMouseState: function(/*DomNode*/ node, /*String*/ clazz){ // 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 `dojo.forEach`. - // - // thisObj: - // An optional scope parameter - // - // example: - // Using the default `dijit.registry` instance: - // | dijit.registry.forEach(function(widget){ - // | console.log(widget.declaredClass); - // | }); + // 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 // - // returns: - // Returns self, in order to allow for further chaining. + // 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). - thisObj = thisObj || dojo.global; - var i = 0, id; - for(id in this._hash){ - func.call(thisObj, this._hash[id], i++, this._hash); - } - return this; // dijit.WidgetSet - }, + // Current state of node (initially false) + // NB: setting specifically to false because domClass.toggle() needs true boolean as third arg + var hovering=false, active=false, focused=false; - filter: function(/*Function*/ filter, /* Object? */thisObj){ - // summary: - // Filter down this WidgetSet to a smaller new WidgetSet - // Works the same as `dojo.filter` and `dojo.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 - // | dijit.registry.filter(function(w, i){ - // | return i % 2 == 0; - // | }).forEach(function(w){ /* odd ones */ }); + var self = this, + cn = lang.hitch(this, "connect", node); - thisObj = thisObj || dojo.global; - var res = new dijit.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); - } + function setClass(){ + var disabled = ("disabled" in self && self.disabled) || ("readonly" in self && self.readonly); + domClass.toggle(node, clazz+"Hover", hovering && !active && !disabled); + domClass.toggle(node, clazz+"Active", active && !disabled); + domClass.toggle(node, clazz+"Focused", focused && !disabled); } - 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 - // | var ws = new dijit.WidgetSet(); - // | ws.add(dijit.byId("bar")); - // | var t = ws.byId("bar") // returns a widget - // | var x = ws.byId("foo"); // returns undefined + // Mouse + cn("onmouseenter", function(){ + hovering = true; + setClass(); + }); + cn("onmouseleave", function(){ + hovering = false; + active = false; + setClass(); + }); + cn(touch.press, function(){ + active = true; + setClass(); + }); + cn(touch.release, function(){ + active = false; + setClass(); + }); - return this._hash[id]; // dijit._Widget - }, + // Focus + cn("onfocus", function(){ + focused = true; + setClass(); + }); + cn("onblur", function(){ + focused = false; + setClass(); + }); - 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: - // | dijit.registry.byClass("dijit.TitlePane").forEach(function(tp){ tp.close(); }); + // Just in case widget is enabled/disabled while it has focus/hover/active state. + // Maybe this is overkill. + this.watch("disabled", setClass); + this.watch("readOnly", setClass); + } +}); +}); - var res = new dijit.WidgetSet(), id, widget; - for(id in this._hash){ - widget = this._hash[id]; - if(widget.declaredClass == cls){ - res.add(widget); - } - } - return res; // dijit.WidgetSet }, +'dijit/DialogUnderlay':function(){ +define("dijit/DialogUnderlay", [ + "dojo/_base/declare", // declare + "dojo/dom-attr", // domAttr.set + "dojo/_base/window", // win.body + "dojo/window", // winUtils.getBox + "./_Widget", + "./_TemplatedMixin", + "./BackgroundIframe" +], function(declare, domAttr, win, winUtils, _Widget, _TemplatedMixin, BackgroundIframe){ - toArray: function(){ - // summary: - // Convert this WidgetSet into a true Array - // - // example: - // Work with the widget .domNodes in a real Array - // | dojo.map(dijit.registry.toArray(), function(w){ return w.domNode; }); +/*===== + var _Widget = dijit._Widget; + var _TemplatedMixin = dijit._TemplatedMixin; +=====*/ - var ar = []; - for(var id in this._hash){ - ar.push(this._hash[id]); - } - return ar; // dijit._Widget[] -}, + // module: + // dijit/DialogUnderlay + // summary: + // The component that blocks the screen behind a `dijit.Dialog` - map: function(/* Function */func, /* Object? */thisObj){ + return declare("dijit.DialogUnderlay", [_Widget, _TemplatedMixin], { // summary: - // Create a new Array from this WidgetSet, following the same rules as `dojo.map` - // example: - // | var nodes = dijit.registry.map(function(w){ return w.domNode; }); + // The component that blocks the screen behind a `dijit.Dialog` // - // returns: - // A new array of the returned values. - return dojo.map(this.toArray(), func, thisObj); // Array - }, - - every: function(func, thisObj){ - // summary: - // A synthetic clone of `dojo.every` acting explicitly on this WidgetSet + // 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` // - // func: Function - // A callback function run for every widget in this list. Exits loop - // when the first false return is encountered. + // The underlay itself can be styled based on and id: + // | #myDialog_underlay { background-color:red; } // - // thisObj: Object? - // Optional scope parameter to use for the callback + // In the case of `dijit.Dialog`, this id is based on the id of the Dialog, + // suffixed with _underlay. - thisObj = thisObj || dojo.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 - }, + // 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>", - some: function(func, thisObj){ - // summary: - // A synthetic clone of `dojo.some` acting explictly 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 + // Parameters on creation or updatable later - thisObj = thisObj || dojo.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 - } + // 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": "", -(function(){ + _setDialogIdAttr: function(id){ + domAttr.set(this.node, "id", id + "_underlay"); + this._set("dialogId", id); + }, - /*===== - dijit.registry = { - // summary: - // A list of widgets on a page. - // description: - // Is an instance of `dijit.WidgetSet` - }; - =====*/ - dijit.registry = new dijit.WidgetSet(); + _setClassAttr: function(clazz){ + this.node.className = "dijitDialogUnderlay " + clazz; + this._set("class", clazz); + }, - var hash = dijit.registry._hash, - attr = dojo.attr, - hasAttr = dojo.hasAttr, - style = dojo.style; + postCreate: function(){ + // summary: + // Append the underlay to the body + win.body().appendChild(this.domNode); + }, - dijit.byId = function(/*String|dijit._Widget*/ id){ - // summary: - // Returns a widget by it's id, or if passed a widget, no-op (like dojo.byId()) - return typeof id == "string" ? hash[id] : id; // dijit._Widget - }; + 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 _widgetTypeCtr = {}; - dijit.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 - }; - - dijit.findWidgets = function(/*DomNode*/ root){ - // summary: - // Search subtree under root returning widgets found. - // Doesn't search for nested widgets (ie, widgets inside other widgets). - - 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{ - getChildrenHelper(node); - } - } - } - } - - getChildrenHelper(root); - return outAry; - }; - - dijit._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 - dojo.forEach(dijit.findWidgets(dojo.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(); - } - } - }); - }; - - if(dojo.isIE){ - // Only run _destroyAll() for IE because we think it's only necessary in that case, - // and because it causes problems on FF. See bug #3531 for details. - dojo.addOnWindowUnload(function(){ - dijit._destroyAll(); - }); - } - - dijit.byNode = function(/*DOMNode*/ node){ - // summary: - // Returns the widget corresponding to the given DOMNode - return hash[node.getAttribute("widgetId")]; // dijit._Widget - }; - - dijit.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.getAttribute && node.getAttribute("widgetId"); - if(id){ - return hash[id]; - } - node = node.parentNode; - } - return null; - }; + var is = this.node.style, + os = this.domNode.style; - var shown = (dijit._isElementShown = function(/*Element*/ elem){ - var s = style(elem); - return (s.visibility != "hidden") - && (s.visibility != "collapsed") - && (s.display != "none") - && (attr(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 hasAttr(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.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(attr(elem, "disabled")){ - return false; - }else if(hasAttr(elem, "tabIndex")){ - // Explicit tab index setting - return attr(elem, "tabIndex") >= 0; // boolean - }else{ - // No explicit tabIndex setting, so depends on node type - return dijit.hasDefaultTabStop(elem); - } - }); + // 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"; - 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){ - dojo.query("> *", parent).forEach(function(child){ - // Skip 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((dojo.isIE && child.scopeName!=="HTML") || !shown(child)){ - return; - } + // then resize and show + var viewport = winUtils.getBox(); + os.top = viewport.t + "px"; + os.left = viewport.l + "px"; + is.width = viewport.w + "px"; + is.height = viewport.h + "px"; + os.display = "block"; + }, - if(isTabNavigable(child)){ - var tabindex = attr(child, "tabIndex"); - if(!hasAttr(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(dojo.attr(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; + 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"; } - return { first: rs(first), last: rs(last), lowest: rs(lowest), highest: rs(highest) }; - } - dijit.getFirstInTabbingOrder = function(/*String|DOMNode*/ root){ - // summary: - // Finds the descendant of the specified root node - // that is first in the tabbing order - var elems = dijit._getTabNavigable(dojo.byId(root)); - return elems.lowest ? elems.lowest : elems.first; // DomNode - }; - - dijit.getLastInTabbingOrder = function(/*String|DOMNode*/ root){ - // summary: - // Finds the descendant of the specified root node - // that is last in the tabbing order - var elems = dijit._getTabNavigable(dojo.byId(root)); - return elems.last ? elems.last : elems.highest; // DomNode - }; - - /*===== - dojo.mixin(dijit, { - // defaultDuration: Integer - // The default animation speed (in ms) to use for all Dijit - // transitional animations, unless otherwise specified - // on a per-instance basis. Defaults to 200, overrided by - // `djConfig.defaultDuration` - defaultDuration: 200 }); - =====*/ - - dijit.defaultDuration = dojo.config["defaultDuration"] || 200; +}); -})(); +}, +'dijit/layout/ScrollingTabController':function(){ +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\">\n\t<div role=\"presentation\" class=\"dijitTabInnerDiv\" data-dojo-attach-point=\"innerDiv,focusNode\">\n\t\t<div role=\"presentation\" class=\"dijitTabContent dijitButtonContents\" data-dojo-attach-point=\"tabContent\">\n\t\t\t<img role=\"presentation\" alt=\"\" src=\"${_blankGif}\" class=\"dijitTabStripIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t\t\t<span data-dojo-attach-point=\"containerNode,titleNode\" class=\"dijitButtonText\"></span>\n\t\t</div>\n\t</div>\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/query", // query + "dojo/_base/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, query, has, + registry, tabControllerTemplate, buttonTemplate, TabController, layoutUtils, _WidgetsInTemplateMixin, + Menu, MenuItem, Button, _HasDropDown){ -} +/*===== +var _WidgetsInTemplateMixin = dijit._WidgetsInTemplateMixin; +var Menu = dijit.Menu; +var _HasDropDown = dijit._HasDropDown; +var TabController = dijit.layout.TabController; +=====*/ -if(!dojo._hasResource["dijit._base.focus"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._base.focus"] = true; -dojo.provide("dijit._base.focus"); +// module: +// dijit/layout/ScrollingTabController +// summary: +// Set of tabs with left/right arrow keys and a menu to switch between tabs not +// all fitting on a single row. +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 -// summary: -// These functions are used to query or set the focus and selection. -// -// Also, they trace when widgets become activated/deactivated, -// so that the widget can fire _onFocus/_onBlur events. -// "Active" here means something similar to "focused", but -// "focus" isn't quite the right word because we keep track of -// a whole stack of "active" widgets. Example: ComboButton --> Menu --> -// MenuItem. The onBlur event for ComboButton doesn't fire due to focusing -// on the Menu or a MenuItem, since they are considered part of the -// ComboButton widget. It only happens when focus is shifted -// somewhere completely different. - -dojo.mixin(dijit, { - // _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 = dojo.doc.selection, cf = dijit._curFocus; - - if(dojo.global.getSelection){ - //W3C Range API for selections. - sel = dojo.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 = {}; + baseClass: "dijitTabController dijitScrollingTabController", - //'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 - }, + templateString: tabControllerTemplate, - moveToBookmark: function(/*Object*/bookmark){ - // summary: - // Moves current selection to a bookmark - // bookmark: - // This should be a returned object from dijit.getBookmark() + // 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, - var _doc = dojo.doc, - mark = bookmark.mark; - if(mark){ - if(dojo.global.getSelection){ - //W3C Rangi API (FF, WebKit, Opera, etc) - var sel = dojo.global.getSelection(); - if(sel && sel.removeAllRanges){ - if(mark.pRange){ - var r = mark; - var n = r.node; - n.selectionStart = r.start; - n.selectionEnd = r.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(dojo.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 - dojo.forEach(mark, function(n){ - rg.addElement(n); - }); - }else{ - rg = _doc.body.createTextRange(); - rg.moveToBookmark(mark); - } - rg.select(); - } - } - }, + // 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, - 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._Widget or {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 = !dijit._curFocus || (menu && dojo.isDescendant(dijit._curFocus, menu.domNode)) ? dijit._prevFocus : dijit._curFocus; - return { - node: node, - bookmark: (node == dijit._curFocus) && dojo.withGlobal(openedForWindow || dojo.global, dijit.getBookmark), - openedForWindow: openedForWindow - }; // Object - }, + // tabStripClass: [const] String + // The css class to apply to the tab strip, if it is visible. + tabStripClass: "", - 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 + widgetsInTemplate: true, - if(!handle){ return; } + // _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, - 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; + // Override default behavior mapping class to DOMNode + _setClassAttr: { node: "containerNode", type: "class" }, - // 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*/} - } - dijit._onFocusNode(node); - } + buildRendering: function(){ + this.inherited(arguments); + var n = this.domNode; - // 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 && dojo.withGlobal(openedForWindow || dojo.global, dijit.isCollapsed) && !collapsed){ - if(openedForWindow){ - openedForWindow.focus(); - } - try{ - dojo.withGlobal(openedForWindow || dojo.global, dijit.moveToBookmark, null, [bookmark]); - }catch(e2){ - /*squelch IE internal error, see http://trac.dojotoolkit.org/ticket/1984 */ - } - } - }, + this.scrollNode = this.tablistWrapper; + this._initButtons(); - // _activeStack: dijit._Widget[] - // List of currently active widgets (focused widget and it's ancestors) - _activeStack: [], + if(!this.tabStripClass){ + this.tabStripClass = "dijitTabContainer" + + this.tabPosition.charAt(0).toUpperCase() + + this.tabPosition.substr(1).replace(/-.*/, "") + + "None"; + domClass.add(n, "tabStrip-disabled") + } - 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 dijit.registerWin(iframe.contentWindow, iframe); + domClass.add(this.tablistWrapper, this.tabStripClass); }, - 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() + onStartup: function(){ + this.inherited(arguments); - dijit.unregisterWin(handle); + // 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; }, - 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() - - // TODO: make this function private in 2.0; Editor/users should call registerIframe(), - - var mousedownListener = function(evt){ - dijit._justMouseDowned = true; - setTimeout(function(){ dijit._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(dojo.isIE && evt && evt.srcElement && evt.srcElement.parentNode == null){ - return; - } + onAddChild: function(page, insertIndex){ + this.inherited(arguments); - dijit._onTouchNode(effectiveNode || evt.target || evt.srcElement, "mouse"); - }; - //dojo.connect(targetWindow, "onscroll", ???); - - // Listen for blur and focus events on targetWindow's document. - // IIRC, I'm using attachEvent() rather than dojo.connect() because focus/blur events don't bubble - // through dojo.connect(), and also maybe to catch the focus events early, before onfocus handlers - // fire. - // 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 = dojo.isIE ? targetWindow.document.documentElement : targetWindow.document; - if(doc){ - if(dojo.isIE){ - targetWindow.document.body.attachEvent('onmousedown', mousedownListener); - var activateListener = function(evt){ - // IE reports that nodes like <body> have gotten focus, even though they have tabIndex=-1, - // Should consider those more like a mouse-click than a focus.... - if(evt.srcElement.tagName.toLowerCase() != "#document" && - dijit.isTabNavigable(evt.srcElement)){ - dijit._onFocusNode(effectiveNode || evt.srcElement); - }else{ - dijit._onTouchNode(effectiveNode || evt.srcElement); + // changes to the tab button label or iconClass will have changed the width of the + // buttons, so do a resize + array.forEach(["label", "iconClass"], function(attr){ + this.pane2watches[page.id].push( + this.pane2button[page.id].watch(attr, lang.hitch(this, function(){ + if(this._postStartup && this._dim){ + this.resize(this._dim); } - }; - doc.attachEvent('onactivate', activateListener); - var deactivateListener = function(evt){ - dijit._onBlurNode(effectiveNode || evt.srcElement); - }; - doc.attachEvent('ondeactivate', deactivateListener); + })) + ); + }, this); - return function(){ - targetWindow.document.detachEvent('onmousedown', mousedownListener); - doc.detachEvent('onactivate', activateListener); - doc.detachEvent('ondeactivate', deactivateListener); - doc = null; // prevent memory leak (apparent circular reference via closure) - }; - }else{ - doc.body.addEventListener('mousedown', mousedownListener, true); - var focusListener = function(evt){ - dijit._onFocusNode(effectiveNode || evt.target); - }; - doc.addEventListener('focus', focusListener, true); - var blurListener = function(evt){ - dijit._onBlurNode(effectiveNode || evt.target); - }; - doc.addEventListener('blur', blurListener, true); + // 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"); + }, - return function(){ - doc.body.removeEventListener('mousedown', mousedownListener, true); - doc.removeEventListener('focus', focusListener, true); - doc.removeEventListener('blur', blurListener, true); - doc = null; // prevent memory leak (apparent circular reference via closure) - }; - } + 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); }, - unregisterWin: function(/*Handle*/ handle){ + _initButtons: function(){ // 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. + // Creates the buttons used to scroll to view tabs that + // may not be visible if the TabContainer is too narrow. - // Currently our handle is actually a function - handle && handle(); + // 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); }, - _onBlurNode: function(/*DomNode*/ node){ - // summary: - // Called when focus leaves a node. - // Usually ignored, _unless_ it *isn't* follwed by touching another node, - // which indicates that we tabbed off the last field on the page, - // in which case every widget is marked inactive - dijit._prevFocus = dijit._curFocus; - dijit._curFocus = null; - - if(dijit._justMouseDowned){ - // the mouse down caused a new widget to be marked as active; this blur event - // is coming late, so ignore it. - return; + _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 + domStyle.get(rightTab, "width") - leftTab.offsetLeft; + }else{ + return 0; } + }, - // if the blur event isn't followed by a focus event then mark all widgets as inactive. - if(dijit._clearActiveWidgetsTimer){ - clearTimeout(dijit._clearActiveWidgetsTimer); - } - dijit._clearActiveWidgetsTimer = setTimeout(function(){ - delete dijit._clearActiveWidgetsTimer; - dijit._setStack([]); - dijit._prevFocus = null; - }, 100); + _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; }, - _onTouchNode: function(/*DomNode*/ node, /*String*/ by){ + resize: function(dim){ // 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 + // Hides or displays the buttons used to scroll the tab list and launch the menu + // that selects tabs. - // ignore the recent blurNode event - if(dijit._clearActiveWidgetsTimer){ - clearTimeout(dijit._clearActiveWidgetsTimer); - delete dijit._clearActiveWidgetsTimer; - } + // Save the dimensions to be used when a child is renamed. + this._dim = dim; - // compute stack of active widgets (ex: ComboButton --> Menu --> MenuItem) - var newStack=[]; - try{ - while(node){ - var popupParent = dojo.attr(node, "dijitPopupParent"); - if(popupParent){ - node=dijit.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 === dojo.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=dojo.window.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 && dijit.byId(id); - if(widget && !(by == "mouse" && widget.get("disabled"))){ - newStack.unshift(id); - } - node=node.parentNode; - } - } - }catch(e){ /* squelch */ } + // 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); - dijit._setStack(newStack, by); - }, + // 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"); - _onFocusNode: function(/*DomNode*/ node){ - // summary: - // Callback when node is focused + // 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"}]); - if(!node){ - return; + // 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()); } - 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; - } + // Enable/disabled left right buttons depending on whether or not user can scroll to left or right + this._setButtonClass(this._getScroll()); - dijit._onTouchNode(node); + this._postResize = true; - if(node == dijit._curFocus){ return; } - if(dijit._curFocus){ - dijit._prevFocus = dijit._curFocus; - } - dijit._curFocus = node; - dojo.publish("focusNode", [node]); + // 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}; }, - _setStack: function(/*String[]*/ newStack, /*String*/ by){ + _getScroll: function(){ // 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 = dijit._activeStack; - dijit._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, send blur event - for(var i=oldStack.length-1; i>=nCommon; i--){ - widget = dijit.byId(oldStack[i]); - if(widget){ - widget._focused = false; - widget.set("focused", false); - widget._hasBeenBlurred = true; - if(widget._onBlur){ - widget._onBlur(by); - } - dojo.publish("widgetBlur", [widget, by]); - } - } + // 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; + }, - // for all element that have come into focus, send focus event - for(i=nCommon; i<newStack.length; i++){ - widget = dijit.byId(newStack[i]); - if(widget){ - widget._focused = true; - widget.set("focused", true); - if(widget._onFocus){ - widget._onFocus(by); - } - dojo.publish("widgetFocus", [widget, by]); - } + _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); } - } -}); - -// register top window and all the iframes it contains -dojo.addOnLoad(function(){ - var handle = dijit.registerWin(window); - if(dojo.isIE){ - dojo.addOnWindowUnload(function(){ - dijit.unregisterWin(handle); - handle = null; - }) - } -}); + }, -} + onSelectChild: function(/*dijit._Widget*/ page){ + // summary: + // Smoothly scrolls to a tab when it is selected. -if(!dojo._hasResource["dojo.AdapterRegistry"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.AdapterRegistry"] = true; -dojo.provide("dojo.AdapterRegistry"); + var tab = this.pane2button[page.id]; + if(!tab || !page){return;} + var node = tab.domNode; -dojo.AdapterRegistry = function(/*Boolean?*/ returnWrappers){ - // summary: - // A registry to make contextual calling/searching easier. - // description: - // Objects of this class keep list of arrays in the form [name, check, - // wrap, directReturn] that are used to determine what the contextual - // result of a set of checked arguments is. All check/wrap functions - // in this registry should be of the same arity. - // example: - // | // create a new registry - // | var reg = new dojo.AdapterRegistry(); - // | reg.register("handleString", - // | dojo.isString, - // | function(str){ - // | // do something with the string here - // | } - // | ); - // | reg.register("handleArr", - // | dojo.isArray, - // | function(arr){ - // | // do something with the array here - // | } - // | ); - // | - // | // now we can pass reg.match() *either* an array or a string and - // | // the value we pass will get handled by the right function - // | reg.match("someValue"); // will call the first function - // | reg.match(["someValue"]); // will call the second + // Save the selection + if(node != this._selectedTab){ + this._selectedTab = node; - this.pairs = []; - this.returnWrappers = returnWrappers || false; // Boolean -}; + // Scroll to the selected tab, except on startup, when scrolling is handled in resize() + if(this._postResize){ + var sl = this._getScroll(); -dojo.extend(dojo.AdapterRegistry, { - register: function(/*String*/ name, /*Function*/ check, /*Function*/ wrap, /*Boolean?*/ directReturn, /*Boolean?*/ override){ - // summary: - // register a check function to determine if the wrap function or - // object gets selected - // name: - // a way to identify this matcher. - // check: - // a function that arguments are passed to from the adapter's - // match() function. The check function should return true if the - // given arguments are appropriate for the wrap function. - // directReturn: - // If directReturn is true, the value passed in for wrap will be - // returned instead of being called. Alternately, the - // AdapterRegistry can be set globally to "return not call" using - // the returnWrappers property. Either way, this behavior allows - // the registry to act as a "search" function instead of a - // function interception library. - // override: - // If override is given and true, the check function will be given - // highest priority. Otherwise, it will be the lowest priority - // adapter. - this.pairs[((override) ? "unshift" : "push")]([name, check, wrap, directReturn]); - }, - - match: function(/* ... */){ - // summary: - // Find an adapter for the given arguments. If no suitable adapter - // is found, throws an exception. match() accepts any number of - // arguments, all of which are passed to all matching functions - // from the registered pairs. - for(var i = 0; i < this.pairs.length; i++){ - var pair = this.pairs[i]; - if(pair[1].apply(this, arguments)){ - if((pair[3])||(this.returnWrappers)){ - return pair[2]; - }else{ - return pair[2].apply(this, arguments); + if(sl > node.offsetLeft || + sl + domStyle.get(this.scrollNode, "width") < + node.offsetLeft + domStyle.get(node, "width")){ + this.createSmoothScroll().play(); } } } - throw new Error("No match found"); - }, - unregister: function(name){ - // summary: Remove a named adapter from the registry + this.inherited(arguments); + }, - // FIXME: this is kind of a dumb way to handle this. On a large - // registry this will be slow-ish and we can use the name as a lookup - // should we choose to trade memory for speed. - for(var i = 0; i < this.pairs.length; i++){ - var pair = this.pairs[i]; - if(pair[0] == name){ - this.pairs.splice(i, 1); - return true; - } + _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 + domStyle.get(children[children.length-1].domNode, "width")) - 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 + }; } - return false; - } -}); + }, -} + _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(); -if(!dojo._hasResource["dijit._base.place"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._base.place"] = true; -dojo.provide("dijit._base.place"); + // 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(); + } -dijit.getViewport = function(){ - // summary: - // Returns the dimensions and scroll position of the viewable area of a browser window + if(this._anim && this._anim.status() == "playing"){ + this._anim.stop(); + } - return dojo.window.getBox(); -}; + 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; -/*===== -dijit.__Position = function(){ - // x: Integer - // horizontal coordinate in pixels, relative to document body - // y: Integer - // vertical coordinate in pixels, relative to document body - - thix.x = x; - this.y = y; -} -=====*/ + // Disable/enable left/right buttons according to new scroll position + this._setButtonClass(x); + return anim; // dojo._Animation + }, -dijit.placeOnScreen = function( - /* DomNode */ node, - /* dijit.__Position */ pos, - /* String[] */ corners, - /* dijit.__Position? */ 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. - // pos: - // Object like {x: 10, y: 20} - // corners: - // 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: - // 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). - // | placeOnScreen(node, {x: 10, y: 20}, ["TR", "BL"]) - - var choices = dojo.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; - }); + _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; + }, - return dijit._place(node, choices); -} + doSlideRight: function(/*Event*/ e){ + // summary: + // Scrolls the menu to the right. + // e: + // The mouse click event. + this.doSlide(1, this._getBtnNode(e)); + }, -dijit._place = function(/*DomNode*/ node, choices, layoutNode, /*Object*/ 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 = dojo.window.getBox(); - - // This won't work if the node is inside a <div style="position: relative">, - // so reattach it to dojo.doc.body. (Otherwise, the positioning will be wrong - // and also it might get cutoff) - if(!node.parentNode || String(node.parentNode.tagName).toLowerCase() != "body"){ - dojo.body().appendChild(node); - } + doSlideLeft: function(/*Event*/ e){ + // summary: + // Scrolls the menu to the left. + // e: + // The mouse click event. + this.doSlide(-1,this._getBtnNode(e)); + }, - var best = null; - dojo.some(choices, function(choice){ - var corner = choice.corner; - var pos = choice.pos; - var overflow = 0; + 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. - // calculate amount of space available given specified position of node - var spaceAvailable = { - w: corner.charAt(1) == 'L' ? (view.l + view.w) - pos.x : pos.x - view.l, - h: corner.charAt(1) == 'T' ? (view.t + view.h) - pos.y : pos.y - view.t - }; + if(node && domClass.contains(node, "dijitTabDisabled")){return;} - // 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; - style.visibility = "hidden"; - style.display = ""; - var mb = dojo.marginBox(node); - style.display = oldDisplay; - style.visibility = oldVis; - - // coordinates and size of node with specified corner placed at pos, - // and clipped by viewport - var startX = Math.max(view.l, corner.charAt(1) == 'L' ? pos.x : (pos.x - mb.w)), - startY = Math.max(view.t, corner.charAt(0) == 'T' ? pos.y : (pos.y - mb.h)), - endX = Math.min(view.l + view.w, corner.charAt(1) == 'L' ? (startX + mb.w) : pos.x), - endY = Math.min(view.t + view.h, corner.charAt(0) == 'T' ? (startY + mb.h) : pos.y), - width = endX - startX, - height = endY - startY; - - overflow += (mb.w - width) + (mb.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; - }); + var sWidth = domStyle.get(this.scrollNode, "width"); + var d = (sWidth * 0.75) * direction; - // 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); - } + var to = this._getScroll() + d; - // 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 = dojo._isBodyLtr(), - s = node.style; - s.top = best.y + "px"; - s[l ? "left" : "right"] = (l ? best.x : view.w - best.x - best.w) + "px"; - - return best; -} + this._setButtonClass(to); -dijit.placeOnScreenAroundNode = function( - /* DomNode */ node, - /* DomNode */ aroundNode, - /* Object */ aroundCorners, - /* Function? */ layoutNode){ + this.createSmoothScroll(to).play(); + }, - // summary: - // Position node adjacent or kitty-corner to aroundNode - // 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. - // - // aroundCorners: - // Ordered list of pairs of corners to try matching up. - // Each pair of corners is represented as a key/value in the hash, - // where the key corresponds to the aroundNode's corner, and - // the value corresponds to the node's corner: - // - // | { aroundNodeCorner1: nodeCorner1, aroundNodeCorner2: nodeCorner2, ...} - // - // The following strings are used to represent the four corners: - // * "BL" - bottom left - // * "BR" - bottom right - // * "TL" - top left - // * "TR" - top right - // - // 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. - // - // example: - // | dijit.placeOnScreenAroundNode(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) - // + _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 - // get coordinates of aroundNode - aroundNode = dojo.byId(aroundNode); - var aroundNodePos = dojo.position(aroundNode, true); + var scrollBounds = this._getScrollBounds(); + this._leftBtn.set("disabled", scroll <= scrollBounds.min); + this._rightBtn.set("disabled", scroll >= scrollBounds.max); + } +}); - // place the node around the calculated rectangle - return dijit._placeOnScreenAroundRect(node, - aroundNodePos.x, aroundNodePos.y, aroundNodePos.w, aroundNodePos.h, // rectangle - aroundCorners, layoutNode); -}; -/*===== -dijit.__Rectangle = function(){ - // x: Integer - // horizontal offset in pixels, relative to document body - // y: Integer - // vertical offset in pixels, relative to document body - // width: Integer - // width in pixels - // height: Integer - // height in pixels - - this.x = x; - this.y = y; - this.width = width; - this.height = height; -} -=====*/ +var ScrollingTabControllerButtonMixin = declare("dijit.layout._ScrollingTabControllerButtonMixin", null, { + baseClass: "dijitTab tabStripButton", + templateString: buttonTemplate, -dijit.placeOnScreenAroundRectangle = function( - /* DomNode */ node, - /* dijit.__Rectangle */ aroundRect, - /* Object */ aroundCorners, - /* Function */ layoutNode){ + // Override inherited tabIndex: 0 from dijit.form.Button, because user shouldn't be + // able to tab to the left/right/menu buttons + tabIndex: "", - // 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. + // 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; } +}); +/*===== +ScrollingTabControllerButtonMixin = dijit.layout._ScrollingTabControllerButtonMixin; +=====*/ - return dijit._placeOnScreenAroundRect(node, - aroundRect.x, aroundRect.y, aroundRect.width, aroundRect.height, // rectangle - aroundCorners, layoutNode); -}; +// Class used in template +declare("dijit.layout._ScrollingTabControllerButton", + [Button, ScrollingTabControllerButtonMixin]); -dijit._placeOnScreenAroundRect = function( - /* DomNode */ node, - /* Number */ x, - /* Number */ y, - /* Number */ width, - /* Number */ height, - /* Object */ aroundCorners, - /* Function */ layoutNode){ +// Class used in template +declare( + "dijit.layout._ScrollingTabControllerMenuButton", + [Button, _HasDropDown, ScrollingTabControllerButtonMixin], +{ + // id of the TabContainer itself + containerId: "", - // summary: - // Like dijit.placeOnScreenAroundNode(), except it accepts coordinates - // of a rectangle to place node adjacent to. + // -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", - // TODO: combine with placeOnScreenAroundRectangle() + isLoaded: function(){ + // recreate menu every time, in case the TabContainer's list of children (or their icons/labels) have changed + return false; + }, - // Generate list of possible positions for node - var choices = []; - for(var nodeCorner in aroundCorners){ - choices.push( { - aroundCorner: nodeCorner, - corner: aroundCorners[nodeCorner], - pos: { - x: x + (nodeCorner.charAt(1) == 'L' ? 0 : width), - y: y + (nodeCorner.charAt(0) == 'T' ? 0 : height) - } + loadDropDown: function(callback){ + this.dropDown = new Menu({ + id: this.containerId + "_menu", + dir: this.dir, + lang: this.lang, + textDir: this.textDir }); - } - - return dijit._place(node, choices, layoutNode, {w: width, h: height}); -}; - -dijit.placementRegistry= new dojo.AdapterRegistry(); -dijit.placementRegistry.register("node", - function(n, x){ - return typeof x == "object" && - typeof x.offsetWidth != "undefined" && typeof x.offsetHeight != "undefined"; - }, - dijit.placeOnScreenAroundNode); -dijit.placementRegistry.register("rect", - function(n, x){ - return typeof x == "object" && - "x" in x && "y" in x && "width" in x && "height" in x; + 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, + dir: page.dir, + lang: page.lang, + textDir: page.textDir, + onClick: function(){ + container.selectChild(page); + } + }); + this.dropDown.addChild(menuItem); + }, this); + callback(); }, - dijit.placeOnScreenAroundRectangle); - -dijit.placeOnScreenAroundElement = function( - /* DomNode */ node, - /* Object */ aroundElement, - /* Object */ aroundCorners, - /* Function */ layoutNode){ - - // summary: - // Like dijit.placeOnScreenAroundNode(), except it accepts an arbitrary object - // for the "around" argument and finds a proper processor to place a node. - return dijit.placementRegistry.match.apply(dijit.placementRegistry, arguments); -}; - -dijit.getPopupAroundAlignment = function(/*Array*/ position, /*Boolean*/ leftToRight){ - // summary: - // Transforms the passed array of preferred positions into a format suitable for passing as the aroundCorners argument to dijit.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 = {}; - dojo.forEach(position, function(pos){ - 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": - leftToRight = !leftToRight; - // fall through - case "below": - // first try to align left borders, next try to align right borders (or reverse for RTL mode) - align[leftToRight ? "BL" : "BR"] = leftToRight ? "TL" : "TR"; - align[leftToRight ? "BR" : "BL"] = leftToRight ? "TR" : "TL"; - break; - case "above-alt": - leftToRight = !leftToRight; - // fall through - case "above": - default: - // first try to align left borders, next try to align right borders (or reverse for RTL mode) - align[leftToRight ? "TL" : "TR"] = leftToRight ? "BL" : "BR"; - align[leftToRight ? "TR" : "TL"] = leftToRight ? "BR" : "BL"; - break; + closeDropDown: function(/*Boolean*/ focus){ + this.inherited(arguments); + if(this.dropDown){ + this.dropDown.destroyRecursive(); + delete this.dropDown; } - }); - return align; -}; + } +}); -} +return ScrollingTabController; +}); -if(!dojo._hasResource["dijit._base.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._base.window"] = true; -dojo.provide("dijit._base.window"); +}, +'dijit/place':function(){ +define("dijit/place", [ + "dojo/_base/array", // array.forEach array.map array.some + "dojo/dom-geometry", // domGeometry.getMarginBox domGeometry.position + "dojo/dom-style", // domStyle.getComputedStyle + "dojo/_base/kernel", // kernel.deprecated + "dojo/_base/window", // win.body + "dojo/window", // winUtils.getBox + "." // dijit (defining dijit.place to match API doc) +], function(array, domGeometry, domStyle, kernel, win, winUtils, dijit){ + + // module: + // dijit/place + // summary: + // Code to place a popup relative to another node + + + 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(); + + // 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().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)] + }; + // 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 mb = domGeometry. getMarginBox(node); + style.display = oldDisplay; + style.visibility = oldVis; -dijit.getDocumentWindow = function(doc){ - return dojo.window.get(doc); -}; + // coordinates and size of node with specified corner placed at pos, + // and clipped by viewport + var + startXpos = { + 'L': pos.x, + 'R': pos.x - mb.w, + 'M': Math.max(view.l, Math.min(view.l + view.w, pos.x + (mb.w >> 1)) - mb.w) // M orientation is more flexible + }[corner.charAt(1)], + startYpos = { + 'T': pos.y, + 'B': pos.y - mb.h, + 'M': Math.max(view.t, Math.min(view.t + view.h, pos.y + (mb.h >> 1)) - mb.h) + }[corner.charAt(0)], + startX = Math.max(view.l, startXpos), + startY = Math.max(view.t, startYpos), + endX = Math.min(view.l + view.w, startXpos + mb.w), + endY = Math.min(view.t + view.h, startYpos + mb.h), + width = endX - startX, + height = endY - startY; + + overflow += (mb.w - width) + (mb.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; + }); -if(!dojo._hasResource["dijit._base.popup"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._base.popup"] = true; -dojo.provide("dijit._base.popup"); + // 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(), + 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; + } + /*===== + dijit.place.__Position = function(){ + // x: Integer + // horizontal coordinate in pixels, relative to document body + // y: Integer + // vertical coordinate in pixels, relative to document body + + this.x = x; + this.y = y; + }; + =====*/ + /*===== + dijit.place.__Rectangle = function(){ + // 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" from backwards-compatibility. + + this.x = x; + this.y = y; + this.w = w; + this.h = h; + }; + =====*/ -/*===== -dijit.popup.__OpenArgs = function(){ - // 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 an - // ordered list of tuples of the form (around-node-corner, popup-node-corner). - // dijit.popup.open() tries to position the popup according to each tuple in the list, in order, - // until the popup appears fully within the viewport. - // - // The default value is {BL:'TL', TL:'BL'}, which represents a list of two tuples: - // 1. (BL, TL) - // 2. (TL, BL) - // where BL means "bottom left" and "TL" means "top left". - // So by default, it first tries putting the popup below the around node, left-aligning them, - // and then tries to put it above the around node, still left-aligning them. Note that the - // default is horizontally reversed when in RTL mode. - // - // 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: dijit.__Position - // adding a buffer around the opening position. This is only useful when around is not set. - this.popup = popup; - this.parent = parent; - this.around = around; - this.x = x; - this.y = y; - this.orient = orient; - this.onCancel = onCancel; - this.onClose = onClose; - this.onExecute = onExecute; - this.padding = padding; -} -=====*/ - -dijit.popup = { - // summary: - // This singleton is used to show/hide widgets as popups. - - // _stack: dijit._Widget[] - // 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 || DomNode*/ 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.declaredClass ? widget._popupWrapper : (widget.parentNode && dojo.hasClass(widget.parentNode, "dijitPopup")), - node = widget.domNode || widget; - - 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 = dojo.create("div",{ - "class":"dijitPopup", - style:{ display: "none"}, - role: "presentation" - }, dojo.body()); - wrapper.appendChild(node); - - var s = node.style; - s.display = ""; - s.visibility = ""; - s.position = ""; - s.top = "0px"; + return (dijit.place = { + // summary: + // Code to place a DOMNode relative to another DOMNode. + // Load using require(["dijit/place"], function(place){ ... }). - if(widget.declaredClass){ // TODO: in 2.0 change signature to always take widget, then remove if() - widget._popupWrapper = wrapper; - dojo.connect(widget, "destroy", function(){ - dojo.destroy(wrapper); - delete widget._popupWrapper; - }); - } - } - - return wrapper; - }, + 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; + }); - moveOffScreen: function(/*Widget || DomNode*/ 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. + return _place(node, choices); + }, - // Create wrapper if not already there - var wrapper = this._createWrapper(widget); + around: function( + /*DomNode*/ node, + /*DomNode || dijit.place.__Rectangle*/ anchor, + /*String[]*/ positions, + /*Boolean*/ leftToRight, + /*Function?*/ layoutNode){ - dojo.style(wrapper, { - visibility: "hidden", - top: "-9999px", // prevent transient scrollbar causing misalign (#5776), and initial flash in upper left (#10111) - display: "" - }); - }, + // 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) + // - hide: function(/*dijit._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. + // if around is a DOMNode (or DOMNode id), convert to coordinates + var aroundNodePos = (typeof anchor == "string" || "offsetWidth" in anchor) + ? domGeometry.position(anchor, true) + : anchor; + + // Adjust anchor positioning for the case that a parent node has overflw hidden, therefore cuasing the anchor not to be completely visible + if(anchor.parentNode){ + var parent = anchor.parentNode; + while(parent && parent.nodeType == 1 && parent.nodeName != "BODY"){ //ignoring the body will help performance + var parentPos = domGeometry.position(parent, true); + var parentStyleOverflow = domStyle.getComputedStyle(parent).overflow; + if(parentStyleOverflow == "hidden" || parentStyleOverflow == "auto" || parentStyleOverflow == "scroll"){ + 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; + } + 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); + } + }); - // Create wrapper if not already there - var wrapper = this._createWrapper(widget); + var position = _place(node, choices, layoutNode, {w: width, h: height}); + position.aroundNodePos = aroundNodePos; - dojo.style(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 position; } - return stack[pi]; - }, + }); +}); - open: function(/*dijit.popup.__OpenArgs*/ args){ - // summary: - // Popup the widget at the specified position - // - // example: - // opening at the mouse position - // | dijit.popup.open({popup: menuWidget, x: evt.pageX, y: evt.pageY}); - // - // example: - // opening the widget as a dropdown - // | dijit.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 || ( - (args.parent ? args.parent.isLeftToRight() : dojo._isBodyLtr()) ? - {'BL':'TL', 'BR':'TR', 'TL':'BL', 'TR':'BR'} : - {'BR':'TR', 'BL':'TL', 'TR':'BR', 'TL':'BL'} - ), - around = args.around, - id = (args.around && args.around.id) ? (args.around.id+"_dropdown") : ("popup_"+this._idGen++); +}, +'dijit/_HasDropDown':function(){ +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", + "dojo/keys", // keys.DOWN_ARROW keys.ENTER keys.ESCAPE + "dojo/_base/lang", // lang.hitch lang.isFunction + "dojo/touch", + "dojo/_base/window", // win.doc + "dojo/window", // winUtils.getBox + "./registry", // registry.byNode() + "./focus", + "./popup", + "./_FocusMixin" +], function(declare, Deferred, event,dom, domAttr, domClass, domGeometry, domStyle, has, keys, lang, touch, + win, winUtils, registry, focus, popup, _FocusMixin){ - // 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 || !dojo.isDescendant(args.parent.domNode, stack[stack.length-1].widget.domNode))){ - dijit.popup.close(stack[stack.length-1].widget); - } +/*===== + var _FocusMixin = dijit._FocusMixin; +=====*/ - // Get pointer to popup wrapper, and create wrapper if it doesn't exist - var wrapper = this._createWrapper(widget); + // module: + // dijit/_HasDropDown + // summary: + // Mixin for widgets that need drop down ability. + return declare("dijit._HasDropDown", _FocusMixin, { + // summary: + // Mixin for widgets that need drop down ability. - dojo.attr(wrapper, { - id: id, - style: { - zIndex: this._beginZIndex + stack.length - }, - "class": "dijitPopup " + (widget.baseClass || widget["class"] || "").split(" ")[0] +"Popup", - dijitPopupParent: args.parent ? args.parent.id : "" - }); + // _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, - if(dojo.isIE || dojo.isMoz){ - if(!widget.bgIframe){ - // setting widget.bgIframe triggers cleanup in _Widget.destroy() - widget.bgIframe = new dijit.BackgroundIframe(wrapper); - } - } + // _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, - // position the wrapper node and make it visible - var best = around ? - dijit.placeOnScreenAroundElement(wrapper, around, orient, widget.orient ? dojo.hitch(widget, "orient") : null) : - dijit.placeOnScreen(wrapper, args, orient == 'R' ? ['TR','BR','TL','BL'] : ['TL','BL','TR','BR'], args.padding); + // _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, - wrapper.style.display = ""; - wrapper.style.visibility = "visible"; - widget.domNode.style.visibility = "visible"; // counteract effects from _HasDropDown + // _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, - var handlers = []; + // dropDown: [protected] Widget + // The widget to display as a popup. This widget *must* be + // defined before the startup function is called. + dropDown: null, - // provide default escape and tab key handling - // (this will work for any widget, not just menu) - handlers.push(dojo.connect(wrapper, "onkeypress", this, function(evt){ - if(evt.charOrCode == dojo.keys.ESCAPE && args.onCancel){ - dojo.stopEvent(evt); - args.onCancel(); - }else if(evt.charOrCode === dojo.keys.TAB){ - dojo.stopEvent(evt); - var topPopup = this.getTopPopup(); - if(topPopup && topPopup.onCancel){ - topPopup.onCancel(); - } - } - })); + // 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, - // watch for cancel/execute events on the popup and notify the caller - // (for a menu, "execute" means clicking an item) - if(widget.onCancel){ - handlers.push(dojo.connect(widget, "onCancel", args.onCancel)); - } + // forceWidth: [protected] Boolean + // Set to true to make the drop down exactly as wide as this + // widget. Overrides autoWidth. + forceWidth: false, - handlers.push(dojo.connect(widget, widget.onExecute ? "onExecute" : "onChange", this, function(){ - var topPopup = this.getTopPopup(); - if(topPopup && topPopup.onExecute){ - topPopup.onExecute(); - } - })); + // 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, - stack.push({ - widget: widget, - parent: args.parent, - onExecute: args.onExecute, - onCancel: args.onCancel, - onClose: args.onClose, - handlers: handlers - }); + // 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"], - if(widget.onOpen){ - // TODO: in 2.0 standardize onShow() (used by StackContainer) and onOpen() (used here) - widget.onOpen(best); - } + // _stopClickEvents: Boolean + // When set to false, the click events will not be stopped, in + // case you want to use them in your subwidget + _stopClickEvents: true, - return best; - }, + _onDropDownMouseDown: function(/*Event*/ e){ + // summary: + // Callback when the user mousedown's on the arrow icon + if(this.disabled || this.readOnly){ return; } - close: function(/*dijit._Widget?*/ popup){ - // summary: - // Close specified popup and any popups that it parented. - // If no popup is specified, closes all popups. + // Prevent default to stop things like text selection, but don't stop propogation, so that: + // 1. TimeTextBox etc. can focusthe <input> on mousedown + // 2. dropDownButtonActive class applied by _CssStateMixin (on button depress) + // 3. user defined onMouseDown handler fires + e.preventDefault(); - var stack = this._stack; + this._docHandler = this.connect(win.doc, touch.release, "_onDropDownMouseUp"); - // 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 && dojo.some(stack, function(elem){return elem.widget == popup;})) || - (!popup && stack.length)){ - var top = stack.pop(), - widget = top.widget, - onClose = top.onClose; + this.toggleDropDown(); + }, - if(widget.onClose){ - // TODO: in 2.0 standardize onHide() (used by StackContainer) and onClose() (used here) - widget.onClose(); + _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); } - dojo.forEach(top.handlers, dojo.disconnect); + var dropDown = this.dropDown, overMenu = false; - // 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(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(onClose){ - onClose(); + if(this._opened){ + if(dropDown.focus && dropDown.autoFocus !== false){ + // Focus the dropdown widget - do it on a delay so that we + // don't steal our own focus. + window.setTimeout(lang.hitch(dropDown, "focus"), 1); + } + }else{ + // The drop down arrow icon probably can't receive focus, but widget itself should get focus. + // setTimeout() needed to make it work on IE (test DateTextBox) + setTimeout(lang.hitch(this, "focus"), 0); } - } - } -}; -// TODO: remove dijit._frames, it isn't being used much, since popups never release their -// iframes (see [22236]) -dijit._frames = new function(){ - // summary: - // cache of iframes + if(has("ios")){ + this._justGotMouseUp = true; + setTimeout(lang.hitch(this, function(){ + this._justGotMouseUp = false; + }), 0); + } + }, - var queue = []; + _onDropDownClick: function(/*Event*/ e){ + if(has("ios") && !this._justGotMouseUp){ + // This branch fires on iPhone for ComboBox, because the button node is an <input> and doesn't + // generate touchstart/touchend events. Pretend we just got a mouse down / mouse up. + // The if(has("ios") 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); + } - this.pop = function(){ - var iframe; - if(queue.length){ - iframe = queue.pop(); - iframe.style.display=""; - }else{ - if(dojo.isIE < 9){ - var burl = dojo.config["dojoBlankHtmlUrl"] || (dojo.moduleUrl("dojo", "resources/blank.html")+"") || "javascript:\"\""; - var html="<iframe src='" + burl + "'" - + " style='position: absolute; left: 0px; top: 0px;" - + "z-index: -1; filter:Alpha(Opacity=\"0\");'>"; - iframe = dojo.doc.createElement(html); - }else{ - iframe = dojo.create("iframe"); - iframe.src = 'javascript:""'; - iframe.className = "dijitBackgroundIframe"; - dojo.style(iframe, "opacity", 0.1); + // The drop down was already opened on mousedown/keydown; just need to call stopEvent(). + if(this._stopClickEvents){ + event.stop(e); } - iframe.tabIndex = -1; // Magic to prevent iframe from getting focus on tab keypress - as style didn't work. - dijit.setWaiRole(iframe,"presentation"); - } - return iframe; - }; + }, - this.push = function(iframe){ - iframe.style.display="none"; - queue.push(iframe); - } -}(); + buildRendering: function(){ + this.inherited(arguments); + this._buttonNode = this._buttonNode || this.focusNode || this.domNode; + this._popupStateNode = this._popupStateNode || this.focusNode || this._buttonNode; -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(dojo.isIE || dojo.isMoz){ - var iframe = (this.iframe = dijit._frames.pop()); - node.appendChild(iframe); - if(dojo.isIE<7 || dojo.isQuirks){ - this.resize(node); - this._conn = dojo.connect(node, 'onresize', this, function(){ - this.resize(node); - }); - }else{ - dojo.style(iframe, { - width: '100%', - height: '100%' - }); - } - } -}; + // 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"); + }, -dojo.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){ - dojo.style(this.iframe, { - width: node.offsetWidth + 'px', - height: node.offsetHeight + 'px' - }); - } - }, - destroy: function(){ - // summary: - // destroy the iframe - if(this._conn){ - dojo.disconnect(this._conn); - this._conn = null; - } - if(this.iframe){ - dijit._frames.push(this.iframe); - delete this.iframe; - } - } -}); + postCreate: function(){ + // summary: + // set up nodes and connect our mouse and keypress events -} + this.inherited(arguments); -if(!dojo._hasResource["dijit._base.scroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._base.scroll"] = true; -dojo.provide("dijit._base.scroll"); + this.connect(this._buttonNode, touch.press, "_onDropDownMouseDown"); + this.connect(this._buttonNode, "onclick", "_onDropDownClick"); + this.connect(this.focusNode, "onkeypress", "_onKey"); + this.connect(this.focusNode, "onkeyup", "_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 -dijit.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){ - // summary: - // Scroll the passed node into view, if it is not already. - // Deprecated, use `dojo.window.scrollIntoView` instead. - - dojo.window.scrollIntoView(node, pos); -}; + 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.charOrCode == keys.ESCAPE){ + this.closeDropDown(); + event.stop(e); + }else if(!this._opened && + (e.charOrCode == keys.DOWN_ARROW || + ( (e.charOrCode == keys.ENTER || e.charOrCode == " ") && + //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); + } + }, -if(!dojo._hasResource["dojo.uacss"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.uacss"] = true; -dojo.provide("dojo.uacss"); + _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){ + setTimeout(lang.hitch(d, "focus"), 1); + } + } + }, + _onBlur: function(){ + // summary: + // Called magically when focus has shifted away from this widget and it's dropdown -(function(){ - // summary: - // Applies pre-set CSS classes to the top-level HTML node, based on: - // - browser (ex: dj_ie) - // - browser version (ex: dj_ie6) - // - box model (ex: dj_contentBox) - // - text direction (ex: dijitRtl) - // - // In addition, browser, browser version, and box model are - // combined with an RTL flag when browser text is RTL. ex: dj_ie-rtl. + // 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); - var d = dojo, - html = d.doc.documentElement, - ie = d.isIE, - opera = d.isOpera, - maj = Math.floor, - ff = d.isFF, - boxModel = d.boxModel.replace(/-/,''), + this.closeDropDown(focusMe); - classes = { - dj_ie: ie, - dj_ie6: maj(ie) == 6, - dj_ie7: maj(ie) == 7, - dj_ie8: maj(ie) == 8, - dj_ie9: maj(ie) == 9, - dj_quirks: d.isQuirks, - dj_iequirks: ie && d.isQuirks, + this.inherited(arguments); + }, - // NOTE: Opera not supported by dijit - dj_opera: opera, + 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 - dj_khtml: d.isKhtml, + return true; + }, - dj_webkit: d.isWebKit, - dj_safari: d.isSafari, - dj_chrome: d.isChrome, + 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 - dj_gecko: d.isMozilla, - dj_ff3: maj(ff) == 3 - }; // no dojo unsupported browsers + // TODO: for 2.0, change API to return a Deferred, instead of calling loadCallback? + loadCallback(); + }, - classes["dj_" + boxModel] = true; + 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; + }, - // apply browser, browser version, and box model class names - var classStr = ""; - for(var clz in classes){ - if(classes[clz]){ - classStr += clz + " "; - } - } - html.className = d.trim(html.className + " " + classStr); + 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 RTL mode, then add dj_rtl flag plus repeat existing classes with -rtl extension. - // We can't run the code below until the <body> tag has loaded (so we can check for dir=rtl). - // Unshift() is to run sniff code before the parser. - dojo._loaders.unshift(function(){ - if(!dojo._isBodyLtr()){ - var rtlClassStr = "dj_rtl dijitRtl " + classStr.replace(/ /g, "-rtl ") - html.className = d.trim(html.className + " " + rtlClassStr); - } - }); -})(); + 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 -if(!dojo._hasResource["dijit._base.sniff"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._base.sniff"] = true; -dojo.provide("dijit._base.sniff"); + 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) -// summary: -// Applies pre-set CSS classes to the top-level HTML node, see -// `dojo.uacss` for details. -// -// Simply doing a require on this module will -// establish this CSS. Modified version of Morris' CSS hack. + 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); -if(!dojo._hasResource["dijit._base.typematic"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._base.typematic"] = true; -dojo.provide("dijit._base.typematic"); + // 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(), + 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); -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. + 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 + var mb = domGeometry.getMarginSize(ddNode); + var overHeight = (maxHeight && mb.h > maxHeight); + domStyle.set(ddNode, { + overflowX: "hidden", + overflowY: overHeight ? "auto" : "hidden" + }); + if(overHeight){ + mb.h = maxHeight; + if("w" in mb){ + mb.w += 16; // room for vertical scrollbar + } + }else{ + delete mb.h; + } - _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(dojo.hitch(this, "_fireEventAndReload"), this._currentTimeout); - }, + // 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; + } - 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 (optional): - // 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 (optional): - // the number of milliseconds until the 2nd event occurs, default=500ms - // minDelay (optional): - // 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._evt = evt; - this._node = node; - this._currentTimeout = -1; - this._count = -1; - this._callback = dojo.hitch(_this, callback); - this._fireEventAndReload(); - this._evt = dojo.mixin({faux: true}, evt); - } - }, + // And finally, resize the dropdown to calculated height and width + if(lang.isFunction(dropDown.resize)){ + dropDown.resize(mb); + }else{ + domGeometry.setMarginBox(ddNode, mb); + } + } - 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: - // an array of dojo.connect handles - if(keyObject.keyCode){ - keyObject.charOrCode = keyObject.keyCode; - dojo.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); - dojo.deprecated("charCode attribute parameter for dijit.typematic.addKeyListener is deprecated. Use charOrCode instead.", "", "2.0"); - } - return [ - dojo.connect(node, "onkeypress", 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)){ - dojo.stopEvent(evt); - dijit.typematic.trigger(evt, _this, node, callback, keyObject, subsequentDelay, initialDelay, minDelay); - }else if(dijit.typematic._obj == keyObject){ - dijit.typematic.stop(); - } - }), - dojo.connect(node, "onkeyup", this, function(evt){ - if(dijit.typematic._obj == keyObject){ - dijit.typematic.stop(); - } - }) - ]; - }, - - 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: - // an array of dojo.connect handles - var dc = dojo.connect; - return [ - dc(node, "mousedown", this, function(evt){ - dojo.stopEvent(evt); - dijit.typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay, minDelay); - }), - dc(node, "mouseup", this, function(evt){ - dojo.stopEvent(evt); - dijit.typematic.stop(); - }), - dc(node, "mouseout", this, function(evt){ - dojo.stopEvent(evt); - dijit.typematic.stop(); - }), - dc(node, "mousemove", this, function(evt){ - evt.preventDefault(); - }), - dc(node, "dblclick", this, function(evt){ - dojo.stopEvent(evt); - if(dojo.isIE){ - dijit.typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay, minDelay); - setTimeout(dojo.hitch(this, dijit.typematic.stop), 50); + 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._opened = false; } - }) - ]; - }, - - 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: - // an array of dojo.connect handles - return this.addKeyListener(keyNode, keyObject, _this, callback, subsequentDelay, initialDelay, minDelay).concat( - this.addMouseListener(mouseNode, _this, callback, subsequentDelay, initialDelay, minDelay)); - } -}; - -} - -if(!dojo._hasResource["dijit._base.wai"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._base.wai"] = true; -dojo.provide("dijit._base.wai"); - - -dijit.wai = { - onload: function(){ - // summary: - // Detects if we are in high-contrast mode or not + }); + domAttr.set(this._popupStateNode, "popupActive", "true"); + domClass.add(self._popupStateNode, "dijitHasDropDownOpen"); + this._opened=true; - // This must be a named function and not an anonymous - // function, so that the widget parsing code can make sure it - // registers its onload function after this function. - // DO NOT USE "this" within this function. + // TODO: set this.checked and call setStateClass(), to affect button look while drop down is shown + return retVal; + }, - // create div for testing if high contrast mode is on or images are turned off - var div = dojo.create("div",{ - id: "a11yTestNode", - style:{ - cssText:'border: 1px solid;' - + 'border-color:red green;' - + 'position: absolute;' - + 'height: 5px;' - + 'top: -999px;' - + 'background-image: url("' + (dojo.config.blankGif || dojo.moduleUrl("dojo", "resources/blank.gif")) + '");' - } - }, dojo.body()); + closeDropDown: function(/*Boolean*/ focus){ + // summary: + // Closes the drop down on this widget + // focus: + // If true, refocuses the button widget + // tags: + // protected - // test it - var cs = dojo.getComputedStyle(div); - if(cs){ - var bkImg = cs.backgroundImage; - var needsA11y = (cs.borderTopColor == cs.borderRightColor) || (bkImg != null && (bkImg == "none" || bkImg == "url(invalid-url:)" )); - dojo[needsA11y ? "addClass" : "removeClass"](dojo.body(), "dijit_a11y"); - if(dojo.isIE){ - div.outerHTML = ""; // prevent mixed-content warning, see http://support.microsoft.com/kb/925014 - }else{ - dojo.body().removeChild(div); + if(this._opened){ + if(focus){ this.focus(); } + popup.close(this.dropDown); + this._opened = false; } } - } -}; - -// Test if computer is in high contrast mode. -// Make sure the a11y test runs first, before widgets are instantiated. -if(dojo.isIE || dojo.isMoz){ // NOTE: checking in Safari messes things up - dojo._loaders.unshift(dijit.wai.onload); -} - -dojo.mixin(dijit, { - 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 dojo.trim((dojo.attr(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. + }); +}); - dojo.attr(elem, "role", role); - }, +}, +'dijit/tree/TreeStoreModel':function(){ +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/json", // json.stringify + "dojo/_base/lang" // lang.hitch +], function(array, aspect, declare, json, lang){ + + // module: + // dijit/tree/TreeStoreModel + // summary: + // Implements dijit.Tree.model connecting to a dojo.data store with a single + // root item. - removeWaiRole: function(/*Element*/ elem, /*String*/ role){ + return declare("dijit.tree.TreeStoreModel", null, { // summary: - // Removes the specified role from an element. - // Removes role attribute if no specific role provided (for backwards compat.) + // 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. - var roleValue = dojo.attr(elem, "role"); - if(!roleValue){ return; } - if(role){ - var t = dojo.trim((" " + roleValue + " ").replace(" " + role + " ", " ")); - dojo.attr(elem, "role", t); - }else{ - elem.removeAttribute("role"); - } - }, + // store: dojo.data.Store + // Underlying store + store: null, - 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. + // childrenAttrs: String[] + // One or more attribute names (attributes in the dojo.data item) that specify that item's children + childrenAttrs: ["children"], - return elem.hasAttribute ? elem.hasAttribute("aria-"+state) : !!elem.getAttribute("aria-"+state); - }, + // 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", - 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. + // labelAttr: String + // If specified, get label for tree node from this attribute, rather + // than by calling store.getLabel() + labelAttr: "", - return elem.getAttribute("aria-"+state) || ""; - }, + // root: [readonly] dojo.data.Item + // Pointer to the root item (read only, not a parameter) + root: null, - setWaiState: function(/*Element*/ elem, /*String*/ state, /*String*/ value){ - // summary: - // Sets a state on an element. - // description: - // Sets an attribute called "aria-"+state. + // 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, - elem.setAttribute("aria-"+state, value); - }, + // 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, - removeWaiState: function(/*Element*/ elem, /*String*/ state){ - // summary: - // Removes a state from an element. - // description: - // Sets an attribute called "aria-"+state. + constructor: function(/* Object */ args){ + // summary: + // Passed the arguments listed above (store, etc) + // tags: + // private - elem.removeAttribute("aria-"+state); - } -}); + lang.mixin(this, args); -} - -if(!dojo._hasResource["dijit._base"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._base"] = true; -dojo.provide("dijit._base"); + this.connects = []; + var store = this.store; + if(!store.getFeatures()['dojo.data.api.Identity']){ + throw new Error("dijit.Tree: 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(this.declaredClass + ": query " + json.stringify(this.query) + " returned " + items.length + + " items, but must return exactly one item"); + } + 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 + }, -if(!dojo._hasResource["dojo.Stateful"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.Stateful"] = true; -dojo.provide("dojo.Stateful"); + fetchItemByIdentity: function(/* object */ keywordArgs){ + this.store.fetchItemByIdentity(keywordArgs); + }, + getIdentity: function(/* item */ item){ + return this.store.getIdentity(item); // Object + }, -dojo.declare("dojo.Stateful", null, { - // summary: - // Base class for objects that provide named properties with optional getter/setter - // control and the ability to watch for property changes - // example: - // | var obj = new dojo.Stateful(); - // | obj.watch("foo", function(){ - // | console.log("foo changed to " + this.get("foo")); - // | }); - // | obj.set("foo","bar"); - postscript: function(mixin){ - if(mixin){ - dojo.mixin(this, mixin); - } - }, - - get: function(/*String*/name){ - // summary: - // Get a property on a Stateful instance. - // name: - // The property to get. - // description: - // Get a named property on a Stateful object. The property may - // potentially be retrieved via a getter method in subclasses. In the base class - // this just retrieves the object's property. - // For example: - // | stateful = new dojo.Stateful({foo: 3}); - // | stateful.get("foo") // returns 3 - // | stateful.foo // returns 3 - - return this[name]; - }, - set: function(/*String*/name, /*Object*/value){ - // summary: - // Set a property on a Stateful instance - // name: - // The property to set. - // value: - // The value to set in the property. - // description: - // Sets named properties on a stateful object and notifies any watchers of - // the property. A programmatic setter may be defined in subclasses. - // For example: - // | stateful = new dojo.Stateful(); - // | stateful.watch(function(name, oldValue, value){ - // | // this will be called on the set below - // | } - // | stateful.set(foo, 5); - // - // set() may also be called with a hash of name/value pairs, ex: - // | myObj.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]); + 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 } - return this; - } - var oldValue = this[name]; - this[name] = value; - if(this._watchCallbacks){ - this._watchCallbacks(name, oldValue, value); - } - return this; - }, - watch: function(/*String?*/name, /*Function*/callback){ - // summary: - // Watches a property for changes - // name: - // Indicates the property to watch. This is optional (the callback may be the - // only parameter), and if omitted, all the properties will be watched - // returns: - // An object handle for the watch. The unwatch method of this object - // can be used to discontinue watching this property: - // | var watchHandle = obj.watch("foo", callback); - // | watchHandle.unwatch(); // callback won't be called now - // callback: - // The function to execute when the property changes. This will be called after - // the property has been changed. The callback will be called with the |this| - // set to the instance, the first argument as the name of the property, the - // second argument as the old value and the third argument as the new value. - - var callbacks = this._watchCallbacks; - if(!callbacks){ - var self = this; - callbacks = this._watchCallbacks = function(name, oldValue, value, ignoreCatchall){ - var notify = function(propertyCallbacks){ - if(propertyCallbacks){ - propertyCallbacks = propertyCallbacks.slice(); - for(var i = 0, l = propertyCallbacks.length; i < l; i++){ - try{ - propertyCallbacks[i].call(self, name, oldValue, value); - }catch(e){ - console.error(e); - } + }, + + // ======================================================================= + // Write interface + + newItem: function(/* dojo.dnd.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. + // 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); } } - }; - notify(callbacks['_' + name]); - if(!ignoreCatchall){ - notify(callbacks["*"]); // the catch-all + }}); + }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); } - }; // we use a function instead of an object so it will be ignored by JSON conversion - } - if(!callback && typeof name === "function"){ - callback = name; - name = "*"; - }else{ - // prepend with dash to prevent name conflicts with function (like "name" property) - name = '_' + name; - } - var propertyCallbacks = callbacks[name]; - if(typeof propertyCallbacks !== "object"){ - propertyCallbacks = callbacks[name] = []; - } - propertyCallbacks.push(callback); - return { - unwatch: function(){ - propertyCallbacks.splice(dojo.indexOf(propertyCallbacks, callback), 1); } - }; - } - -}); + }, -} + 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 -if(!dojo._hasResource["dijit._WidgetBase"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._WidgetBase"] = true; -dojo.provide("dijit._WidgetBase"); + // 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 + }, -(function(){ + 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 + }, -dojo.declare("dijit._WidgetBase", dojo.Stateful, { - // summary: - // Future base class for all Dijit widgets. - // _Widget extends this class adding support for various features needed by desktop. + 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 + }, - // 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: "", - - // 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: "", - - // 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: "", - - // class: String - // HTML class attribute - "class": "", + // ======================================================================= + // Events from data store - // style: String||Object - // HTML style attributes as cssText string or name/value hash - style: "", + 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 - // 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: "", + // We only care about the new item if it has a parent that corresponds to a TreeNode + // we are currently displaying + if(!parentInfo){ + return; + } - // 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: "", + // 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); + })); + }, - // baseClass: [protected] String - // Root CSS class of the widget (ex: dijitTextBox), used to construct CSS classes to indicate - // widget state. - baseClass: "", + onDeleteItem: function(/*Object*/ item){ + // summary: + // Handler for delete notifications from underlying store + this.onDelete(item); + }, - // srcNodeRef: [readonly] DomNode - // pointer to original DOM node - srcNodeRef: null, + 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 - // 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 dojoAttachPoint syntax, but the domNode - // property is the canonical "top level" node in widget UI. - domNode: null, + 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); + } + } + }); +}); - // 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 dojoType=myWidget> - // | <b> here's a plain DOM node - // | <span dojoType=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 dojoType=subWidget>and a widget</span> - // | <i> and another plain DOM node </i> - // - // In templated widgets, "containerNode" is set via a - // dojoAttachPoint 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, +}, +'dijit/_MenuBase':function(){ +define("dijit/_MenuBase", [ + "./popup", + "dojo/window", + "./_Widget", + "./_KeyNavContainer", + "./_TemplatedMixin", + "dojo/_base/declare", // declare + "dojo/dom", // dom.isDescendant domClass.replace + "dojo/dom-attr", + "dojo/dom-class", // domClass.replace + "dojo/_base/lang", // lang.hitch + "dojo/_base/array" // array.indexOf +], function(pm, winUtils, _Widget, _KeyNavContainer, _TemplatedMixin, + declare, dom, domAttr, domClass, lang, array){ /*===== - // _started: Boolean - // startup() has completed. - _started: false, + var _Widget = dijit._Widget; + var _TemplatedMixin = dijit._TemplatedMixin; + var _KeyNavContainer = dijit._KeyNavContainer; =====*/ - // attributeMap: [protected] Object - // 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: {id:"", dir:"", lang:"", "class":"", style:"", title:""}, +// module: +// dijit/_MenuBase +// summary: +// Base class for Menu and MenuBar - // _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: (dojo.config.blankGif || dojo.moduleUrl("dojo", "resources/blank.gif")).toString(), +return declare("dijit._MenuBase", + [_Widget, _TemplatedMixin, _KeyNavContainer], +{ + // summary: + // Base class for Menu and MenuBar - //////////// INITIALIZATION METHODS /////////////////////////////////////// + // parentMenu: [readonly] Widget + // pointer to menu that displayed me + parentMenu: null, - postscript: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){ + // popupDelay: Integer + // number of milliseconds before hovering (without clicking) causes the popup to automatically open. + popupDelay: 500, + + onExecute: function(){ // summary: - // Kicks off widget instantiation. See create() for details. + // 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: - // private - this.create(params, srcNodeRef); + // protected }, - create: function(/*Object?*/params, /*DomNode|String?*/srcNodeRef){ + onCancel: function(/*Boolean*/ /*===== closeAll =====*/){ // summary: - // Kick off the life-cycle of a widget - // params: - // Hash of initialization parameters for widget, including - // scalar values (like title, duration etc.) and functions, - // typically callbacks like onClick. - // srcNodeRef: - // 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 - // description: - // Create calls a number of widget methods (postMixInProperties, buildRendering, postCreate, - // etc.), some of which of you'll want to override. See http://docs.dojocampus.org/dijit/_Widget - // 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. + // 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: - // private + // protected + }, - // store pointer to original DOM tree - this.srcNodeRef = dojo.byId(srcNodeRef); + _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 - // For garbage collection. An array of handles returned by Widget.connect() - // Each handle returned from Widget.connect() is an array of handles from dojo.connect() - this._connects = []; + if(this.focusedChild && this.focusedChild.popup && !this.focusedChild.disabled){ + this.focusedChild._onClick(evt); + }else{ + var topMenu = this._getTopMenu(); + if(topMenu && topMenu._isMenuBar){ + topMenu.focusNext(); + } + } + }, - // For garbage collection. An array of handles returned by Widget.subscribe() - // The handle returned from Widget.subscribe() is the handle returned from dojo.subscribe() - this._subscribes = []; + _onPopupHover: function(/*Event*/ /*===== evt =====*/){ + // summary: + // This handler is called when the mouse moves over the popup. + // tags: + // private - // mix in our passed parameters - if(this.srcNodeRef && (typeof this.srcNodeRef.id == "string")){ this.id = this.srcNodeRef.id; } - if(params){ - this.params = params; - dojo._mixin(this, params); + // 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); } - this.postMixInProperties(); + }, - // generate an id for the widget if one wasn't specified - // (be sure to do this before buildRendering() because that function might - // expect the id to be there.) - if(!this.id){ - this.id = dijit.getUniqueId(this.declaredClass.replace(/\./g,"_")); - } - dijit.registry.add(this); - - this.buildRendering(); - - 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(); + onItemHover: function(/*MenuItem*/ item){ + // summary: + // Called when cursor is over a MenuItem. + // tags: + // protected - // 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); + // 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 = setTimeout(lang.hitch(this, "_openPopup"), this.popupDelay); } } - - if(this.domNode){ - // 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. - if(this.srcNodeRef && !this.srcNodeRef.parentNode){ - delete this.srcNodeRef; + // 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._created = true; + this._hoveredChild = item; }, - _applyAttributes: function(){ + _onChildBlur: function(item){ // summary: - // Step during widget creation to copy all widget attributes to the - // DOM as per attributeMap and _setXXXAttr functions. - // description: - // 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. - // - // It processes the attributes in the attribute map first, and then - // it goes through and processes the attributes for the _setXXXAttr - // functions that have been specified + // Called when a child MenuItem becomes inactive because focus + // has been removed from the MenuItem *and* it's descendant menus. // tags: // private - var condAttrApply = function(attr, scope){ - if((scope.params && attr in scope.params) || scope[attr]){ - scope.set(attr, scope[attr]); - } - }; - - // Do the attributes in attributeMap - for(var attr in this.attributeMap){ - condAttrApply(attr, this); - } - - // And also any attributes with custom setters - dojo.forEach(this._getSetterAttributes(), function(a){ - if(!(a in this.attributeMap)){ - condAttrApply(a, this); - } - }, this); - }, - - _getSetterAttributes: function(){ - // summary: - // Returns list of attributes with custom setters for this widget - var ctor = this.constructor; - if(!ctor._setterAttrs){ - var r = (ctor._setterAttrs = []), - attrs, - proto = ctor.prototype; - for(var fxName in proto){ - if(dojo.isFunction(proto[fxName]) && (attrs = fxName.match(/^_set([a-zA-Z]*)Attr$/)) && attrs[1]){ - r.push(attrs[1].charAt(0).toLowerCase() + attrs[1].substr(1)); + 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 = setTimeout(function(){ + itemPopup._pendingClose_timer = null; + if(itemPopup.parentMenu){ + itemPopup.parentMenu.currentPopup = null; } - } + pm.close(itemPopup); // this calls onClose + }, this.popupDelay); } - return ctor._setterAttrs; // String[] }, - postMixInProperties: function(){ + onItemUnhover: function(/*MenuItem*/ item){ // 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. + // Callback fires when mouse exits a MenuItem // tags: // protected + + if(this.isActive){ + this._stopPopupTimer(); + } + if(this._hoveredChild == item){ this._hoveredChild = null; } }, - buildRendering: function(){ + _stopPopupTimer: function(){ // summary: - // Construct the UI for this widget, setting this.domNode - // description: - // Most widgets will mixin `dijit._Templated`, which implements this - // method. + // Cancels the popup timer because the user has stop hovering + // on the MenuItem, etc. // tags: - // protected - - if(!this.domNode){ - // Create root node if it wasn't created by _Templated - this.domNode = this.srcNodeRef || dojo.create('div'); + // private + if(this.hover_timer){ + clearTimeout(this.hover_timer); + this.hover_timer = null; } + }, - // 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( dojo.map(classes, function(name){ return name+"Rtl"; })); - } - dojo.addClass(this.domNode, classes); + _stopPendingCloseTimer: function(/*dijit._Widget*/ popup){ + // summary: + // Cancels the pending-close timer because the close has been preempted + // tags: + // private + if(popup._pendingClose_timer){ + clearTimeout(popup._pendingClose_timer); + popup._pendingClose_timer = null; } }, - postCreate: function(){ + _stopFocusTimer: 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. + // Cancels the pending-focus timer because the menu was closed before focus occured // tags: - // protected + // private + if(this._focus_timer){ + clearTimeout(this._focus_timer); + this._focus_timer = null; + } }, - startup: function(){ + _getTopMenu: 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. - this._started = true; + // Returns the top menu in this chain of Menus + // tags: + // private + for(var top=this; top.parentMenu; top=top.parentMenu); + return top; }, - //////////// DESTROY FUNCTIONS //////////////////////////////// - - destroyRecursive: function(/*Boolean?*/ preserveDom){ + onItemClick: function(/*dijit._Widget*/ item, /*Event*/ evt){ // 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. + // Handle clicks on an item. + // tags: + // private - this._beingDestroyed = true; - this.destroyDescendants(preserveDom); - this.destroy(preserveDom); - }, + // this can't be done in _onFocus since the _onFocus events occurs asynchronously + if(typeof this.isShowingNow == 'undefined'){ // non-popup menu + this._markActive(); + } - 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.focusChild(item); - this._beingDestroyed = true; - this.uninitialize(); - var d = dojo, - dfe = d.forEach, - dun = d.unsubscribe; - dfe(this._connects, function(array){ - dfe(array, d.disconnect); - }); - dfe(this._subscribes, function(handle){ - dun(handle); - }); + if(item.disabled){ return false; } - // destroy widgets created as part of template, etc. - dfe(this._supportingWidgets || [], function(w){ - if(w.destroyRecursive){ - w.destroyRecursive(); - }else if(w.destroy){ - w.destroy(); - } - }); + if(item.popup){ + this._openPopup(); + }else{ + // before calling user defined handler, close hierarchy of menus + // and restore focus to place it was when menu was opened + this.onExecute(); - this.destroyRendering(preserveDom); - dijit.registry.remove(this.id); - this._destroyed = true; + // user defined handler for click + item.onClick(evt); + } }, - destroyRendering: function(/*Boolean?*/ preserveDom){ + _openPopup: function(){ // 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. + // Open the popup to the side of/underneath the current menu item // tags: // protected - if(this.bgIframe){ - this.bgIframe.destroy(preserveDom); - delete this.bgIframe; + 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){ return; } + 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") + }); - if(this.domNode){ - if(preserveDom){ - dojo.removeAttr(this.domNode, "widgetId"); - }else{ - dojo.destroy(this.domNode); - } - delete this.domNode; - } + 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(this.srcNodeRef){ - if(!preserveDom){ - dojo.destroy(this.srcNodeRef); - } - delete this.srcNodeRef; + if(popup.focus){ + // If user is opening the popup via keyboard (right arrow, or down arrow for MenuBar), + // if the cursor happens to collide with the popup, it will generate an onmouseover event + // even though the mouse wasn't moved. Use a setTimeout() to call popup.focus so that + // our focus() call overrides the onmouseover event, rather than vice-versa. (#8742) + popup._focus_timer = setTimeout(lang.hitch(popup, function(){ + this._focus_timer = null; + this.focus(); + }), 0); } }, - destroyDescendants: function(/*Boolean?*/ preserveDom){ + _markActive: function(){ // 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 - dojo.forEach(this.getChildren(), function(widget){ - if(widget.destroyRecursive){ - widget.destroyRecursive(preserveDom); - } - }); + // 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"); }, - uninitialize: function(){ + onOpen: function(/*Event*/ /*===== e =====*/){ // summary: - // Stub function. Override to implement custom widget tear-down - // behavior. + // Callback when this menu is opened. + // This is called by the popup manager as notification that the menu + // was opened. // tags: - // protected - return false; + // private + + this.isShowingNow = true; + this._markActive(); }, - ////////////////// GET/SET, CUSTOM SETTERS, ETC. /////////////////// + _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"); + }, - _setClassAttr: function(/*String*/ value){ + onClose: function(){ // summary: - // Custom setter for the CSS "class" attribute + // Callback when this menu is closed. + // This is called by the popup manager as notification that the menu + // was closed. // tags: - // protected - var mapNode = this[this.attributeMap["class"] || 'domNode']; - dojo.replaceClass(mapNode, value, this["class"]); - this._set("class", value); + // private + + this._stopFocusTimer(); + this._markInactive(); + this.isShowingNow = false; + this.parentMenu = null; }, - _setStyleAttr: function(/*String||Object*/ value){ + _closeChild: function(){ // 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. + // Called when submenu is clicked or focus is lost. Close hierarchy of menus. // tags: - // protected + // private + this._stopPopupTimer(); - var mapNode = this[this.attributeMap.style || 'domNode']; + 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; + } - // 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(this.focusedChild){ // unhighlight the focused item + this.focusedChild._setSelected(false); + this.focusedChild._onUnhover(); + this.focusedChild = null; + } + }, - if(dojo.isObject(value)){ - dojo.style(mapNode, value); - }else{ - if(mapNode.style.cssText){ - mapNode.style.cssText += "; " + value; - }else{ - mapNode.style.cssText = value; - } + _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._hoveredChild._onUnhover(); // any previous mouse movement is trumped by focus selection } + }, - this._set("style", value); + _onBlur: function(){ + // summary: + // Called when focus is moved away from this Menu and it's submenus. + // tags: + // protected + this._cleanUp(); + this.inherited(arguments); }, - _attrToDom: function(/*String*/ attr, /*String*/ value){ + _cleanUp: function(){ // summary: - // Reflect a widget attribute (title, tabIndex, duration etc.) to - // the widget DOM, as specified in attributeMap. - // Note some attributes like "type" - // cannot be processed this way as they are not mutable. - // + // Called when the user is done with this menu. Closes hierarchy of menus. // tags: // private - var commands = this.attributeMap[attr]; - dojo.forEach(dojo.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(dojo.isFunction(value)){ // functions execute in the context of the widget - value = dojo.hitch(this, value); - } + 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(); + } + } +}); - // 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); +}); - dojo.attr(mapNode, attrName, value); - break; - case "innerText": - mapNode.innerHTML = ""; - mapNode.appendChild(dojo.doc.createTextNode(value)); - break; - case "innerHTML": - mapNode.innerHTML = value; - break; - case "class": - dojo.replaceClass(mapNode, value, this[attr]); - break; - } - }, this); - }, +}, +'dijit/focus':function(){ +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/_base/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 + "." // 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 + // summary: + // Returns a singleton that tracks the currently focused node, and which widgets are currently "active". - 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 a properties "foo" - // and "bar" and a method named "_getFooAttr", calling: - // | myWidget.get("foo"); - // would be equivalent to writing: - // | widget._getFooAttr(); - // and: - // | myWidget.get("bar"); - // would be equivalent to writing: - // | widget.bar; - var names = this._getAttrNames(name); - return this[names.g] ? this[names.g]() : this[name]; - }, - - set: function(name, value){ +/*===== + dijit.focus = { // 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 a properties "foo" - // and "bar" and a method named "_setFooAttr", calling: - // | myWidget.set("foo", "Howdy!"); - // would be equivalent to writing: - // | widget._setFooAttr("Howdy!"); - // and: - // | myWidget.set("bar", 3); - // would be equivalent to writing: - // | widget.bar = 3; + // Tracks the currently focused node, and which widgets are currently "active". + // Access via require(["dijit/focus"], function(focus){ ... }). // - // 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) + // 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. - 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{ - // if param is specified as DOM node attribute, copy it - if(name in this.attributeMap){ - this._attrToDom(name, value); - } - 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 + // curNode: DomNode + // Currently focused item on screen + curNode: null, - var apn = this._attrPairNames; - if(apn[name]){ return apn[name]; } - var uc = name.charAt(0).toUpperCase() + name.substr(1); - return (apn[name] = { - n: name+"Node", - s: "_set"+uc+"Attr", - g: "_get"+uc+"Attr" - }); - }, + // activeStack: dijit._Widget[] + // List of currently active widgets (focused widget and it's ancestors) + activeStack: [], - _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._watchCallbacks && this._created && value !== oldValue){ - this._watchCallbacks(name, oldValue, value); + registerIframe: function(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. + }, + + registerWin: function(targetWindow, 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: Window? + // If specified this is the window associated with the iframe, + // i.e. iframe.contentWindow. + // effectiveNode: DOMNode? + // 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. } - }, + }; +=====*/ - 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 - }, + var FocusManager = declare([Stateful, Evented], { + // curNode: DomNode + // Currently focused item on screen + curNode: null, - 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. + // activeStack: dijit._Widget[] + // List of currently active widgets (focused widget and it's ancestors) + activeStack: [], - return this.containerNode ? dojo.query('[widgetId]', this.containerNode).map(dijit.byNode) : []; // dijit._Widget[] - }, + 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); + }, - 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 ? dijit.findWidgets(this.containerNode) : []; // dijit._Widget[] - }, + 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); + }, - 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 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 dijit.form.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 + 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. - var handles = [dojo._connect(obj, event, this, method)]; - this._connects.push(handles); - return handles; // _Widget.Handle - }, + // TODO: make this function private in 2.0; Editor/users should call registerIframe(), - disconnect: function(/* _Widget.Handle */ handles){ - // summary: - // Disconnects handle created by `connect`. - // Also removes handle from this widget's list of connects. - // tags: - // protected - for(var i=0; i<this._connects.length; i++){ - if(this._connects[i] == handles){ - dojo.forEach(handles, dojo.disconnect); - this._connects.splice(i, 1); + 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. + // IIRC, I'm using attachEvent() rather than dojo.connect() because focus/blur events don't bubble + // through dojo.connect(), and also maybe to catch the focus events early, before onfocus handlers + // fire. + // 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 activateListener = 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('onactivate', activateListener); + var deactivateListener = function(evt){ + _this._onBlurNode(effectiveNode || evt.srcElement); + }; + doc.attachEvent('ondeactivate', deactivateListener); + + return { + remove: function(){ + targetWindow.document.detachEvent('onmousedown', mousedownListener); + doc.detachEvent('onactivate', activateListener); + doc.detachEvent('ondeactivate', deactivateListener); + 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 + this.set("prevNode", this.curNode); + this.set("curNode", null); + + 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; } - } - }, - subscribe: function( - /*String*/ topic, - /*String|Function*/ method){ - // summary: - // Subscribes to the specified topic and calls the specified method - // of this object and registers for unsubscribe() on widget destroy. - // description: - // Provide widget-specific analog to dojo.subscribe, except with the - // implicit use of this widget as the target object. - // example: - // | var btn = new dijit.form.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); - // | }); - var handle = dojo.subscribe(topic, this, method); + // if the blur event isn't followed by a focus 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([]); + this.prevNode = null; + }), 100); + }, - // return handles for Any widget that may need them - this._subscribes.push(handle); - return handle; - }, + _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 - unsubscribe: function(/*Object*/ handle){ - // summary: - // Unsubscribes handle created by this.subscribe. - // Also removes handle from this widget's list of subscriptions - for(var i=0; i<this._subscribes.length; i++){ - if(this._subscribes[i] == handle){ - dojo.unsubscribe(handle); - this._subscribes.splice(i, 1); + // 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; } + + this._onTouchNode(node); + + if(node == this.curNode){ return; } + 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*/} + } } - }, + }); - 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") : dojo._isBodyLtr(); //Boolean - }, + var singleton = new FocusManager(); - placeAt: function(/* String|DomNode|_Widget */reference, /* String?|Int? */position){ - // summary: - // Place this widget's domNode reference somewhere in the DOM based - // on standard dojo.place conventions, or passing a Widget reference that - // contains and addChild member. - // - // 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: - // The String id of a domNode, a domNode reference, or a reference to a Widget posessing - // an addChild method. - // - // position: - // If passed a string or domNode reference, the position argument - // accepts a string just as dojo.place does, one of: "first", "last", - // "before", or "after". - // - // If passed a _Widget reference, and that widget reference has an ".addChild" method, - // it will be called passing this widget instance into that method, supplying the optional - // position index passed. - // - // returns: - // dijit._Widget - // 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 dijit.form.Button({ label:"click" }).placeAt(dojo.body()); - // | // now, 'button' is still the widget reference to the newly created button - // | dojo.connect(button, "onClick", 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 dijit.form.Button({},"src").placeAt("wrapper"); - // - // example: - // | // place a new button as the first element of some div - // | var button = new dijit.form.Button({ label:"click" }).placeAt("wrapper","first"); - // - // example: - // | // create a contentpane and add it to a TabContainer - // | var tc = dijit.byId("myTabs"); - // | new dijit.layout.ContentPane({ href:"foo.html", title:"Wow!" }).placeAt(tc) + // register top window and all the iframes it contains + ready(function(){ + var handle = singleton.registerWin(win.doc.parentWindow || win.doc.defaultView); + if(has("ie")){ + unload.addOnWindowUnload(function(){ + handle.remove(); + handle = null; + }) + } + }); - if(reference.declaredClass && reference.addChild){ - reference.addChild(this, position); - }else{ - dojo.place(this.domNode, reference, position); + // Setup dijit.focus as a pointer to the singleton but also (for backwards compatibility) + // as a function to set focus. + 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]; } - return this; } + singleton.watch(function(attr, oldVal, newVal){ + dijit.focus[attr] = newVal; + }); + + return singleton; }); -})(); +}, +'dojo/i18n':function(){ +define("dojo/i18n", ["./_base/kernel", "require", "./has", "./_base/array", "./_base/config", "./_base/lang", "./_base/xhr", "./json"], + function(dojo, require, has, array, config, lang, xhr, json) { + // module: + // dojo/i18n + // summary: + // This module implements the !dojo/i18n plugin and the v1.6- i18n API + // description: + // We choose to include our own plugin to leverage functionality already contained in dojo + // and thereby reduce the size of the plugin compared to various loader implementations. Also, this + // allows foreign AMD loaders to be used without their plugins. -} -if(!dojo._hasResource["dijit._Widget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._Widget"] = true; -dojo.provide("dijit._Widget"); + has.add("dojo-preload-i18n-Api", + // if true, define the preload localizations machinery + 1 + ); + true || has.add("dojo-v1x-i18n-Api", + // if true, define the v1.x i18n functions + 1 + ); + var + thisModule= dojo.i18n= + // the dojo.i18n module + {}, + + nlsRe= + // regexp for reconstructing the master bundle name from parts of the regexp match + // nlsRe.exec("foo/bar/baz/nls/en-ca/foo") gives: + // ["foo/bar/baz/nls/en-ca/foo", "foo/bar/baz/nls/", "/", "/", "en-ca", "foo"] + // nlsRe.exec("foo/bar/baz/nls/foo") gives: + // ["foo/bar/baz/nls/foo", "foo/bar/baz/nls/", "/", "/", "foo", ""] + // so, if match[5] is blank, it means this is the top bundle definition. + // courtesy of http://requirejs.org + /(^.*(^|\/)nls)(\/|$)([^\/]*)\/?([^\/]*)/, + + getAvailableLocales= function( + root, + locale, + bundlePath, + bundleName + ){ + // return a vector of module ids containing all available locales with respect to the target locale + // For example, assuming: + // * the root bundle indicates specific bundles for "fr" and "fr-ca", + // * bundlePath is "myPackage/nls" + // * bundleName is "myBundle" + // Then a locale argument of "fr-ca" would return + // ["myPackage/nls/myBundle", "myPackage/nls/fr/myBundle", "myPackage/nls/fr-ca/myBundle"] + // Notice that bundles are returned least-specific to most-specific, starting with the root. + // + // If root===false indicates we're working with a pre-AMD i18n bundle that doesn't tell about the available locales; + // therefore, assume everything is available and get 404 errors that indicate a particular localization is not available + // + for(var result= [bundlePath + bundleName], localeParts= locale.split("-"), current= "", i= 0; i<localeParts.length; i++){ + current+= (current ? "-" : "") + localeParts[i]; + if(!root || root[current]){ + result.push(bundlePath + current + "/" + bundleName); + } + } + return result; + }, + cache= {}, -////////////////// DEFERRED CONNECTS /////////////////// + getL10nName= dojo.getL10nName = function(moduleName, bundleName, locale){ + locale = locale ? locale.toLowerCase() : dojo.locale; + moduleName = "dojo/i18n!" + moduleName.replace(/\./g, "/"); + bundleName = bundleName.replace(/\./g, "/"); + return (/root/i.test(locale)) ? + (moduleName + "/nls/" + bundleName) : + (moduleName + "/nls/" + locale + "/" + bundleName); + }, -// This code is to assist deferring dojo.connect() calls in widgets (connecting to events on the widgets' -// DOM nodes) until someone actually needs to monitor that event. -dojo.connect(dojo, "_connect", - function(/*dijit._Widget*/ widget, /*String*/ event){ - if(widget && dojo.isFunction(widget._onConnect)){ - widget._onConnect(event); - } - }); + doLoad = function(require, bundlePathAndName, bundlePath, bundleName, locale, load){ + // get the root bundle which instructs which other bundles are required to construct the localized bundle + require([bundlePathAndName], function(root){ + var current= lang.clone(root.root), + availableLocales= getAvailableLocales(!root._v1x && root, locale, bundlePath, bundleName); + require(availableLocales, function(){ + for (var i= 1; i<availableLocales.length; i++){ + current= lang.mixin(lang.clone(current), arguments[i]); + } + // target may not have been resolve (e.g., maybe only "fr" exists when "fr-ca" was requested) + var target= bundlePathAndName + "/" + locale; + cache[target]= current; + load(); + }); + }); + }, + + normalize = function(id, toAbsMid){ + // id may be relative + // preload has form *preload*<path>/nls/<module>*<flattened locales> and + // therefore never looks like a relative + return /^\./.test(id) ? toAbsMid(id) : id; + }, + + getLocalesToLoad = function(targetLocale){ + var list = config.extraLocale || []; + list = lang.isArray(list) ? list : [list]; + list.push(targetLocale); + return list; + }, + + load = function(id, require, load){ + // + // id is in one of the following formats + // + // 1. <path>/nls/<bundle> + // => load the bundle, localized to config.locale; load all bundles localized to + // config.extraLocale (if any); return the loaded bundle localized to config.locale. + // + // 2. <path>/nls/<locale>/<bundle> + // => load then return the bundle localized to <locale> + // + // 3. *preload*<path>/nls/<module>*<JSON array of available locales> + // => for config.locale and all config.extraLocale, load all bundles found + // in the best-matching bundle rollup. A value of 1 is returned, which + // is meaningless other than to say the plugin is executing the requested + // preloads + // + // In cases 1 and 2, <path> is always normalized to an absolute module id upon entry; see + // normalize. In case 3, it <path> is assumed to be absolue; this is arranged by the builder. + // + // To load a bundle means to insert the bundle into the plugin's cache and publish the bundle + // value to the loader. Given <path>, <bundle>, and a particular <locale>, the cache key + // + // <path>/nls/<bundle>/<locale> + // + // will hold the value. Similarly, then plugin will publish this value to the loader by + // + // define("<path>/nls/<bundle>/<locale>", <bundle-value>); + // + // Given this algorithm, other machinery can provide fast load paths be preplacing + // values in the plugin's cache, which is public. When a load is demanded the + // cache is inspected before starting any loading. Explicitly placing values in the plugin + // cache is an advanced/experimental feature that should not be needed; use at your own risk. + // + // For the normal AMD algorithm, the root bundle is loaded first, which instructs the + // plugin what additional localized bundles are required for a particular locale. These + // additional locales are loaded and a mix of the root and each progressively-specific + // locale is returned. For example: + // + // 1. The client demands "dojo/i18n!some/path/nls/someBundle + // + // 2. The loader demands load(some/path/nls/someBundle) + // + // 3. This plugin require's "some/path/nls/someBundle", which is the root bundle. + // + // 4. Assuming config.locale is "ab-cd-ef" and the root bundle indicates that localizations + // are available for "ab" and "ab-cd-ef" (note the missing "ab-cd", then the plugin + // requires "some/path/nls/ab/someBundle" and "some/path/nls/ab-cd-ef/someBundle" + // + // 5. Upon receiving all required bundles, the plugin constructs the value of the bundle + // ab-cd-ef as... + // + // mixin(mixin(mixin({}, require("some/path/nls/someBundle"), + // require("some/path/nls/ab/someBundle")), + // require("some/path/nls/ab-cd-ef/someBundle")); + // + // This value is inserted into the cache and published to the loader at the + // key/module-id some/path/nls/someBundle/ab-cd-ef. + // + // The special preload signature (case 3) instructs the plugin to stop servicing all normal requests + // (further preload requests will be serviced) until all ongoing preloading has completed. + // + // The preload signature instructs the plugin that a special rollup module is available that contains + // one or more flattened, localized bundles. The JSON array of available locales indicates which locales + // are available. Here is an example: + // + // *preload*some/path/nls/someModule*["root", "ab", "ab-cd-ef"] + // + // This indicates the following rollup modules are available: + // + // some/path/nls/someModule_ROOT + // some/path/nls/someModule_ab + // some/path/nls/someModule_ab-cd-ef + // + // Each of these modules is a normal AMD module that contains one or more flattened bundles in a hash. + // For example, assume someModule contained the bundles some/bundle/path/someBundle and + // some/bundle/path/someOtherBundle, then some/path/nls/someModule_ab would be expressed as folllows: + // + // define({ + // some/bundle/path/someBundle:<value of someBundle, flattened with respect to locale ab>, + // some/bundle/path/someOtherBundle:<value of someOtherBundle, flattened with respect to locale ab>, + // }); + // + // E.g., given this design, preloading for locale=="ab" can execute the following algorithm: + // + // require(["some/path/nls/someModule_ab"], function(rollup){ + // for(var p in rollup){ + // var id = p + "/ab", + // cache[id] = rollup[p]; + // define(id, rollup[p]); + // } + // }); + // + // Similarly, if "ab-cd" is requested, the algorithm can determine that "ab" is the best available and + // load accordingly. + // + // The builder will write such rollups for every layer if a non-empty localeList profile property is + // provided. Further, the builder will include the following cache entry in the cache associated with + // any layer. + // + // "*now":function(r){r(['dojo/i18n!*preload*<path>/nls/<module>*<JSON array of available locales>']);} + // + // The *now special cache module instructs the loader to apply the provided function to context-require + // with respect to the particular layer being defined. This causes the plugin to hold all normal service + // requests until all preloading is complete. + // + // Notice that this algorithm is rarely better than the standard AMD load algorithm. Consider the normal case + // where the target locale has a single segment and a layer depends on a single bundle: + // + // Without Preloads: + // + // 1. Layer loads root bundle. + // 2. bundle is demanded; plugin loads single localized bundle. + // + // With Preloads: + // + // 1. Layer causes preloading of target bundle. + // 2. bundle is demanded; service is delayed until preloading complete; bundle is returned. + // + // In each case a single transaction is required to load the target bundle. In cases where multiple bundles + // are required and/or the locale has multiple segments, preloads still requires a single transaction whereas + // the normal path requires an additional transaction for each additional bundle/locale-segment. However all + // of these additional transactions can be done concurrently. Owing to this analysis, the entire preloading + // algorithm can be discard during a build by setting the has feature dojo-preload-i18n-Api to false. + // + if(has("dojo-preload-i18n-Api")){ + var split = id.split("*"), + preloadDemand = split[1]=="preload"; + if(preloadDemand){ + if(!cache[id]){ + // use cache[id] to prevent multiple preloads of the same preload; this shouldn't happen, but + // who knows what over-aggressive human optimizers may attempt + cache[id] = 1; + preloadL10n(split[2], json.parse(split[3]), 1); + } + // don't stall the loader! + load(1); + } + if(preloadDemand || waitForPreloads(id, require, load)){ + return; + } + } -dijit._connectOnUseEventHandler = function(/*Event*/ event){}; - -////////////////// ONDIJITCLICK SUPPORT /////////////////// - -// 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 -dijit._lastKeyDownNode = null; -if(dojo.isIE){ - (function(){ - var keydownCallback = function(evt){ - dijit._lastKeyDownNode = evt.srcElement; + var match= nlsRe.exec(id), + bundlePath= match[1] + "/", + bundleName= match[5] || match[4], + bundlePathAndName= bundlePath + bundleName, + localeSpecified = (match[5] && match[4]), + targetLocale= localeSpecified || dojo.locale, + loadTarget= bundlePathAndName + "/" + targetLocale, + loadList = localeSpecified ? [targetLocale] : getLocalesToLoad(targetLocale), + remaining = loadList.length, + finish = function(){ + if(!--remaining){ + load(lang.delegate(cache[loadTarget])); + } + }; + array.forEach(loadList, function(locale){ + var target = bundlePathAndName + "/" + locale; + if(has("dojo-preload-i18n-Api")){ + checkForLegacyModules(target); + } + if(!cache[target]){ + doLoad(require, bundlePathAndName, bundlePath, bundleName, locale, finish); + }else{ + finish(); + } + }); }; - dojo.doc.attachEvent('onkeydown', keydownCallback); - dojo.addOnWindowUnload(function(){ - dojo.doc.detachEvent('onkeydown', keydownCallback); - }); - })(); -}else{ - dojo.doc.addEventListener('keydown', function(evt){ - dijit._lastKeyDownNode = evt.target; - }, true); -} -(function(){ + if(has("dojo-unit-tests")){ + var unitTests = thisModule.unitTests = []; + } -dojo.declare("dijit._Widget", dijit._WidgetBase, { - // summary: - // Base class for all Dijit widgets. - // - // Extends _WidgetBase, adding support for: - // - deferred connections - // A call like dojo.connect(myWidget, "onMouseMove", func) - // will essentially do a dojo.connect(myWidget.domNode, "onMouseMove", func) - // - ondijitclick - // Support new dojoAttachEvent="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 id like .dj_ie on <html> node) - // - high contrast mode sniffing (add .dijit_a11y class to <body> if machine is in high contrast mode) - + if(has("dojo-preload-i18n-Api") || 1){ + var normalizeLocale = thisModule.normalizeLocale= function(locale){ + var result = locale ? locale.toLowerCase() : dojo.locale; + return result == "root" ? "ROOT" : result; + }, - ////////////////// DEFERRED CONNECTS /////////////////// + isXd = function(mid){ + return (1 && 1) ? + require.isXdUrl(require.toUrl(mid + ".js")) : + true; + }, - // _deferredConnects: [protected] Object - // attributeMap addendum for event handlers that should be connected only on first use - _deferredConnects: { - onClick: "", - onDblClick: "", - onKeyDown: "", - onKeyPress: "", - onKeyUp: "", - onMouseMove: "", - onMouseDown: "", - onMouseOut: "", - onMouseOver: "", - onMouseLeave: "", - onMouseEnter: "", - onMouseUp: "" - }, - - onClick: dijit._connectOnUseEventHandler, - /*===== - onClick: function(event){ - // summary: - // Connect to this function to receive notifications of mouse click events. - // event: - // mouse Event - // tags: - // callback - }, - =====*/ - onDblClick: dijit._connectOnUseEventHandler, - /*===== - onDblClick: function(event){ - // summary: - // Connect to this function to receive notifications of mouse double click events. - // event: - // mouse Event - // tags: - // callback - }, - =====*/ - onKeyDown: dijit._connectOnUseEventHandler, - /*===== - onKeyDown: function(event){ - // summary: - // Connect to this function to receive notifications of keys being pressed down. - // event: - // key Event - // tags: - // callback - }, - =====*/ - onKeyPress: dijit._connectOnUseEventHandler, - /*===== - onKeyPress: function(event){ - // summary: - // Connect to this function to receive notifications of printable keys being typed. - // event: - // key Event - // tags: - // callback - }, - =====*/ - onKeyUp: dijit._connectOnUseEventHandler, - /*===== - onKeyUp: function(event){ - // summary: - // Connect to this function to receive notifications of keys being released. - // event: - // key Event - // tags: - // callback - }, - =====*/ - onMouseDown: dijit._connectOnUseEventHandler, - /*===== - 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: dijit._connectOnUseEventHandler, - /*===== - 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: dijit._connectOnUseEventHandler, - /*===== - 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: dijit._connectOnUseEventHandler, - /*===== - 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: dijit._connectOnUseEventHandler, - /*===== - 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: dijit._connectOnUseEventHandler, - /*===== - 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: dijit._connectOnUseEventHandler, - /*===== - onMouseUp: function(event){ - // summary: - // Connect to this function to receive notifications of when the mouse button is released. - // event: - // mouse Event - // tags: - // callback - }, - =====*/ + preloading = 0, - create: function(/*Object?*/params, /*DomNode|String?*/srcNodeRef){ - // To avoid double-connects, remove entries from _deferredConnects - // that have been setup manually by a subclass (ex, by dojoAttachEvent). - // If a subclass has redefined a callback (ex: onClick) then assume it's being - // connected to manually. - this._deferredConnects = dojo.clone(this._deferredConnects); - for(var attr in this.attributeMap){ - delete this._deferredConnects[attr]; // can't be in both attributeMap and _deferredConnects - } - for(attr in this._deferredConnects){ - if(this[attr] !== dijit._connectOnUseEventHandler){ - delete this._deferredConnects[attr]; // redefined, probably dojoAttachEvent exists - } - } + preloadWaitQueue = [], - this.inherited(arguments); + preloadL10n = thisModule._preloadLocalizations = function(/*String*/bundlePrefix, /*Array*/localesGenerated, /*boolean*/ guaranteedAmdFormat){ + // summary: + // Load available flattened resource bundles associated with a particular module for dojo.locale and all dojo.config.extraLocale (if any) + // + // descirption: + // Only called by built layer files. The entire locale hierarchy is loaded. For example, + // if locale=="ab-cd", then ROOT, "ab", and "ab-cd" are loaded. This is different than v1.6- + // in that the v1.6- would lonly load ab-cd...which was *always* flattened. + // + // If guaranteedAmdFormat is true, then the module can be loaded with require thereby circumventing the detection algorithm + // and the extra possible extra transaction. + // + + function forEachLocale(locale, func){ + // given locale= "ab-cd-ef", calls func on "ab-cd-ef", "ab-cd", "ab", "ROOT"; stops calling the first time func returns truthy + var parts = locale.split("-"); + while(parts.length){ + if(func(parts.join("-"))){ + return true; + } + parts.pop(); + } + return func("ROOT"); + } - if(this.domNode){ - // If the developer has specified a handler as a widget parameter - // (ex: new Button({onClick: ...}) - // then naturally need to connect from DOM node to that handler immediately, - for(attr in this.params){ - this._onConnect(attr); - } - } - }, + function preload(locale){ + locale = normalizeLocale(locale); + forEachLocale(locale, function(loc){ + if(array.indexOf(localesGenerated, loc)>=0){ + var mid = bundlePrefix.replace(/\./g, "/")+"_"+loc; + preloading++; + (isXd(mid) || guaranteedAmdFormat ? require : syncRequire)([mid], function(rollup){ + for(var p in rollup){ + cache[p + "/" + locale] = rollup[p]; + } + --preloading; + while(!preloading && preloadWaitQueue.length){ + load.apply(null, preloadWaitQueue.shift()); + } + }); + return true; + } + return false; + }); + } - _onConnect: function(/*String*/ event){ - // summary: - // Called when someone connects to one of my handlers. - // "Turn on" that handler if it isn't active yet. - // - // This is also called for every single initialization parameter - // so need to do nothing for parameters like "id". - // tags: - // private - if(event in this._deferredConnects){ - var mapNode = this[this._deferredConnects[event] || 'domNode']; - this.connect(mapNode, event.toLowerCase(), event); - delete this._deferredConnects[event]; - } - }, + preload(); + array.forEach(dojo.config.extraLocale, preload); + }, - ////////////////// FOCUS RELATED /////////////////// - // _onFocus() and _onBlur() are called by the focus manager + waitForPreloads = function(id, require, load){ + if(preloading){ + preloadWaitQueue.push([id, require, load]); + } + return preloading; + }; + } - // focused: [readonly] Boolean - // This widget or a widget it contains has focus, or is "active" because - // it was recently clicked. - focused: false, + if(1){ + // this code path assumes the dojo loader and won't work with a standard AMD loader + var evalBundle= + // use the function ctor to keep the minifiers away (also come close to global scope, but this is secondary) + new Function( + "__bundle", // the bundle to evalutate + "__checkForLegacyModules", // a function that checks if __bundle defined __mid in the global space + "__mid", // the mid that __bundle is intended to define + + // returns one of: + // 1 => the bundle was an AMD bundle + // a legacy bundle object that is the value of __mid + // instance of Error => could not figure out how to evaluate bundle + + // used to detect when __bundle calls define + "var define = function(){define.called = 1;}," + + " require = function(){define.called = 1;};" + + + "try{" + + "define.called = 0;" + + "eval(__bundle);" + + "if(define.called==1)" + // bundle called define; therefore signal it's an AMD bundle + + "return 1;" + + + "if((__checkForLegacyModules = __checkForLegacyModules(__mid)))" + // bundle was probably a v1.6- built NLS flattened NLS bundle that defined __mid in the global space + + "return __checkForLegacyModules;" + + + "}catch(e){}" + // evaulating the bundle was *neither* an AMD *nor* a legacy flattened bundle + // either way, re-eval *after* surrounding with parentheses + + + "try{" + + "return eval('('+__bundle+')');" + + "}catch(e){" + + "return e;" + + "}" + ), + + syncRequire= function(deps, callback){ + var results= []; + array.forEach(deps, function(mid){ + var url= require.toUrl(mid + ".js"); + + function load(text){ + var result = evalBundle(text, checkForLegacyModules, mid); + if(result===1){ + // the bundle was an AMD module; re-inject it through the normal AMD path + // we gotta do this since it could be an anonymous module and simply evaluating + // the text here won't provide the loader with the context to know what + // module is being defined()'d. With browser caching, this should be free; further + // this entire code path can be circumvented by using the AMD format to begin with + require([mid], function(bundle){ + results.push(cache[url]= bundle); + }); + }else{ + if(result instanceof Error){ + console.error("failed to evaluate i18n bundle; url=" + url, result); + result = {}; + } + // nls/<locale>/<bundle-name> indicates not the root. + results.push(cache[url] = (/nls\/[^\/]+\/[^\/]+$/.test(url) ? result : {root:result, _v1x:1})); + } + } - isFocusable: function(){ - // summary: - // Return true if this widget can currently be focused - // and false if not - return this.focus && (dojo.style(this.domNode, "display") != "none"); - }, + if(cache[url]){ + results.push(cache[url]); + }else{ + var bundle= require.syncLoadNls(mid); + // don't need to check for legacy since syncLoadNls returns a module if the module + // (1) was already loaded, or (2) was in the cache. In case 1, if syncRequire is called + // from getLocalization --> load, then load will have called checkForLegacyModules() before + // calling syncRequire; if syncRequire is called from preloadLocalizations, then we + // don't care about checkForLegacyModules() because that will be done when a particular + // bundle is actually demanded. In case 2, checkForLegacyModules() is never relevant + // because cached modules are always v1.7+ built modules. + if(bundle){ + results.push(bundle); + }else{ + if(!xhr){ + try{ + require.getText(url, true, load); + }catch(e){ + results.push(cache[url]= {}); + } + }else{ + xhr.get({ + url:url, + sync:true, + load:load, + error:function(){ + results.push(cache[url]= {}); + } + }); + } + } + } + }); + callback && callback.apply(null, results); + }, - 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 - }, + checkForLegacyModules = function(target){ + // legacy code may have already loaded [e.g] the raw bundle x/y/z at x.y.z; when true, push into the cache + for(var result, names = target.split("/"), object = dojo.global[names[0]], i = 1; object && i<names.length-1; object = object[names[i++]]){} + if(object){ + result = object[names[i]]; + if(!result){ + // fallback for incorrect bundle build of 1.6 + result = object[names[i].replace(/-/g,"_")]; + } + if(result){ + cache[target] = result; + } + } + return result; + }; - 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 - }, + thisModule.getLocalization= function(moduleName, bundleName, locale){ + var result, + l10nName= getL10nName(moduleName, bundleName, locale).substring(10); + load(l10nName, (!isXd(l10nName) ? syncRequire : require), function(result_){ result= result_; }); + return result; + }; - _onFocus: function(e){ - // 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(); - }, + if(has("dojo-unit-tests")){ + unitTests.push(function(doh){ + doh.register("tests.i18n.unit", function(t){ + var check; - _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(); - }, + check = evalBundle("{prop:1}"); + t.is({prop:1}, check); t.is(undefined, check[1]); - ////////////////// DEPRECATED METHODS /////////////////// + check = evalBundle("({prop:1})"); + t.is({prop:1}, check); t.is(undefined, check[1]); - setAttribute: function(/*String*/ attr, /*anything*/ value){ - // summary: - // Deprecated. Use set() instead. - // tags: - // deprecated - dojo.deprecated(this.declaredClass+"::setAttribute(attr, value) is deprecated. Use set() instead.", "", "2.0"); - this.set(attr, value); - }, + check = evalBundle("{'prop-x':1}"); + t.is({'prop-x':1}, check); t.is(undefined, check[1]); - 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. + check = evalBundle("({'prop-x':1})"); + t.is({'prop-x':1}, check); t.is(undefined, check[1]); - // Print deprecation warning but only once per calling function - if(dojo.config.isDebug){ - var alreadyCalledHash = arguments.callee._ach || (arguments.callee._ach = {}), - caller = (arguments.callee.caller || "unknown caller").toString(); - if(!alreadyCalledHash[caller]){ - dojo.deprecated(this.declaredClass + "::attr() is deprecated. Use get() or set() instead, called from " + - caller, "", "2.0"); - alreadyCalledHash[caller] = true; - } - } + check = evalBundle("define({'prop-x':1})"); + t.is(1, check); - var args = arguments.length; - if(args >= 2 || typeof name === "object"){ // setter - return this.set.apply(this, arguments); - }else{ // getter - return this.get(name); + check = evalBundle("this is total nonsense and should throw an error"); + t.is(check instanceof Error, true); + }); + }); } - }, - - ////////////////// ONDIJITCLICK SUPPORT /////////////////// + } - // nodesWithKeyClick: [private] String[] - // List of nodes that correctly handle click events via native browser support, - // and don't need dijit's help - nodesWithKeyClick: ["input", "button"], + return lang.mixin(thisModule, { + dynamic:true, + normalize:normalize, + load:load, + cache:cache + }); +}); - 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 dojo.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 dijit.form.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 +}, +'dijit/hccss':function(){ +define("dijit/hccss", [ + "require", // require.toUrl + "dojo/_base/config", // config.blankGif + "dojo/dom-class", // domClass.add domConstruct.create domStyle.getComputedStyle + "dojo/dom-construct", // domClass.add domConstruct.create domStyle.getComputedStyle + "dojo/dom-style", // domClass.add domConstruct.create domStyle.getComputedStyle + "dojo/ready", // ready + "dojo/_base/sniff", // has("ie") has("mozilla") + "dojo/_base/window" // win.body +], function(require, config, domClass, domConstruct, domStyle, ready, has, win){ + + // module: + // dijit/hccss + // summary: + // Test if computer is in high contrast mode, and sets dijit_a11y flag on <body> if it is. - var d = dojo, - dc = d._connect, - handles = this.inherited(arguments, [obj, event == "ondijitclick" ? "onclick" : event, method]); - - if(event == "ondijitclick"){ - // add key based click activation for unsupported nodes. - // do all processing onkey up to prevent spurious clicks - // for details see comments at top of this file where _lastKeyDownNode is defined - if(d.indexOf(this.nodesWithKeyClick, obj.nodeName.toLowerCase()) == -1){ // is NOT input or button - var m = d.hitch(this, method); - handles.push( - dc(obj, "onkeydown", this, function(e){ - //console.log(this.id + ": onkeydown, e.target = ", e.target, ", lastKeyDownNode was ", dijit._lastKeyDownNode, ", equality is ", (e.target === dijit._lastKeyDownNode)); - if((e.keyCode == d.keys.ENTER || e.keyCode == d.keys.SPACE) && - !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){ - // needed on IE for when focus changes between keydown and keyup - otherwise dropdown menus do not work - dijit._lastKeyDownNode = e.target; - - // Stop event to prevent scrolling on space key in IE. - // But don't do this for _HasDropDown because it surpresses the onkeypress - // event needed to open the drop down when the user presses the SPACE key. - if(!("openDropDown" in this && obj == this._buttonNode)){ - e.preventDefault(); - } - } - }), - dc(obj, "onkeyup", this, function(e){ - //console.log(this.id + ": onkeyup, e.target = ", e.target, ", lastKeyDownNode was ", dijit._lastKeyDownNode, ", equality is ", (e.target === dijit._lastKeyDownNode)); - if( (e.keyCode == d.keys.ENTER || e.keyCode == d.keys.SPACE) && - e.target == dijit._lastKeyDownNode && // === breaks greasemonkey - !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey){ - //need reset here or have problems in FF when focus returns to trigger element after closing popup/alert - dijit._lastKeyDownNode = null; - return m(e); - } - }) - ); + if(has("ie") || has("mozilla")){ // NOTE: checking in Safari messes things up + // priority is 90 to run ahead of parser priority of 100 + ready(90, function(){ + // summary: + // Detects if we are in high-contrast mode or not + + // create div for testing if high contrast mode is on or images are turned off + var div = domConstruct.create("div",{ + id: "a11yTestNode", + style:{ + cssText:'border: 1px solid;' + + 'border-color:red green;' + + 'position: absolute;' + + 'height: 5px;' + + 'top: -999px;' + + 'background-image: url("' + (config.blankGif || require.toUrl("dojo/resources/blank.gif")) + '");' + } + }, win.body()); + + // test it + var cs = domStyle.getComputedStyle(div); + if(cs){ + var bkImg = cs.backgroundImage; + var needsA11y = (cs.borderTopColor == cs.borderRightColor) || (bkImg != null && (bkImg == "none" || bkImg == "url(invalid-url:)" )); + if(needsA11y){ + domClass.add(win.body(), "dijit_a11y"); + } + if(has("ie")){ + div.outerHTML = ""; // prevent mixed-content warning, see http://support.microsoft.com/kb/925014 + }else{ + win.body().removeChild(div); + } } - } + }); + } +}); - return handles; // _Widget.Handle - }, +}, +'dijit/tree/ForestStoreModel':function(){ +define("dijit/tree/ForestStoreModel", [ + "dojo/_base/array", // array.indexOf array.some + "dojo/_base/declare", // declare + "dojo/_base/lang", // lang.hitch + "dojo/_base/window", // win.global + "./TreeStoreModel" +], function(array, declare, lang, win, TreeStoreModel){ - ////////////////// MISCELLANEOUS METHODS /////////////////// +/*===== +var TreeStoreModel = dijit.tree.TreeStoreModel; +=====*/ - _onShow: function(){ - // summary: - // Internal method called when this widget is made visible. - // See `onShow` for details. - this.onShow(); - }, +// module: +// dijit/tree/ForestStoreModel +// 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. - onShow: function(){ +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: - // 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`. + // Sets up variables, etc. // tags: - // callback - }, + // private - 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 + // Make dummy root item + this.root = { + store: this, + root: true, + id: params.rootId, + label: params.rootLabel, + children: params.rootChildren // optional param + }; }, - onClose: function(){ + // ======================================================================= + // Methods for traversing hierarchy + + mayHaveChildren: function(/*dojo.data.Item*/ item){ // 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. + // 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); + }, - return true; // Boolean - } -}); + 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?keywordArgs.scope:win.global; + if(keywordArgs.onItem){ + keywordArgs.onItem.call(scope, this.root); + } + }else{ + this.inherited(arguments); + } + }, -if(!dojo._hasResource["dojo.string"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.string"] = true; -dojo.provide("dojo.string"); + getIdentity: function(/* item */ item){ + return (item === this.root) ? this.root.id : this.inherited(arguments); + }, -dojo.getObject("string", true, dojo); + getLabel: function(/* item */ item){ + return (item === this.root) ? this.root.label : this.inherited(arguments); + }, -/*===== -dojo.string = { - // summary: String utilities for Dojo -}; -=====*/ + // ======================================================================= + // Write interface -dojo.string.rep = function(/*String*/str, /*Integer*/num){ - // summary: - // Efficiently replicate a string `n` times. - // str: - // the string to replicate - // num: - // number of times to replicate the string - - if(num <= 0 || !str){ return ""; } - - var buf = []; - for(;;){ - if(num & 1){ - buf.push(str); + newItem: function(/* dojo.dnd.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); } - if(!(num >>= 1)){ break; } - str += str; - } - return buf.join(""); // String -}; + }, -dojo.string.pad = function(/*String*/text, /*Integer*/size, /*String?*/ch, /*Boolean?*/end){ - // summary: - // Pad a string to guarantee that it is at least `size` length by - // filling with the character `ch` at either the start or end of the - // string. Pads at the start, by default. - // text: - // the string to pad - // size: - // length to provide padding - // ch: - // character to pad, defaults to '0' - // end: - // adds padding at the end if true, otherwise pads at start - // example: - // | // Fill the string to length 10 with "+" characters on the right. Yields "Dojo++++++". - // | dojo.string.pad("Dojo", 10, "+", true); + onNewRootItem: function(/* dojo.dnd.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 + }, - if(!ch){ - ch = '0'; - } - var out = String(text), - pad = dojo.string.rep(ch, Math.ceil((size - out.length) / ch.length)); - return end ? out + pad : pad + out; // String -}; + 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); + } + }, -dojo.string.substitute = function( /*String*/ template, - /*Object|Array*/map, - /*Function?*/ transform, - /*Object?*/ thisObject){ - // summary: - // Performs parameterized substitutions on a string. Throws an - // exception if any parameter is unmatched. - // template: - // a string with expressions in the form `${key}` to be replaced or - // `${key:format}` which specifies a format function. keys are case-sensitive. - // map: - // hash to search for substitutions - // transform: - // a function to process all parameters before substitution takes - // place, e.g. mylib.encodeXML - // thisObject: - // where to look for optional format function; default to the global - // namespace - // example: - // Substitutes two expressions in a string from an Array or Object - // | // returns "File 'foo.html' is not found in directory '/temp'." - // | // by providing substitution data in an Array - // | dojo.string.substitute( - // | "File '${0}' is not found in directory '${1}'.", - // | ["foo.html","/temp"] - // | ); - // | - // | // also returns "File 'foo.html' is not found in directory '/temp'." - // | // but provides substitution data in an Object structure. Dotted - // | // notation may be used to traverse the structure. - // | dojo.string.substitute( - // | "File '${name}' is not found in directory '${info.dir}'.", - // | { name: "foo.html", info: { dir: "/temp" } } - // | ); - // example: - // Use a transform function to modify the values: - // | // returns "file 'foo.html' is not found in directory '/temp'." - // | dojo.string.substitute( - // | "${0} is not found in ${1}.", - // | ["foo.html","/temp"], - // | function(str){ - // | // try to figure out the type - // | var prefix = (str.charAt(0) == "/") ? "directory": "file"; - // | return prefix + " '" + str + "'"; - // | } - // | ); - // example: - // Use a formatter - // | // returns "thinger -- howdy" - // | dojo.string.substitute( - // | "${0:postfix}", ["thinger"], null, { - // | postfix: function(value, key){ - // | return value + " -- howdy"; - // | } - // | } - // | ); - - thisObject = thisObject || dojo.global; - transform = transform ? - dojo.hitch(thisObject, transform) : function(v){ return v; }; - - return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g, - function(match, key, format){ - var value = dojo.getObject(key, false, map); - if(format){ - value = dojo.getObject(format, false, thisObject).call(thisObject, value, key); - } - return transform(value, key).toString(); - }); // String -}; - -/*===== -dojo.string.trim = function(str){ - // summary: - // Trims whitespace from both sides of the string - // str: String - // String to be trimmed - // returns: String - // Returns the trimmed string - // description: - // This version of trim() was taken from [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript). - // The short yet performant version of this function is dojo.trim(), - // which is part of Dojo base. Uses String.prototype.trim instead, if available. - return ""; // String -} -=====*/ + // ======================================================================= + // Handling for top level children -dojo.string.trim = String.prototype.trim ? - dojo.trim : // aliasing to the native function - function(str){ - str = str.replace(/^\s+/, ''); - for(var i = str.length - 1; i >= 0; i--){ - if(/\S/.test(str.charAt(i))){ - str = str.substring(0, i + 1); - break; - } - } - return str; - }; + 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"); + }, -if(!dojo._hasResource["dojo.cache"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.cache"] = true; -dojo.provide("dojo.cache"); + // ======================================================================= + // 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; -/*===== -dojo.cache = { - // summary: - // A way to cache string content that is fetchable via `dojo.moduleUrl`. -}; -=====*/ + // 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); + } + }) + }); + }, - var cache = {}; - dojo.cache = function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){ + onNewItem: function(/* dojo.data.Item */ item, /* Object */ parentInfo){ // summary: - // A getter and setter for storing the string content associated with the - // module and url arguments. + // Handler for when new items appear in the store. Developers should override this + // method to be more efficient based on their app/data. // description: - // module and url are used to call `dojo.moduleUrl()` to generate a module URL. - // If value is specified, the cache value for the moduleUrl will be set to - // that value. Otherwise, dojo.cache will fetch the moduleUrl and store it - // in its internal cache and return that cached value for the URL. To clear - // a cache value pass null for value. Since XMLHttpRequest (XHR) is used to fetch the - // the URL contents, only modules on the same domain of the page can use this capability. - // The build system can inline the cache values though, to allow for xdomain hosting. - // module: String||Object - // If a String, the module name to use for the base part of the URL, similar to module argument - // to `dojo.moduleUrl`. If an Object, something that has a .toString() method that - // generates a valid path for the cache item. For example, a dojo._Url object. - // url: String - // The rest of the path to append to the path derived from the module argument. If - // module is an object, then this second argument should be the "value" argument instead. - // value: String||Object? - // If a String, the value to use in the cache for the module/url combination. - // If an Object, it can have two properties: value and sanitize. The value property - // should be the value to use in the cache, and sanitize can be set to true or false, - // to indicate if XML declarations should be removed from the value and if the HTML - // inside a body tag in the value should be extracted as the real value. The value argument - // or the value property on the value argument are usually only used by the build system - // as it inlines cache content. - // example: - // To ask dojo.cache to fetch content and store it in the cache (the dojo["cache"] style - // of call is used to avoid an issue with the build system erroneously trying to intern - // this example. To get the build system to intern your dojo.cache calls, use the - // "dojo.cache" style of call): - // | //If template.html contains "<h1>Hello</h1>" that will be - // | //the value for the text variable. - // | var text = dojo["cache"]("my.module", "template.html"); - // example: - // To ask dojo.cache to fetch content and store it in the cache, and sanitize the input - // (the dojo["cache"] style of call is used to avoid an issue with the build system - // erroneously trying to intern this example. To get the build system to intern your - // dojo.cache calls, use the "dojo.cache" style of call): - // | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the - // | //text variable will contain just "<h1>Hello</h1>". - // | var text = dojo["cache"]("my.module", "template.html", {sanitize: true}); - // example: - // Same example as previous, but demostrates how an object can be passed in as - // the first argument, then the value argument can then be the second argument. - // | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the - // | //text variable will contain just "<h1>Hello</h1>". - // | var text = dojo["cache"](new dojo._Url("my/module/template.html"), {sanitize: true}); - - //Module could be a string, or an object that has a toString() method - //that will return a useful path. If it is an object, then the "url" argument - //will actually be the value argument. - if(typeof module == "string"){ - var pathObj = dojo.moduleUrl(module, url); - }else{ - pathObj = module; - value = url; - } - var key = pathObj.toString(); + // 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(); - var val = value; - if(value != undefined && !dojo.isString(value)){ - val = ("value" in value ? value.value : undefined); - } + this.inherited(arguments); + }, - var sanitize = value && value.sanitize ? true : false; + onDeleteItem: function(/*Object*/ item){ + // summary: + // Handler for delete notifications from underlying store - if(typeof val == "string"){ - //We have a string, set cache value - val = cache[key] = sanitize ? dojo.cache._sanitize(val) : val; - }else if(val === null){ - //Remove cached value - delete cache[key]; - }else{ - //Allow cache values to be empty strings. If key property does - //not exist, fetch it. - if(!(key in cache)){ - val = dojo._getText(key); - cache[key] = sanitize ? dojo.cache._sanitize(val) : val; - } - val = cache[key]; + // 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(); } - return val; //String - }; - dojo.cache._sanitize = function(/*String*/val){ + this.inherited(arguments); + }, + + onSetItem: function(/* item */ item, + /* attribute-name-string */ attribute, + /* object | array */ oldValue, + /* object | array */ newValue){ // summary: - // Strips <?xml ...?> declarations so that external SVG and XML - // documents can be added to a document without worry. Also, if the string - // is an HTML document, only the part inside the body tag is returned. + // 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: - // Copied from dijit._Templated._sanitizeTemplateString. - if(val){ - val = val.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, ""); - var matches = val.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im); - if(matches){ - val = matches[1]; - } - }else{ - val = ""; - } - return val; //String - }; + // 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); + } -if(!dojo._hasResource["dijit._Templated"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._Templated"] = true; -dojo.provide("dijit._Templated"); +}); +}); +}, +'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", +'dijit/form/_ComboBoxMenuMixin':function(){ +define("dijit/form/_ComboBoxMenuMixin", [ + "dojo/_base/array", // array.forEach + "dojo/_base/declare", // declare + "dojo/dom-attr", // domAttr.set + "dojo/i18n", // i18n.getLocalization + "dojo/_base/window", // win.doc.createTextNode + "dojo/i18n!./nls/ComboBox" +], function(array, declare, domAttr, i18n, win){ + +// module: +// dijit/form/_ComboBoxMenuMixin +// summary: +// Focus-less menu for internal use in `dijit.form.ComboBox` +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); + }, -dojo.declare("dijit._Templated", - null, - { - // summary: - // Mixin for widgets that are instantiated from a template + buildRendering: function(){ + this.inherited(arguments); - // templateString: [protected] String - // A string that represents the widget template. Pre-empts the - // templatePath. In builds that have their strings "interned", the - // templatePath is converted to an inline templateString, thereby - // preventing a synchronous network call. - // - // Use in conjunction with dojo.cache() to load from a file. - templateString: null, + // fill in template with i18n messages + this.previousButton.innerHTML = this._messages["previousMessage"]; + this.nextButton.innerHTML = this._messages["nextMessage"]; + }, - // templatePath: [protected deprecated] String - // Path to template (HTML file) for this widget relative to dojo.baseUrl. - // Deprecated: use templateString with dojo.cache() instead. - templatePath: null, + _setValueAttr: function(/*Object*/ value){ + this.value = value; + this.onChange(value); + }, - // widgetsInTemplate: [protected] Boolean - // Should we parse the template to find widgets that might be - // declared in markup inside it? False by default. - widgetsInTemplate: false, + 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); + } + }, - // skipNodeCache: [protected] Boolean - // If using a cached widget template node 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, + // stubs + onChange: function(/*Number*/ /*===== direction =====*/){ + // summary: + // Notifies ComboBox/FilteringSelect that user selected an option. + // tags: + // callback + }, - // _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, + onPage: function(/*Number*/ /*===== direction =====*/){ + // summary: + // Notifies ComboBox/FilteringSelect that user clicked to advance to next/previous page. + // tags: + // callback + }, -/*===== - // _attachPoints: [private] String[] - // List of widget attribute names associated with dojoAttachPoint=... in the - // template, ex: ["containerNode", "labelNode"] - _attachPoints: [], - =====*/ + onClose: function(){ + // summary: + // Callback from dijit.popup code to this widget, notifying it that it closed + // tags: + // private + this._setSelectedAttr(null); + }, -/*===== - // _attachEvents: [private] Handle[] - // List of connections associated with dojoAttachEvent=... in the - // template - _attachEvents: [], - =====*/ + _createOption: function(/*Object*/ item, labelFunc){ + // summary: + // Creates an option to appear on the popup menu subclassed by + // `dijit.form.FilteringSelect`. - constructor: function(){ - 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 dojo.string.substitute(tmpl, this, function(value, key){ - if(key.charAt(0) == '!'){ value = dojo.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); - }, + var menuitem = this._createMenuItem(); + var labelObject = labelFunc(item); + if(labelObject.html){ + menuitem.innerHTML = labelObject.label; + }else{ + menuitem.appendChild( + win.doc.createTextNode(labelObject.label) + ); + } + // #3250: in blank options, assign a normal height + if(menuitem.innerHTML == ""){ + menuitem.innerHTML = " "; //   + } - buildRendering: function(){ - // summary: - // Construct the UI for this widget from a template, setting this.domNode. - // tags: - // protected + // update menuitem.dir if BidiSupport was required + this.applyTextDir(menuitem, (menuitem.innerText || menuitem.textContent || "")); - // 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 = dijit._Templated.getCachedTemplate(this.templatePath, this.templateString, this._skipNodeCache); + menuitem.item=item; + return menuitem; + }, - var node; - if(dojo.isString(cached)){ - node = dojo._toDom(this._stringRepl(cached)); - 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); + 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 + + // 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); + 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.domNode = node; - - // Call down to _Widget.buildRendering() to get base classes assigned - // TODO: change the baseClass assignment to attributeMap - 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); + this.nextButton.style.display = displayMore ? "" : "none"; + domAttr.set(this.nextButton,"id", this.id + "_next"); + return this.containerNode.childNodes; + }, - if(this.widgetsInTemplate){ - // Store widgets that we need to start at a later point in time - var cw = (this._startupWidgets = dojo.parser.parse(node, { - noStart: !this._earlyTemplatedStartup, - template: true, - inherited: {dir: this.dir, lang: this.lang}, - 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 - })); + 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); + }, - this._supportingWidgets = dijit.findWidgets(node); + highlightFirstOption: function(){ + // summary: + // Highlight the first real item in the list (not Previous Choices). + this.selectFirstNode(); + }, - this._attachTemplateNodes(cw, function(n,p){ - return n[p]; - }); - } + highlightLastOption: function(){ + // summary: + // Highlight the last real item in the list (not More Choices). + this.selectLastNode(); + }, - this._fillContent(this.srcNodeRef); - }, + selectFirstNode: function(){ + this.inherited(arguments); + if(this.getHighlightedOption() == this.previousButton){ + this.selectNextNode(); + } + }, - _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); - } - } - }, + selectLastNode: function(){ + this.inherited(arguments); + if(this.getHighlightedOption() == this.nextButton){ + this.selectPreviousNode(); + } + }, - _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 dojoAttachPoint - // 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 - // * dojoAttachEvent - // * waiRole - // * waiState - // rootNode: DomNode|Array[Widgets] - // 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 + getHighlightedOption: function(){ + return this._getSelectedAttr(); + } +}); - getAttrFunc = getAttrFunc || function(n,p){ return n.getAttribute(p); }; +}); - var nodes = dojo.isArray(rootNode) ? rootNode : (rootNode.all || rootNode.getElementsByTagName("*")); - var x = dojo.isArray(rootNode) ? 0 : -1; - for(; x<nodes.length; x++){ - var baseNode = (x == -1) ? rootNode : nodes[x]; - if(this.widgetsInTemplate && (getAttrFunc(baseNode, "dojoType") || getAttrFunc(baseNode, "data-dojo-type"))){ - continue; - } - // Process dojoAttachPoint - 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(dojo.isArray(this[point])){ - this[point].push(baseNode); - }else{ - this[point]=baseNode; - } - this._attachPoints.push(point); - } - } +}, +'dojo/parser':function(){ +define( + "dojo/parser", ["./_base/kernel", "./_base/lang", "./_base/array", "./_base/html", "./_base/window", "./_base/url", + "./_base/json", "./aspect", "./date/stamp", "./query", "./on", "./ready"], + function(dojo, dlang, darray, dhtml, dwindow, _Url, djson, aspect, dates, query, don){ + +// module: +// dojo/parser +// summary: +// The Dom/Widget parsing package - // Process dojoAttachEvent - 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 = dojo.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; - } - this._attachEvents.push(this.connect(baseNode, event, thisFunc)); - } - } - } +new Date("X"); // workaround for #11279, new Date("") == NaN - // waiRole, waiState - // TODO: remove this in 2.0, templates are now using role=... and aria-XXX=... attributes directicly - var role = getAttrFunc(baseNode, "waiRole"); - if(role){ - dijit.setWaiRole(baseNode, role); - } - var values = getAttrFunc(baseNode, "waiState"); - if(values){ - dojo.forEach(values.split(/\s*,\s*/), function(stateValue){ - if(stateValue.indexOf('-') != -1){ - var pair = stateValue.split('-'); - dijit.setWaiState(baseNode, pair[0], pair[1]); - } - }); - } - } - }, +var features = { + // Feature detection for when node.attributes only lists the attributes specified in the markup + // rather than old IE/quirks behavior where it lists every default value too + "dom-attributes-explicit": document.createElement("div").attributes.length < 40 +}; +function has(feature){ + return features[feature]; +} - startup: function(){ - dojo.forEach(this._startupWidgets, function(w){ - if(w && !w._started && w.startup){ - w.startup(); - } - }); - this.inherited(arguments); - }, - destroyRendering: function(){ - // Delete all attach points to prevent IE6 memory leaks. - dojo.forEach(this._attachPoints, function(point){ - delete this[point]; - }, this); - this._attachPoints = []; +dojo.parser = new function(){ + // summary: + // The Dom/Widget parsing package - // And same for event handlers - dojo.forEach(this._attachEvents, this.disconnect, this); - this._attachEvents = []; - - this.inherited(arguments); + var _nameMap = { + // Map from widget name (ex: "dijit.form.Button") to structure mapping + // lowercase version of attribute names to the version in the widget ex: + // { + // label: "label", + // onclick: "onClick" + // } + }; + function getNameMap(proto){ + // summary: + // Returns map from lowercase name to attribute name in class, ex: {onclick: "onClick"} + var map = {}; + for(var name in proto){ + if(name.charAt(0)=="_"){ continue; } // skip internal properties + map[name.toLowerCase()] = name; } + return map; } -); - -// key is either templatePath or templateString; object is either string or DOM tree -dijit._Templated._templateCache = {}; - -dijit._Templated.getCachedTemplate = function(templatePath, templateString, alwaysUseString){ - // summary: - // Static method to get a template based on the templatePath or - // templateString key - // templatePath: String||dojo.uri.Uri - // The URL to get the template from. - // templateString: String? - // a string to use in lieu of fetching the template from a URL. Takes precedence - // over templatePath - // 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 = dijit._Templated._templateCache; - var key = templateString || templatePath; - 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 == dojo.doc){ - // string or node of the same document - return cached; - } - }catch(e){ /* squelch */ } // IE can throw an exception if cached.ownerDocument was reloaded - dojo.destroy(cached); - } + // Widgets like BorderContainer add properties to _Widget via dojo.extend(). + // If BorderContainer is loaded after _Widget's parameter list has been cached, + // we need to refresh that parameter list (for _Widget and all widgets that extend _Widget). + aspect.after(dlang, "extend", function(){ + _nameMap = {}; + }, true); - // If necessary, load template string from template path - if(!templateString){ - templateString = dojo.cache(templatePath, {sanitize: true}); - } - templateString = dojo.string.trim(templateString); + // Map from widget name (ex: "dijit.form.Button") to constructor + var _ctorMap = {}; - 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 = dojo._toDom(templateString); - if(node.nodeType != 1){ - throw new Error("Invalid template: " + templateString); + this._functionFromScript = function(script, attrData){ + // summary: + // Convert a <script type="dojo/method" args="a, b, c"> ... </script> + // into a function + // script: DOMNode + // The <script> DOMNode + // attrData: String + // For HTML5 compliance, searches for attrData + "args" (typically + // "data-dojo-args") instead of "args" + var preamble = ""; + var suffix = ""; + var argsStr = (script.getAttribute(attrData + "args") || script.getAttribute("args")); + if(argsStr){ + darray.forEach(argsStr.split(/\s*,\s*/), function(part, idx){ + preamble += "var "+part+" = arguments["+idx+"]; "; + }); } - return (tmplts[key] = node); //Node - } -}; - -if(dojo.isIE){ - dojo.addOnWindowUnload(function(){ - var cache = dijit._Templated._templateCache; - for(var key in cache){ - var value = cache[key]; - if(typeof value == "object"){ // value is either a string or a DOM node template - dojo.destroy(value); - } - delete cache[key]; + var withStr = script.getAttribute("with"); + if(withStr && withStr.length){ + darray.forEach(withStr.split(/\s*,\s*/), function(part){ + preamble += "with("+part+"){"; + suffix += "}"; + }); } - }); -} + return new Function(preamble+script.innerHTML+suffix); + }; -// 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.) -dojo.extend(dijit._Widget,{ - dojoAttachEvent: "", - dojoAttachPoint: "", - waiRole: "", - waiState:"" -}); + this.instantiate = /*====== dojo.parser.instantiate= ======*/function(nodes, mixin, args){ + // summary: + // Takes array of nodes, and turns them into class instances and + // potentially calls a startup method to allow them to connect with + // any children. + // nodes: Array + // Array of nodes or objects like + // | { + // | type: "dijit.form.Button", + // | node: DOMNode, + // | scripts: [ ... ], // array of <script type="dojo/..."> children of node + // | inherited: { ... } // settings inherited from ancestors like dir, theme, etc. + // | } + // mixin: Object? + // An object that will be mixed in with each node in the array. + // Values in the mixin will override values in the node, if they + // exist. + // args: Object? + // An object used to hold kwArgs for instantiation. + // See parse.args argument for details. -} + var thelist = [], + mixin = mixin||{}; + args = args||{}; -if(!dojo._hasResource["dijit._Container"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._Container"] = true; -dojo.provide("dijit._Container"); + // Precompute names of special attributes we are looking for + // TODO: for 2.0 default to data-dojo- regardless of scopeName (or maybe scopeName won't exist in 2.0) + var dojoType = (args.scope || dojo._scopeName) + "Type", // typically "dojoType" + attrData = "data-" + (args.scope || dojo._scopeName) + "-",// typically "data-dojo-" + dataDojoType = attrData + "type", // typically "data-dojo-type" + dataDojoProps = attrData + "props", // typically "data-dojo-props" + dataDojoAttachPoint = attrData + "attach-point", + dataDojoAttachEvent = attrData + "attach-event", + dataDojoId = attrData + "id"; + + // And make hash to quickly check if a given attribute is special, and to map the name to something friendly + var specialAttrs = {}; + darray.forEach([dataDojoProps, dataDojoType, dojoType, dataDojoId, "jsId", dataDojoAttachPoint, + dataDojoAttachEvent, "dojoAttachPoint", "dojoAttachEvent", "class", "style"], function(name){ + specialAttrs[name.toLowerCase()] = name.replace(args.scope, "dojo"); + }); + darray.forEach(nodes, function(obj){ + if(!obj){ return; } -dojo.declare("dijit._Container", - null, - { - // summary: - // Mixin for widgets that contain a set of widget children. - // description: - // Use this mixin for widgets that needs to know about and - // keep track of their widget children. Suitable for widgets like BorderContainer - // and TabContainer which contain (only) a set of child widgets. - // - // It's not suitable for widgets like ContentPane - // which contains mixed HTML (plain DOM nodes in addition to widgets), - // and where contained widgets are not necessarily directly below - // this.containerNode. In that case calls like addChild(node, position) - // wouldn't make sense. - - // isContainer: [protected] Boolean - // Indicates that this widget acts as a "parent" to the descendant widgets. - // When the parent is started it will call startup() on the child widgets. - // See also `isLayoutContainer`. - isContainer: true, - - buildRendering: function(){ - this.inherited(arguments); - if(!this.containerNode){ - // all widgets with descendants must set containerNode - this.containerNode = this.domNode; + var node = obj.node || obj, + type = dojoType in mixin ? mixin[dojoType] : obj.node ? obj.type : (node.getAttribute(dataDojoType) || node.getAttribute(dojoType)), + ctor = _ctorMap[type] || (_ctorMap[type] = dlang.getObject(type)), + proto = ctor && ctor.prototype; + if(!ctor){ + throw new Error("Could not load class '" + type); } - }, - addChild: function(/*dijit._Widget*/ 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). + // Setup hash to hold parameter settings for this widget. Start with the parameter + // settings inherited from ancestors ("dir" and "lang"). + // Inherited setting may later be overridden by explicit settings on node itself. + var params = {}; - 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"; - } + if(args.defaults){ + // settings for the document itself (or whatever subtree is being parsed) + dlang.mixin(params, args.defaults); } - dojo.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(); + if(obj.inherited){ + // settings from dir=rtl or lang=... on a node above this node + dlang.mixin(params, obj.inherited); } - }, - removeChild: function(/*Widget or 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 + // Get list of attributes explicitly listed in the markup + var attributes; + if(has("dom-attributes-explicit")){ + // Standard path to get list of user specified attributes + attributes = node.attributes; + }else{ + // Special path for IE, avoid (sometimes >100) bogus entries in node.attributes + var clone = /^input$|^img$/i.test(node.nodeName) ? node : node.cloneNode(false), + attrs = clone.outerHTML.replace(/=[^\s"']+|="[^"]*"|='[^']*'/g, "").replace(/^\s*<[a-zA-Z0-9]*/, "").replace(/>.*$/, ""); - if(typeof widget == "number"){ - widget = this.getChildren()[widget]; + attributes = darray.map(attrs.split(/\s+/), function(name){ + var lcName = name.toLowerCase(); + return { + name: name, + // getAttribute() doesn't work for button.value, returns innerHTML of button. + // but getAttributeNode().value doesn't work for the form.encType or li.value + value: (node.nodeName == "LI" && name == "value") || lcName == "enctype" ? + node.getAttribute(lcName) : node.getAttributeNode(lcName).value, + specified: true + }; + }); } - if(widget){ - var node = widget.domNode; - if(node && node.parentNode){ - node.parentNode.removeChild(node); // detach but don't destroy + // Read in attributes and process them, including data-dojo-props, data-dojo-type, + // dojoAttachPoint, etc., as well as normal foo=bar attributes. + var i=0, item; + while(item = attributes[i++]){ + if(!item || !item.specified){ + continue; } - } - }, - - hasChildren: function(){ - // summary: - // Returns true if widget has children, i.e. if this.containerNode contains something. - return this.getChildren().length > 0; // Boolean - }, - - destroyDescendants: function(/*Boolean*/ preserveDom){ - // summary: - // Destroys all the widgets inside this.containerNode, - // but not this widget itself - dojo.forEach(this.getChildren(), function(child){ child.destroyRecursive(preserveDom); }); - }, - - _getSiblingOfChild: function(/*dijit._Widget*/ 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 node = child.domNode, - which = (dir>0 ? "nextSibling" : "previousSibling"); - do{ - node = node[which]; - }while(node && (node.nodeType != 1 || !dijit.byNode(node))); - return node && dijit.byNode(node); // dijit._Widget - }, - - getIndexOfChild: function(/*dijit._Widget*/ child){ - // summary: - // Gets the index of the child in this container or -1 if not found - return dojo.indexOf(this.getChildren(), child); // int - }, - - startup: function(){ - // summary: - // Called after all the widgets have been instantiated and their - // dom nodes have been inserted somewhere under dojo.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; } - - // Startup all children of this widget - dojo.forEach(this.getChildren(), function(child){ child.startup(); }); - - this.inherited(arguments); - } - } -); -} + var name = item.name, + lcName = name.toLowerCase(), + value = item.value; -if(!dojo._hasResource["dijit._Contained"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._Contained"] = true; -dojo.provide("dijit._Contained"); + if(lcName in specialAttrs){ + switch(specialAttrs[lcName]){ + // Data-dojo-props. Save for later to make sure it overrides direct foo=bar settings + case "data-dojo-props": + var extra = value; + break; -dojo.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 - // | dojo.declare("my.customClass",[dijit._Widget,dijit._Contained],{}); + // data-dojo-id or jsId. TODO: drop jsId in 2.0 + case "data-dojo-id": + case "jsId": + var jsname = value; + break; - getParent: function(){ - // summary: - // Returns the parent widget of this widget, assuming the parent - // specifies isContainer - var parent = dijit.getEnclosingWidget(this.domNode.parentNode); - return parent && parent.isContainer ? parent : null; - }, + // For the benefit of _Templated + case "data-dojo-attach-point": + case "dojoAttachPoint": + params.dojoAttachPoint = value; + break; + case "data-dojo-attach-event": + case "dojoAttachEvent": + params.dojoAttachEvent = value; + break; - _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 && dijit.byNode(node); // dijit._Widget - }, + // Special parameter handling needed for IE + case "class": + params["class"] = node.className; + break; + case "style": + params["style"] = node.style && node.style.cssText; + break; + } + }else{ + // Normal attribute, ex: value="123" - getPreviousSibling: function(){ - // summary: - // Returns null if this is the first child of the parent, - // otherwise returns the next element sibling to the "left". + // Find attribute in widget corresponding to specified name. + // May involve case conversion, ex: onclick --> onClick + if(!(name in proto)){ + var map = (_nameMap[type] || (_nameMap[type] = getNameMap(proto))); + name = map[lcName] || name; + } - return this._getSibling("previous"); // dijit._Widget - }, + // Set params[name] to value, doing type conversion + if(name in proto){ + switch(typeof proto[name]){ + case "string": + params[name] = value; + break; + case "number": + params[name] = value.length ? Number(value) : NaN; + break; + case "boolean": + // for checked/disabled value might be "" or "checked". interpret as true. + params[name] = value.toLowerCase() != "false"; + break; + case "function": + if(value === "" || value.search(/[^\w\.]+/i) != -1){ + // The user has specified some text for a function like "return x+5" + params[name] = new Function(value); + }else{ + // The user has specified the name of a function like "myOnClick" + // or a single word function "return" + params[name] = dlang.getObject(value, false) || new Function(value); + } + break; + default: + var pVal = proto[name]; + params[name] = + (pVal && "length" in pVal) ? (value ? value.split(/\s*,\s*/) : []) : // array + (pVal instanceof Date) ? + (value == "" ? new Date("") : // the NaN of dates + value == "now" ? new Date() : // current date + dates.fromISOString(value)) : + (pVal instanceof dojo._Url) ? (dojo.baseUrl + value) : + djson.fromJson(value); + } + }else{ + params[name] = value; + } + } + } - getNextSibling: function(){ - // summary: - // Returns null if this is the last child of the parent, - // otherwise returns the next element sibling to the "right". + // Mix things found in data-dojo-props into the params, overriding any direct settings + if(extra){ + try{ + extra = djson.fromJson.call(args.propsThis, "{" + extra + "}"); + dlang.mixin(params, extra); + }catch(e){ + // give the user a pointer to their invalid parameters. FIXME: can we kill this in production? + throw new Error(e.toString() + " in data-dojo-props='" + extra + "'"); + } + } - return this._getSibling("next"); // dijit._Widget - }, + // Any parameters specified in "mixin" override everything else. + dlang.mixin(params, mixin); - 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 scripts = obj.node ? obj.scripts : (ctor && (ctor._noScript || proto._noScript) ? [] : + query("> script[type^='dojo/']", node)); - var p = this.getParent(); - if(!p || !p.getIndexOfChild){ - return -1; // int + // Process <script type="dojo/*"> script tags + // <script type="dojo/method" event="foo"> tags are added to params, and passed to + // the widget on instantiation. + // <script type="dojo/method"> tags (with no event) are executed after instantiation + // <script type="dojo/connect" data-dojo-event="foo"> tags are dojo.connected after instantiation + // <script type="dojo/watch" data-dojo-prop="foo"> tags are dojo.watch after instantiation + // <script type="dojo/on" data-dojo-event="foo"> tags are dojo.on after instantiation + // note: dojo/* script tags cannot exist in self closing widgets, like <input /> + var connects = [], // functions to connect after instantiation + calls = [], // functions to call after instantiation + watch = [], //functions to watch after instantiation + on = []; //functions to on after instantiation + + if(scripts){ + for(i=0; i<scripts.length; i++){ + var script = scripts[i]; + node.removeChild(script); + // FIXME: drop event="" support in 2.0. use data-dojo-event="" instead + var event = (script.getAttribute(attrData + "event") || script.getAttribute("event")), + prop = script.getAttribute(attrData + "prop"), + type = script.getAttribute("type"), + nf = this._functionFromScript(script, attrData); + if(event){ + if(type == "dojo/connect"){ + connects.push({event: event, func: nf}); + }else if(type == "dojo/on"){ + on.push({event: event, func: nf}); + }else{ + params[event] = nf; + } + }else if(type == "dojo/watch"){ + watch.push({prop: prop, func: nf}); + }else{ + calls.push(nf); + } } - return p.getIndexOfChild(this); // int } - } - ); - -} - -if(!dojo._hasResource["dijit.layout._LayoutWidget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.layout._LayoutWidget"] = true; -dojo.provide("dijit.layout._LayoutWidget"); + // create the instance + var markupFactory = ctor.markupFactory || proto.markupFactory; + var instance = markupFactory ? markupFactory(params, node, ctor) : new ctor(params, node); + thelist.push(instance); + // map it to the JS namespace if that makes sense + if(jsname){ + dlang.setObject(jsname, instance); + } + // process connections and startup functions + for(i=0; i<connects.length; i++){ + aspect.after(instance, connects[i].event, dojo.hitch(instance, connects[i].func), true); + } + for(i=0; i<calls.length; i++){ + calls[i].call(instance); + } + for(i=0; i<watch.length; i++){ + instance.watch(watch[i].prop, watch[i].func); + } + for(i=0; i<on.length; i++){ + don(instance, on[i].event, on[i].func); + } + }, this); + // Call startup on each top level instance if it makes sense (as for + // widgets). Parent widgets will recursively call startup on their + // (non-top level) children + if(!mixin._started){ + darray.forEach(thelist, function(instance){ + if( !args.noStart && instance && + dlang.isFunction(instance.startup) && + !instance._started + ){ + instance.startup(); + } + }); + } + return thelist; + }; -dojo.declare("dijit.layout._LayoutWidget", - [dijit._Widget, dijit._Container, dijit._Contained], - { + this.parse = /*====== dojo.parser.parse= ======*/ function(rootNode, args){ // 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); - dojo.addClass(this.domNode, "dijitContainer"); - }, - - startup: function(){ - // summary: - // Called after all the widgets have been instantiated and their - // dom nodes have been inserted somewhere under dojo.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 my size changes so that I can re-layout. - // For browsers where I can't directly monitor when my size changes, - // monitor when the viewport changes size, which *may* indicate a size change for me. - this.connect(dojo.isIE ? this.domNode : dojo.global, 'onresize', function(){ - // Using function(){} closure to ensure no arguments to resize. - 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 relayout 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 relayout 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} + // Scan the DOM for class instances, and instantiate them. + // + // description: + // Search specified node (or root node) recursively for class instances, + // and instantiate them. Searches for either data-dojo-type="Class" or + // dojoType="Class" where "Class" is a a fully qualified class name, + // like `dijit.form.Button` + // + // Using `data-dojo-type`: + // Attributes using can be mixed into the parameters used to instantiate the + // Class by using a `data-dojo-props` attribute on the node being converted. + // `data-dojo-props` should be a string attribute to be converted from JSON. + // + // Using `dojoType`: + // Attributes are read from the original domNode and converted to appropriate + // types by looking up the Class prototype values. This is the default behavior + // from Dojo 1.0 to Dojo 1.5. `dojoType` support is deprecated, and will + // go away in Dojo 2.0. + // + // rootNode: DomNode? + // A default starting root node from which to start the parsing. Can be + // omitted, defaulting to the entire document. If omitted, the `args` + // object can be passed in this place. If the `args` object has a + // `rootNode` member, that is used. + // + // args: Object + // a kwArgs object passed along to instantiate() + // + // * noStart: Boolean? + // when set will prevent the parser from calling .startup() + // when locating the nodes. + // * rootNode: DomNode? + // identical to the function's `rootNode` argument, though + // allowed to be passed in via this `args object. + // * template: Boolean + // If true, ignores ContentPane's stopParser flag and parses contents inside of + // a ContentPane inside of a template. This allows dojoAttachPoint on widgets/nodes + // nested inside the ContentPane to work. + // * inherited: Object + // Hash possibly containing dir and lang settings to be applied to + // parsed widgets, unless there's another setting on a sub-node that overrides + // * scope: String + // 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.) + // * propsThis: Object + // If specified, "this" referenced from data-dojo-props will refer to propsThis. + // Intended for use from the widgets-in-template feature of `dijit._WidgetsInTemplateMixin` + // + // example: + // Parse all widgets on a page: + // | dojo.parser.parse(); + // + // example: + // Parse all classes within the node with id="foo" + // | dojo.parser.parse(dojo.byId('foo')); + // + // example: + // Parse all classes in a page, but do not call .startup() on any + // child + // | dojo.parser.parse({ noStart: true }) + // + // example: + // Parse all classes in a node, but do not call .startup() + // | dojo.parser.parse(someNode, { noStart:true }); + // | // or + // | dojo.parser.parse({ noStart:true, rootNode: someNode }); - var node = this.domNode; + // determine the root node based on the passed arguments. + var root; + if(!args && rootNode && rootNode.rootNode){ + args = rootNode; + root = args.rootNode; + }else{ + root = rootNode; + } + root = root ? dhtml.byId(root) : dwindow.body(); + args = args || {}; - // set margin box size, unless it wasn't specified, in which case use current size - if(changeSize){ - dojo.marginBox(node, changeSize); + var dojoType = (args.scope || dojo._scopeName) + "Type", // typically "dojoType" + attrData = "data-" + (args.scope || dojo._scopeName) + "-", // typically "data-dojo-" + dataDojoType = attrData + "type", // typically "data-dojo-type" + dataDojoTextDir = attrData + "textdir"; // typically "data-dojo-textdir" - // set offset of the node - if(changeSize.t){ node.style.top = changeSize.t + "px"; } - if(changeSize.l){ node.style.left = changeSize.l + "px"; } - } + // List of all nodes on page w/dojoType specified + var list = []; - // 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 || {}; - dojo.mixin(mb, changeSize || {}); // changeSize overrides resultSize - if( !("h" in mb) || !("w" in mb) ){ - mb = dojo.mixin(dojo.marginBox(node), mb); // just use dojo.marginBox() to fill in missing values + // Info on DOMNode currently being processed + var node = root.firstChild; + + // Info on parent of DOMNode currently being processed + // - inherited: dir, lang, and textDir setting of parent, or inherited by parent + // - parent: pointer to identical structure for my parent (or null if no parent) + // - scripts: if specified, collects <script type="dojo/..."> type nodes from children + var inherited = args && args.inherited; + if(!inherited){ + function findAncestorAttr(node, attr){ + return (node.getAttribute && node.getAttribute(attr)) || + (node !== dwindow.doc && node !== dwindow.doc.documentElement && node.parentNode ? findAncestorAttr(node.parentNode, attr) : null); + } + inherited = { + dir: findAncestorAttr(root, "dir"), + lang: findAncestorAttr(root, "lang"), + textDir: findAncestorAttr(root, dataDojoTextDir) + }; + for(var key in inherited){ + if(!inherited[key]){ delete inherited[key]; } } + } + var parent = { + inherited: inherited + }; - // Compute and save the size of my border box and content box - // (w/out calling dojo.contentBox() since that may fail if size was recently set) - var cs = dojo.getComputedStyle(node); - var me = dojo._getMarginExtents(node, cs); - var be = dojo._getBorderExtents(node, cs); - var bb = (this._borderBox = { - w: mb.w - (me.w + be.w), - h: mb.h - (me.h + be.h) - }); - var pe = dojo._getPadExtents(node, cs); - this._contentBox = { - l: dojo._toPixelValue(node, cs.paddingLeft), - t: dojo._toPixelValue(node, cs.paddingTop), - w: bb.w - pe.w, - h: bb.h - pe.h - }; + // For collecting <script type="dojo/..."> type nodes (when null, we don't need to collect) + var scripts; - // Callback for widget to adjust size of its children - this.layout(); - }, + // when true, only look for <script type="dojo/..."> tags, and don't recurse to children + var scriptsOnly; - layout: function(){ + function getEffective(parent){ // 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 - }, + // Get effective dir, lang, textDir settings for specified obj + // (matching "parent" object structure above), and do caching. + // Take care not to return null entries. + if(!parent.inherited){ + parent.inherited = {}; + var node = parent.node, + grandparent = getEffective(parent.parent); + var inherited = { + dir: node.getAttribute("dir") || grandparent.dir, + lang: node.getAttribute("lang") || grandparent.lang, + textDir: node.getAttribute(dataDojoTextDir) || grandparent.textDir + }; + for(var key in inherited){ + if(inherited[key]){ + parent.inherited[key] = inherited[key]; + } + } + } + return parent.inherited; + } - _setupChild: function(/*dijit._Widget*/child){ - // summary: - // Common setup for initial children and children which are added after startup - // tags: - // protected extension + // DFS on DOM tree, collecting nodes with data-dojo-type specified. + while(true){ + if(!node){ + // Finished this level, continue to parent's next sibling + if(!parent || !parent.node){ + break; + } + node = parent.node.nextSibling; + scripts = parent.scripts; + scriptsOnly = false; + parent = parent.parent; + continue; + } - var cls = this.baseClass + "-child " - + (child.baseClass ? this.baseClass + "-" + child.baseClass : ""); - dojo.addClass(child.domNode, cls); - }, + if(node.nodeType != 1){ + // Text or comment node, skip to next sibling + node = node.nextSibling; + continue; + } - addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){ - // Overrides _Container.addChild() to call _setupChild() - this.inherited(arguments); - if(this._started){ - this._setupChild(child); + if(scripts && node.nodeName.toLowerCase() == "script"){ + // Save <script type="dojo/..."> for parent, then continue to next sibling + type = node.getAttribute("type"); + if(type && /^dojo\/\w/i.test(type)){ + scripts.push(node); + } + node = node.nextSibling; + continue; + } + if(scriptsOnly){ + node = node.nextSibling; + continue; } - }, - removeChild: function(/*dijit._Widget*/ child){ - // Overrides _Container.removeChild() to remove class added by _setupChild() - var cls = this.baseClass + "-child" - + (child.baseClass ? - " " + this.baseClass + "-" + child.baseClass : ""); - dojo.removeClass(child.domNode, cls); - - this.inherited(arguments); - } - } -); + // Check for data-dojo-type attribute, fallback to backward compatible dojoType + var type = node.getAttribute(dataDojoType) || node.getAttribute(dojoType); -dijit.layout.marginBox2contentBox = function(/*DomNode*/ node, /*Object*/ mb){ - // summary: - // Given the margin-box size of a node, return its content box size. - // Functions like dojo.contentBox() but is more reliable since it doesn't have - // to wait for the browser to compute sizes. - var cs = dojo.getComputedStyle(node); - var me = dojo._getMarginExtents(node, cs); - var pb = dojo._getPadBorderExtents(node, cs); - return { - l: dojo._toPixelValue(node, cs.paddingLeft), - t: dojo._toPixelValue(node, cs.paddingTop), - w: mb.w - (me.w + pb.w), - h: mb.h - (me.h + pb.h) - }; -}; + // Short circuit for leaf nodes containing nothing [but text] + var firstChild = node.firstChild; + if(!type && (!firstChild || (firstChild.nodeType == 3 && !firstChild.nextSibling))){ + node = node.nextSibling; + continue; + } -(function(){ - var capitalize = function(word){ - return word.substring(0,1).toUpperCase() + word.substring(1); - }; + // Setup data structure to save info on current node for when we return from processing descendant nodes + var current = { + node: node, + scripts: scripts, + parent: parent + }; - var size = function(widget, dim){ - // size the child - var newSize = widget.resize ? widget.resize(dim) : dojo.marginBox(widget.domNode, dim); + // If dojoType/data-dojo-type specified, add to output array of nodes to instantiate + var ctor = type && (_ctorMap[type] || (_ctorMap[type] = dlang.getObject(type))), // note: won't find classes declared via dojo.Declaration + childScripts = ctor && !ctor.prototype._noScript ? [] : null; // <script> nodes that are parent's children + if(type){ + list.push({ + "type": type, + node: node, + scripts: childScripts, + inherited: getEffective(current) // dir & lang settings for current node, explicit or inherited + }); + } - // record child's size - if(newSize){ - // if the child returned it's new size then use that - dojo.mixin(widget, newSize); - }else{ - // otherwise, call marginBox(), but favor our own numbers when we have them. - // the browser lies sometimes - dojo.mixin(widget, dojo.marginBox(widget.domNode)); - dojo.mixin(widget, dim); - } - }; + // Recurse, collecting <script type="dojo/..."> children, and also looking for + // descendant nodes with dojoType specified (unless the widget has the stopParser flag). + // When finished with children, go to my next sibling. + node = firstChild; + scripts = childScripts; + scriptsOnly = ctor && ctor.prototype.stopParser && !(args && args.template); + parent = current; - dijit.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 = dojo.mixin({}, dim); + // go build the object instances + var mixin = args && args.template ? {template: true} : null; + return this.instantiate(list, mixin, args); // Array + }; +}(); - dojo.addClass(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 = dojo.filter(children, function(item){ return item.region != "center" && item.layoutAlign != "client"; }) - .concat(dojo.filter(children, function(item){ return item.region == "center" || item.layoutAlign == "client"; })); +//Register the parser callback. It should be the first callback +//after the a11y test. +if(dojo.config.parseOnLoad){ + dojo.ready(100, dojo.parser, "parse"); +} - // set positions/sizes - dojo.forEach(children, function(child){ - var elm = child.domNode, - pos = (child.region || child.layoutAlign); +return dojo.parser; +}); - // 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"; +}, +'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\"\n/></span>\n", +'dojo/dnd/Manager':function(){ +define("dojo/dnd/Manager", ["../main", "../Evented", "./common", "./autoscroll", "./Avatar"], function(dojo, Evented) { + // module: + // dojo/dnd/Manager + // summary: + // TODOC - dojo.addClass(elm, "dijitAlign" + capitalize(pos)); - // Size adjustments to make to this child widget - var sizeSetting = {}; +var Manager = dojo.declare("dojo.dnd.Manager", [Evented], { + // summary: + // the manager of DnD operations (usually a singleton) + constructor: function(){ + this.avatar = null; + this.source = null; + this.nodes = []; + this.copy = true; + this.target = null; + this.canDropFlag = false; + this.events = []; + }, - // 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; - } + // avatar's offset from the mouse + OFFSET_X: 16, + OFFSET_Y: 16, - // 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); + // methods + overSource: function(source){ + // summary: + // called when a source detected a mouse-over condition + // source: Object + // the reporter + if(this.avatar){ + this.target = (source && source.targetState != "Disabled") ? source : null; + this.canDropFlag = Boolean(this.target); + this.avatar.update(); + } + dojo.publish("/dnd/source/over", [source]); + }, + outSource: function(source){ + // summary: + // called when a source detected a mouse-out condition + // source: Object + // the reporter + if(this.avatar){ + if(this.target == source){ + this.target = null; + this.canDropFlag = false; + this.avatar.update(); + dojo.publish("/dnd/source/over", [null]); } - }); - }; + }else{ + dojo.publish("/dnd/source/over", [null]); + } + }, + startDrag: function(source, nodes, copy){ + // summary: + // called to initiate the DnD operation + // source: Object + // the source which provides items + // nodes: Array + // the list of transferred items + // copy: Boolean + // copy items, if true, move items otherwise + this.source = source; + this.nodes = nodes; + this.copy = Boolean(copy); // normalizing to true boolean + this.avatar = this.makeAvatar(); + dojo.body().appendChild(this.avatar.node); + dojo.publish("/dnd/start", [source, nodes, this.copy]); + this.events = [ + dojo.connect(dojo.doc, "onmousemove", this, "onMouseMove"), + dojo.connect(dojo.doc, "onmouseup", this, "onMouseUp"), + dojo.connect(dojo.doc, "onkeydown", this, "onKeyDown"), + dojo.connect(dojo.doc, "onkeyup", this, "onKeyUp"), + // cancel text selection and text dragging + dojo.connect(dojo.doc, "ondragstart", dojo.stopEvent), + dojo.connect(dojo.body(), "onselectstart", dojo.stopEvent) + ]; + var c = "dojoDnd" + (copy ? "Copy" : "Move"); + dojo.addClass(dojo.body(), c); + }, + canDrop: function(flag){ + // summary: + // called to notify if the current target can accept items + var canDropFlag = Boolean(this.target && flag); + if(this.canDropFlag != canDropFlag){ + this.canDropFlag = canDropFlag; + this.avatar.update(); + } + }, + stopDrag: function(){ + // summary: + // stop the DnD in progress + dojo.removeClass(dojo.body(), ["dojoDndCopy", "dojoDndMove"]); + dojo.forEach(this.events, dojo.disconnect); + this.events = []; + this.avatar.destroy(); + this.avatar = null; + this.source = this.target = null; + this.nodes = []; + }, + makeAvatar: function(){ + // summary: + // makes the avatar; it is separate to be overwritten dynamically, if needed + return new dojo.dnd.Avatar(this); + }, + updateAvatar: function(){ + // summary: + // updates the avatar; it is separate to be overwritten dynamically, if needed + this.avatar.update(); + }, -})(); + // mouse event processors + onMouseMove: function(e){ + // summary: + // event processor for onmousemove + // e: Event + // mouse event + var a = this.avatar; + if(a){ + dojo.dnd.autoScrollNodes(e); + //dojo.dnd.autoScroll(e); + var s = a.node.style; + s.left = (e.pageX + this.OFFSET_X) + "px"; + s.top = (e.pageY + this.OFFSET_Y) + "px"; + var copy = Boolean(this.source.copyState(dojo.isCopyKey(e))); + if(this.copy != copy){ + this._setCopyStatus(copy); + } + } + }, + onMouseUp: function(e){ + // summary: + // event processor for onmouseup + // e: Event + // mouse event + if(this.avatar){ + if(this.target && this.canDropFlag){ + var copy = Boolean(this.source.copyState(dojo.isCopyKey(e))), + params = [this.source, this.nodes, copy, this.target, e]; + dojo.publish("/dnd/drop/before", params); + dojo.publish("/dnd/drop", params); + }else{ + dojo.publish("/dnd/cancel"); + } + this.stopDrag(); + } + }, -} + // keyboard event processors + onKeyDown: function(e){ + // summary: + // event processor for onkeydown: + // watching for CTRL for copy/move status, watching for ESCAPE to cancel the drag + // e: Event + // keyboard event + if(this.avatar){ + switch(e.keyCode){ + case dojo.keys.CTRL: + var copy = Boolean(this.source.copyState(true)); + if(this.copy != copy){ + this._setCopyStatus(copy); + } + break; + case dojo.keys.ESCAPE: + dojo.publish("/dnd/cancel"); + this.stopDrag(); + break; + } + } + }, + onKeyUp: function(e){ + // summary: + // event processor for onkeyup, watching for CTRL for copy/move status + // e: Event + // keyboard event + if(this.avatar && e.keyCode == dojo.keys.CTRL){ + var copy = Boolean(this.source.copyState(false)); + if(this.copy != copy){ + this._setCopyStatus(copy); + } + } + }, -if(!dojo._hasResource["dijit._CssStateMixin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._CssStateMixin"] = true; -dojo.provide("dijit._CssStateMixin"); + // utilities + _setCopyStatus: function(copy){ + // summary: + // changes the copy status + // copy: Boolean + // the copy status + this.copy = copy; + this.source._markDndStatus(this.copy); + this.updateAvatar(); + dojo.replaceClass(dojo.body(), + "dojoDnd" + (this.copy ? "Copy" : "Move"), + "dojoDnd" + (this.copy ? "Move" : "Copy")); + } +}); +// dojo.dnd._manager: +// The manager singleton variable. Can be overwritten if needed. +dojo.dnd._manager = null; -dojo.declare("dijit._CssStateMixin", [], { +Manager.manager = dojo.dnd.manager = function(){ // 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: {}, + // Returns the current DnD manager. Creates one if it is not created yet. + if(!dojo.dnd._manager){ + dojo.dnd._manager = new dojo.dnd.Manager(); + } + return dojo.dnd._manager; // Object +}; - // 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, +return Manager; +}); - _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. +}, +'dijit/form/ToggleButton':function(){ +define("dijit/form/ToggleButton", [ + "dojo/_base/declare", // declare + "dojo/_base/kernel", // kernel.deprecated + "./Button", + "./_ToggleButtonMixin" +], function(declare, kernel, Button, _ToggleButtonMixin){ - this.inherited(arguments); +/*===== + var Button = dijit.form.Button; + var _ToggleButtonMixin = dijit.form._ToggleButtonMixin; +=====*/ - // Automatically monitor mouse events (essentially :hover and :active) on this.domNode - dojo.forEach(["onmouseenter", "onmouseleave", "onmousedown"], function(e){ - this.connect(this.domNode, e, "_cssMouseEvent"); - }, this); - - // Monitoring changes to disabled, readonly, etc. state, and update CSS class of root node - dojo.forEach(["disabled", "readOnly", "checked", "selected", "focused", "state", "hovering", "active"], function(attr){ - this.watch(attr, dojo.hitch(this, "_setStateClass")); - }, this); + // module: + // dijit/form/ToggleButton + // summary: + // A templated button widget that can be in two states (checked or not). - // Events on sub nodes within the widget - for(var ap in this.cssStateNodes){ - this._trackMouseState(this[ap], this.cssStateNodes[ap]); - } - // 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){ + return declare("dijit.form.ToggleButton", [Button, _ToggleButtonMixin], { // summary: - // Sets hovering and active properties depending on mouse state, - // which triggers _setStateClass() to set appropriate CSS classes for this.domNode. + // 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 - if(!this.disabled){ - switch(event.type){ - case "mouseenter": - case "mouseover": // generated on non-IE browsers even though we connected to mouseenter - this._set("hovering", true); - this._set("active", this._mouseDown); - break; - - case "mouseleave": - case "mouseout": // generated on non-IE browsers even though we connected to mouseleave - this._set("hovering", false); - this._set("active", false); - break; + baseClass: "dijitToggleButton", - case "mousedown" : - this._set("active", true); - this._mouseDown = true; - // Set a global event to handle mouseup, so it fires properly - // even if the cursor leaves this.domNode before the mouse up event. - // Alternately could set active=false on mouseout. - var mouseUpConnector = this.connect(dojo.body(), "onmouseup", function(){ - this._mouseDown = false; - this._set("active", false); - this.disconnect(mouseUpConnector); - }); - break; - } + 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); } - }, + }); +}); - _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 +}, +'dojo/date/stamp':function(){ +define("dojo/date/stamp", ["../_base/kernel", "../_base/lang", "../_base/array"], function(dojo, lang, array) { + // module: + // dojo/date/stamp + // summary: + // TODOC - // Compute new set of classes - var newStateClasses = this.baseClass.split(" "); +lang.getObject("date.stamp", true, dojo); - function multiply(modifier){ - newStateClasses = newStateClasses.concat(dojo.map(newStateClasses, function(c){ return c+modifier; }), "dijit"+modifier); - } +// Methods to convert dates to or from a wire (string) format using well-known conventions - if(!this.isLeftToRight()){ - // For RTL mode we need to set an addition class like dijitTextBoxRtl. - multiply("Rtl"); - } +dojo.date.stamp.fromISOString = function(/*String*/formattedString, /*Number?*/defaultTime){ + // summary: + // Returns a Date object given a string formatted according to a subset of the ISO-8601 standard. + // + // description: + // Accepts a string formatted according to a profile of ISO8601 as defined by + // [RFC3339](http://www.ietf.org/rfc/rfc3339.txt), except that partial input is allowed. + // Can also process dates as specified [by the W3C](http://www.w3.org/TR/NOTE-datetime) + // The following combinations are valid: + // + // * dates only + // | * yyyy + // | * yyyy-MM + // | * yyyy-MM-dd + // * times only, with an optional time zone appended + // | * THH:mm + // | * THH:mm:ss + // | * THH:mm:ss.SSS + // * and "datetimes" which could be any combination of the above + // + // timezones may be specified as Z (for UTC) or +/- followed by a time expression HH:mm + // Assumes the local time zone if not specified. Does not validate. Improperly formatted + // input may return null. Arguments which are out of bounds will be handled + // by the Date constructor (e.g. January 32nd typically gets resolved to February 1st) + // Only years between 100 and 9999 are supported. + // + // formattedString: + // A string such as 2005-06-30T08:05:00-07:00 or 2005-06-30 or T08:05:00 + // + // defaultTime: + // Used for defaults for fields omitted in the formattedString. + // Uses 1970-01-01T00:00:00.0Z by default. - if(this.checked){ - multiply("Checked"); - } - if(this.state){ - multiply(this.state); + if(!dojo.date.stamp._isoRegExp){ + dojo.date.stamp._isoRegExp = +//TODO: could be more restrictive and check for 00-59, etc. + /^(?:(\d{4})(?:-(\d{2})(?:-(\d{2}))?)?)?(?:T(\d{2}):(\d{2})(?::(\d{2})(.\d+)?)?((?:[+-](\d{2}):(\d{2}))|Z)?)?$/; + } + + var match = dojo.date.stamp._isoRegExp.exec(formattedString), + result = null; + + if(match){ + match.shift(); + if(match[1]){match[1]--;} // Javascript Date months are 0-based + if(match[6]){match[6] *= 1000;} // Javascript Date expects fractional seconds as milliseconds + + if(defaultTime){ + // mix in defaultTime. Relatively expensive, so use || operators for the fast path of defaultTime === 0 + defaultTime = new Date(defaultTime); + array.forEach(array.map(["FullYear", "Month", "Date", "Hours", "Minutes", "Seconds", "Milliseconds"], function(prop){ + return defaultTime["get" + prop](); + }), function(value, index){ + match[index] = match[index] || value; + }); } - if(this.selected){ - multiply("Selected"); + result = new Date(match[0]||1970, match[1]||0, match[2]||1, match[3]||0, match[4]||0, match[5]||0, match[6]||0); //TODO: UTC defaults + if(match[0] < 100){ + result.setFullYear(match[0] || 1970); } - if(this.disabled){ - multiply("Disabled"); - }else if(this.readOnly){ - multiply("ReadOnly"); - }else{ - if(this.active){ - multiply("Active"); - }else if(this.hovering){ - multiply("Hover"); - } + var offset = 0, + zoneSign = match[7] && match[7].charAt(0); + if(zoneSign != 'Z'){ + offset = ((match[8] || 0) * 60) + (Number(match[9]) || 0); + if(zoneSign != '-'){ offset *= -1; } } - - if(this._focused){ - multiply("Focused"); + if(zoneSign){ + offset -= result.getTimezoneOffset(); + } + if(offset){ + result.setTime(result.getTime() + offset * 60000); } + } - // 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 + return result; // Date or null +}; + +/*===== + dojo.date.stamp.__Options = function(){ + // selector: String + // "date" or "time" for partial formatting of the Date object. + // Both date and time will be formatted by default. + // zulu: Boolean + // if true, UTC/GMT is used for a timezone + // milliseconds: Boolean + // if true, output milliseconds + this.selector = selector; + this.zulu = zulu; + this.milliseconds = milliseconds; + } +=====*/ - dojo.forEach(tn.className.split(" "), function(c){ classHash[c] = true; }); +dojo.date.stamp.toISOString = function(/*Date*/dateObject, /*dojo.date.stamp.__Options?*/options){ + // summary: + // Format a Date object as a string according a subset of the ISO-8601 standard + // + // description: + // When options.selector is omitted, output follows [RFC3339](http://www.ietf.org/rfc/rfc3339.txt) + // The local time zone is included as an offset from GMT, except when selector=='time' (time without a date) + // Does not check bounds. Only years between 100 and 9999 are supported. + // + // dateObject: + // A Date object - if("_stateClasses" in this){ - dojo.forEach(this._stateClasses, function(c){ delete classHash[c]; }); + var _ = function(n){ return (n < 10) ? "0" + n : n; }; + options = options || {}; + var formattedDate = [], + getter = options.zulu ? "getUTC" : "get", + date = ""; + if(options.selector != "time"){ + var year = dateObject[getter+"FullYear"](); + date = ["0000".substr((year+"").length)+year, _(dateObject[getter+"Month"]()+1), _(dateObject[getter+"Date"]())].join('-'); + } + formattedDate.push(date); + if(options.selector != "date"){ + var time = [_(dateObject[getter+"Hours"]()), _(dateObject[getter+"Minutes"]()), _(dateObject[getter+"Seconds"]())].join(':'); + var millis = dateObject[getter+"Milliseconds"](); + if(options.milliseconds){ + time += "."+ (millis < 100 ? "0" : "") + _(millis); + } + if(options.zulu){ + time += "Z"; + }else if(options.selector != "time"){ + var timezoneOffset = dateObject.getTimezoneOffset(); + var absOffset = Math.abs(timezoneOffset); + time += (timezoneOffset > 0 ? "-" : "+") + + _(Math.floor(absOffset/60)) + ":" + _(absOffset%60); } + formattedDate.push(time); + } + return formattedDate.join('T'); // String +}; - dojo.forEach(newStateClasses, function(c){ classHash[c] = true; }); +return dojo.date.stamp; +}); - var newClasses = []; - for(var c in classHash){ - newClasses.push(c); - } - tn.className = newClasses.join(" "); +}, +'dojo/Stateful':function(){ +define("dojo/Stateful", ["./_base/kernel", "./_base/declare", "./_base/lang", "./_base/array"], function(dojo, declare, lang, array) { + // module: + // dojo/Stateful + // summary: + // TODOC - this._stateClasses = newStateClasses; +return dojo.declare("dojo.Stateful", null, { + // summary: + // Base class for objects that provide named properties with optional getter/setter + // control and the ability to watch for property changes + // example: + // | var obj = new dojo.Stateful(); + // | obj.watch("foo", function(){ + // | console.log("foo changed to " + this.get("foo")); + // | }); + // | obj.set("foo","bar"); + postscript: function(mixin){ + if(mixin){ + lang.mixin(this, mixin); + } }, - _trackMouseState: function(/*DomNode*/ node, /*String*/ clazz){ + get: function(/*String*/name){ // 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. + // Get a property on a Stateful instance. + // name: + // The property to get. + // returns: + // The property value on this Stateful instance. // 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). - - // Current state of node (initially false) - // NB: setting specifically to false because dojo.toggleClass() needs true boolean as third arg - var hovering=false, active=false, focused=false; + // Get a named property on a Stateful object. The property may + // potentially be retrieved via a getter method in subclasses. In the base class + // this just retrieves the object's property. + // For example: + // | stateful = new dojo.Stateful({foo: 3}); + // | stateful.get("foo") // returns 3 + // | stateful.foo // returns 3 - var self = this, - cn = dojo.hitch(this, "connect", node); - - function setClass(){ - var disabled = ("disabled" in self && self.disabled) || ("readonly" in self && self.readonly); - dojo.toggleClass(node, clazz+"Hover", hovering && !active && !disabled); - dojo.toggleClass(node, clazz+"Active", active && !disabled); - dojo.toggleClass(node, clazz+"Focused", focused && !disabled); + return this[name]; //Any + }, + set: function(/*String*/name, /*Object*/value){ + // summary: + // Set a property on a Stateful instance + // name: + // The property to set. + // value: + // The value to set in the property. + // returns: + // The function returns this dojo.Stateful instance. + // description: + // Sets named properties on a stateful object and notifies any watchers of + // the property. A programmatic setter may be defined in subclasses. + // For example: + // | stateful = new dojo.Stateful(); + // | stateful.watch(function(name, oldValue, value){ + // | // this will be called on the set below + // | } + // | stateful.set(foo, 5); + // + // set() may also be called with a hash of name/value pairs, ex: + // | myObj.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 oldValue = this[name]; + this[name] = value; + if(this._watchCallbacks){ + this._watchCallbacks(name, oldValue, value); + } + return this; //dojo.Stateful + }, + watch: function(/*String?*/name, /*Function*/callback){ + // summary: + // Watches a property for changes + // name: + // Indicates the property to watch. This is optional (the callback may be the + // only parameter), and if omitted, all the properties will be watched + // returns: + // An object handle for the watch. The unwatch method of this object + // can be used to discontinue watching this property: + // | var watchHandle = obj.watch("foo", callback); + // | watchHandle.unwatch(); // callback won't be called now + // callback: + // The function to execute when the property changes. This will be called after + // the property has been changed. The callback will be called with the |this| + // set to the instance, the first argument as the name of the property, the + // second argument as the old value and the third argument as the new value. - // Mouse - cn("onmouseenter", function(){ - hovering = true; - setClass(); - }); - cn("onmouseleave", function(){ - hovering = false; - active = false; - setClass(); - }); - cn("onmousedown", function(){ - active = true; - setClass(); - }); - cn("onmouseup", function(){ - active = false; - setClass(); - }); - - // Focus - cn("onfocus", function(){ - focused = true; - setClass(); - }); - cn("onblur", function(){ - focused = false; - setClass(); - }); - - // Just in case widget is enabled/disabled while it has focus/hover/active state. - // Maybe this is overkill. - this.watch("disabled", setClass); - this.watch("readOnly", setClass); + var callbacks = this._watchCallbacks; + if(!callbacks){ + var self = this; + callbacks = this._watchCallbacks = function(name, oldValue, value, ignoreCatchall){ + var notify = function(propertyCallbacks){ + if(propertyCallbacks){ + propertyCallbacks = propertyCallbacks.slice(); + for(var i = 0, l = propertyCallbacks.length; i < l; i++){ + try{ + propertyCallbacks[i].call(self, name, oldValue, value); + }catch(e){ + console.error(e); + } + } + } + }; + notify(callbacks['_' + name]); + if(!ignoreCatchall){ + notify(callbacks["*"]); // the catch-all + } + }; // we use a function instead of an object so it will be ignored by JSON conversion + } + if(!callback && typeof name === "function"){ + callback = name; + name = "*"; + }else{ + // prepend with dash to prevent name conflicts with function (like "name" property) + name = '_' + name; + } + var propertyCallbacks = callbacks[name]; + if(typeof propertyCallbacks !== "object"){ + propertyCallbacks = callbacks[name] = []; + } + propertyCallbacks.push(callback); + return { + unwatch: function(){ + propertyCallbacks.splice(array.indexOf(propertyCallbacks, callback), 1); + } + }; //Object } -}); - -} -if(!dojo._hasResource["dijit.form._FormWidget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form._FormWidget"] = true; -dojo.provide("dijit.form._FormWidget"); +}); +}); +}, +'dijit/layout/AccordionContainer':function(){ +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/_base/kernel", + "dojo/keys", // keys + "dojo/_base/lang", // lang.getObject lang.hitch + "dojo/_base/sniff", // has("ie") + "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, + kernel, keys, lang, has, topic, focus, manager, ready, + _Widget, _Container, _TemplatedMixin, _CssStateMixin, StackContainer, ContentPane, template){ +/*===== + var _Widget = dijit._Widget; + var _Container = dijit._Container; + var _TemplatedMixin = dijit._TemplatedMixin; + var _CssStateMixin = dijit._CssStateMixin; + var StackContainer = dijit.layout.StackContainer; + var ContentPane = dijit.layout.ContentPane; +=====*/ + // module: + // dijit/layout/AccordionContainer + // 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. -dojo.declare("dijit.form._FormWidget", [dijit._Widget, dijit._Templated, dijit._CssStateMixin], - { - // 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. + // Design notes: // - // 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._Widget.attr`. + // An AccordionContainer is a StackContainer, but each child (typically ContentPane) + // is wrapped in a _AccordionInnerContainer. This is hidden from the caller. // - // They also share some common methods. - - // name: [const] String - // Name used when submitting form; same as "name" attribute or plain HTML elements - name: "", + // 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. - // alt: String - // Corresponds to the native HTML <input> element's attribute. - alt: "", - // value: String - // Corresponds to the native HTML <input> element's attribute. - value: "", + 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 - // type: String - // Corresponds to the native HTML <input> element's attribute. - type: "text", + templateString: template, - // tabIndex: Integer - // Order fields are traversed when user hits the tab key - tabIndex: "0", + // label: String + // Title of the pane + label: "", + _setLabelAttr: {node: "titleTextNode", type: "innerHTML" }, - // disabled: Boolean - // Should this widget respond to user input? - // In markup, this is specified as "disabled='disabled'", or just "disabled". - disabled: false, + // title: String + // Tooltip that appears on hover + title: "", + _setTitleAttr: {node: "titleTextNode", type: "attribute", attribute: "title"}, - // intermediateChanges: Boolean - // Fires onChange for each value change or only on demand - intermediateChanges: false, + // iconClassAttr: String + // CSS class for icon to left of label + iconClassAttr: "", + _setIconClassAttr: { node: "iconNode", type: "class" }, - // scrollOnFocus: Boolean - // On focus, should this widget scroll into view? - scrollOnFocus: true, + baseClass: "dijitAccordionTitle", - // These mixins assume that the focus node is an INPUT, as many but not all _FormWidgets are. - attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, { - value: "focusNode", - id: "focusNode", - tabIndex: "focusNode", - alt: "focusNode", - title: "focusNode" - }), + getParent: function(){ + // summary: + // Returns the AccordionContainer parent. + // tags: + // private + return this.parent; + }, - 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 attributeMap to set the name due to IE limitations, see #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); - }, + 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); + }, - postCreate: function(){ - this.inherited(arguments); - this.connect(this.domNode, "onmousedown", "_onMouseDown"); - }, + getTitleHeight: function(){ + // summary: + // Returns the height of the title dom node. + return domGeometry.getMarginSize(this.domNode).h; // Integer + }, - _setDisabledAttr: function(/*Boolean*/ value){ - this._set("disabled", value); - dojo.attr(this.focusNode, 'disabled', value); - if(this.valueNode){ - dojo.attr(this.valueNode, 'disabled', value); - } - dijit.setWaiState(this.focusNode, "disabled", value); + // 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); + }, - 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); + _onTitleKeyPress: function(/*Event*/ evt){ + return this.getParent()._onKeyPress(evt, this.contentWidget); + }, - // 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 : "focusNode"; - dojo.forEach(dojo.isArray(attachPointNames) ? attachPointNames : [attachPointNames], function(attachPointName){ - var node = this[attachPointName]; - // complex code because tabIndex=-1 on a <div> doesn't work on FF - if(dojo.isWebKit || dijit.hasDefaultTabStop(node)){ // see #11064 about webkit bug - node.setAttribute('tabIndex', "-1"); - }else{ - node.removeAttribute('tabIndex'); - } - }, this); - }else{ - if(this.tabIndex != ""){ - this.focusNode.setAttribute('tabIndex', this.tabIndex); - } + _setSelectedAttr: function(/*Boolean*/ isSelected){ + this._set("selected", isSelected); + this.focusNode.setAttribute("aria-expanded", isSelected); + this.focusNode.setAttribute("aria-selected", isSelected); + this.focusNode.setAttribute("tabIndex", isSelected ? "0" : "-1"); } - }, + }); - setDisabled: function(/*Boolean*/ disabled){ + var AccordionInnerContainer = declare("dijit.layout._AccordionInnerContainer", [_Widget, _CssStateMixin], { // summary: - // Deprecated. Use set('disabled', ...) instead. - dojo.deprecated("setDisabled("+disabled+") is deprecated. Use set('disabled',"+disabled+") instead.", "", "2.0"); - this.set('disabled', disabled); - }, + // 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. - _onFocus: function(e){ - if(this.scrollOnFocus){ - dojo.window.scrollIntoView(this.domNode); - } - this.inherited(arguments); - }, +/*===== + // 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, +=====*/ - isFocusable: function(){ - // summary: - // Tells if this widget is focusable or not. Used internally by dijit. - // tags: - // protected - return !this.disabled && this.focusNode && (dojo.style(this.domNode, "display") != "none"); - }, +/*===== + // contentWidget: dijit._Widget + // Pointer to the real child widget + contentWidget: null, +=====*/ - focus: function(){ - // summary: - // Put focus on this widget - if(!this.disabled){ - dijit.focus(this.focusNode); - } - }, + baseClass: "dijitAccordionInnerContainer", - 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 - }, + // tell nested layout widget that we will take care of sizing + isLayoutContainer: true, - // _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, + buildRendering: function(){ + // Builds a template like: + // <div class=dijitAccordionInnerContainer> + // Button + // <div class=dijitAccordionChildWrapper> + // ContentPane + // </div> + // </div> - _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){ - clearTimeout(this._onChangeHandle); - } - // setTimout allows hidden value processing to run and - // also the onChange handler can safely adjust focus, etc - this._onChangeHandle = setTimeout(dojo.hitch(this, - function(){ - this._onChangeHandle = null; - this.onChange(newValue); - }), 0); // try to collapse multiple onChange's fired faster than can be processed - } - } - }, + // Create wrapper div, placed where the child is now + this.domNode = domConstruct.place("<div class='" + this.baseClass + + "' role='presentation'>", this.contentWidget.domNode, "after"); - create: function(){ - // Overrides _Widget.create() - this.inherited(arguments); - this._onChangeActive = true; - }, + // 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); - destroy: function(){ - if(this._onChangeHandle){ // destroy called before last onChange has fired - clearTimeout(this._onChangeHandle); - this.onChange(this._lastValueReported); - } - this.inherited(arguments); - }, + // 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); + }, - setValue: function(/*String*/ value){ - // summary: - // Deprecated. Use set('value', ...) instead. - dojo.deprecated("dijit.form._FormWidget:setValue("+value+") is deprecated. Use set('value',"+value+") instead.", "", "2.0"); - this.set('value', value); - }, + postCreate: function(){ + this.inherited(arguments); - getValue: function(){ - // summary: - // Deprecated. Use get('value') instead. - dojo.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.", "", "2.0"); - return this.get('value'); - }, - - _onMouseDown: function(e){ - // If user clicks on the button, even if the mouse is released outside of it, - // this button should get focus (to mimics native browser buttons). - // This is also needed on chrome because otherwise buttons won't get focus at all, - // which leads to bizarre focus restore on Dialog close etc. - if(!e.ctrlKey && dojo.mouseButtons.isLeft(e) && this.isFocusable()){ // !e.ctrlKey to ignore right-click on mac - // 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(dojo.body(), "onmouseup", function(){ - if (this.isFocusable()) { - this.focus(); - } - this.disconnect(mouseUpConnector); - }); - } - } -}); + // 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); + })) + ]; + }, -dojo.declare("dijit.form._FormValueWidget", dijit.form._FormWidget, -{ - // 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. + _setSelectedAttr: function(/*Boolean*/ isSelected){ + this._set("selected", isSelected); + this.button.set("selected", isSelected); + if(isSelected){ + var cw = this.contentWidget; + if(cw.onSelected){ cw.onSelected(); } + } + }, - // 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. - // TODO: unclear what that {value: ""} is for; FormWidget.attributeMap copies value to focusNode, - // so maybe {value: ""} is so the value *doesn't* get copied to focusNode? - // Seems like we really want value removed from attributeMap altogether - // (although there's no easy way to do that now) + startup: function(){ + // Called by _Container.addChild() + this.contentWidget.startup(); + }, - // 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, + destroy: function(){ + this.button.destroyRecursive(); - attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, { - value: "", - readOnly: "focusNode" - }), + array.forEach(this._contentWidgetWatches || [], function(w){ w.unwatch(); }); - _setReadOnlyAttr: function(/*Boolean*/ value){ - dojo.attr(this.focusNode, 'readOnly', value); - dijit.setWaiState(this.focusNode, "readonly", value); - this._set("readOnly", value); - }, + delete this.contentWidget._buttonWidget; + delete this.contentWidget._wrapperWidget; - postCreate: function(){ - this.inherited(arguments); + this.inherited(arguments); + }, - if(dojo.isIE < 9 || (dojo.isIE && dojo.isQuirks)){ // 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; + destroyDescendants: function(/*Boolean*/ preserveDom){ + // since getChildren isn't working for me, have to code this manually + this.contentWidget.destroyRecursive(preserveDom); } - }, - - _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){ + var AccordionContainer = declare("dijit.layout.AccordionContainer", StackContainer, { // 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); - }, + // 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> - undo: function(){ - // summary: - // Restore the value to the last value passed to onChange - this._setValueAttr(this._lastValueReported, false); - }, + // duration: Integer + // Amount of time (in ms) it takes to slide panes + duration: manager.defaultDuration, - reset: function(){ - // summary: - // Reset the widget's value to what it was at initialization time - this._hasBeenBlurred = false; - this._setValueAttr(this._resetValue, true); - }, + // buttonWidget: [const] String + // The name of the widget used to display the title of each pane + buttonWidget: AccordionButton, - _onKeyDown: function(e){ - if(e.keyCode == dojo.keys.ESCAPE && !(e.ctrlKey || e.altKey || e.metaKey)){ - var te; - if(dojo.isIE){ - e.preventDefault(); // default behavior needs to be stopped here since keypress is too late - te = document.createEventObject(); - te.keyCode = dojo.keys.ESCAPE; - te.shiftKey = e.shiftKey; - e.srcElement.fireEvent('onkeypress', te); - } - } - }, +/*===== + // _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", - _layoutHackIE7: function(){ - // summary: - // Work around table sizing bugs on IE7 by forcing redraw + 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 + }, - if(dojo.isIE == 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(e){ - _this.disconnect(disconnectHandle); // only call once - pingNode.style.filter = (new Date()).getMilliseconds(); // set to anything that's unique - setTimeout(function(){ pingNode.style.filter = origFilter }, 0); // restore custom filter, if any - } - ); - })(); - parent = parent.parentNode; + startup: function(){ + if(this._started){ return; } + this.inherited(arguments); + if(this.selectedChildWidget){ + var style = this.selectedChildWidget.containerNode.style; + style.display = ""; + style.overflow = "auto"; + 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. -if(!dojo._hasResource["dijit.dijit"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.dijit"] = true; -dojo.provide("dijit.dijit"); + 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); + }, -/*===== -dijit.dijit = { - // summary: - // A roll-up for common dijit methods - // description: - // A rollup file for the build system including the core and common - // dijit files. - // - // example: - // | <script type="text/javascript" src="js/dojo/dijit/dijit.js"></script> - // -}; -=====*/ + addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){ + 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. -// All the stuff in _base (these are the function that are guaranteed available without an explicit dojo.require) + // 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); -// And some other stuff that we tend to pull in all the time anyway + if(!child._started){ + child.startup(); + } -} + // Then stick the wrapper widget around the child widget + this._setupChild(child); -if(!dojo._hasResource["dojo.fx.Toggler"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.fx.Toggler"] = true; -dojo.provide("dojo.fx.Toggler"); + // 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(). -dojo.declare("dojo.fx.Toggler", null, { - // summary: - // A simple `dojo.Animation` toggler API. - // - // description: - // class constructor for an animation toggler. It accepts a packed - // set of arguments about what type of animation to use in each - // direction, duration, etc. All available members are mixed into - // these animations from the constructor (for example, `node`, - // `showDuration`, `hideDuration`). - // - // example: - // | var t = new dojo.fx.Toggler({ - // | node: "nodeId", - // | showDuration: 500, - // | // hideDuration will default to "200" - // | showFunc: dojo.fx.wipeIn, - // | // hideFunc will default to "fadeOut" - // | }); - // | t.show(100); // delay showing for 100ms - // | // ...time passes... - // | t.hide(); + // 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; + } - // node: DomNode - // the node to target for the showing and hiding animations - node: null, + domClass.remove(child.domNode, "dijitHidden"); - // showFunc: Function - // The function that returns the `dojo.Animation` to show the node - showFunc: dojo.fadeIn, + this.inherited(arguments); + }, - // hideFunc: Function - // The function that returns the `dojo.Animation` to hide the node - hideFunc: dojo.fadeOut, + 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); + }, - // showDuration: - // Time in milliseconds to run the show Animation - showDuration: 200, + 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); + }, - // hideDuration: - // Time in milliseconds to run the hide Animation - hideDuration: 200, + _showChild: function(child){ + // Override StackContainer._showChild() to set visibility of _wrapperWidget.containerNode + child._wrapperWidget.containerNode.style.display="block"; + return this.inherited(arguments); + }, - // FIXME: need a policy for where the toggler should "be" the next - // time show/hide are called if we're stopped somewhere in the - // middle. - // FIXME: also would be nice to specify individual showArgs/hideArgs mixed into - // each animation individually. - // FIXME: also would be nice to have events from the animations exposed/bridged + _hideChild: function(child){ + // Override StackContainer._showChild() to set visibility of _wrapperWidget.containerNode + child._wrapperWidget.containerNode.style.display="none"; + this.inherited(arguments); + }, - /*===== - _showArgs: null, - _showAnim: null, + _transition: function(/*dijit._Widget?*/ newWidget, /*dijit._Widget?*/ oldWidget, /*Boolean*/ animate){ + // Overrides StackContainer._transition() to provide sliding of title bars etc. - _hideArgs: null, - _hideAnim: null, + if(has("ie") < 8){ + // workaround animation bugs by not animating; not worth supporting animation for IE6 & 7 + animate = false; + } - _isShowing: false, - _isHiding: 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; + } - constructor: function(args){ - var _t = this; + var self = this; - dojo.mixin(_t, args); - _t.node = args.node; - _t._showArgs = dojo.mixin({}, args); - _t._showArgs.node = _t.node; - _t._showArgs.duration = _t.showDuration; - _t.showAnim = _t.showFunc(_t._showArgs); + if(newWidget){ + newWidget._wrapperWidget.set("selected", true); - _t._hideArgs = dojo.mixin({}, args); - _t._hideArgs.node = _t.node; - _t._hideArgs.duration = _t.hideDuration; - _t.hideAnim = _t.hideFunc(_t._hideArgs); + var d = this._showChild(newWidget); // prepare widget to be slid in - dojo.connect(_t.showAnim, "beforeBegin", dojo.hitch(_t.hideAnim, "stop", true)); - dojo.connect(_t.hideAnim, "beforeBegin", dojo.hitch(_t.showAnim, "stop", true)); - }, + // 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); + } + } - show: function(delay){ - // summary: Toggle the node to showing - // delay: Integer? - // Ammount of time to stall playing the show animation - return this.showAnim.play(delay || 0); - }, + if(oldWidget){ + oldWidget._wrapperWidget.set("selected", false); + if(!animate){ + this._hideChild(oldWidget); + } + } - hide: function(delay){ - // summary: Toggle the node to hidden - // delay: Integer? - // Ammount of time to stall playing the hide animation - return this.hideAnim.play(delay || 0); - } -}); + 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; -if(!dojo._hasResource["dojo.fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.fx"] = true; -dojo.provide("dojo.fx"); + 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 + }, -/*===== -dojo.fx = { - // summary: Effects library on top of Base animations -}; -=====*/ -(function(){ - - var d = dojo, - _baseObj = { - _fire: function(evt, args){ - if(this[evt]){ - this[evt].apply(this, args||[]); - } - return this; + // note: we are treating the container as controller here + _onKeyPress: function(/*Event*/ e, /*dijit._Widget*/ 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); + } + } + }); - var _chain = function(animations){ - this._index = -1; - this._animations = animations||[]; - this._current = this._onAnimateCtx = this._onEndCtx = null; + // Back compat w/1.6, remove for 2.0 + if(!kernel.isAsync){ + ready(0, function(){ + var requires = ["dijit/layout/AccordionPane"]; + require(requires); // use indirection so modules not rolled into a build + }); + } - this.duration = 0; - d.forEach(this._animations, function(a){ - this.duration += a.duration; - if(a.delay){ this.duration += a.delay; } - }, this); - }; - d.extend(_chain, { - _onAnimate: function(){ - this._fire("onAnimate", arguments); - }, - _onEnd: function(){ - d.disconnect(this._onAnimateCtx); - d.disconnect(this._onEndCtx); - this._onAnimateCtx = this._onEndCtx = null; - if(this._index + 1 == this._animations.length){ - this._fire("onEnd"); - }else{ - // switch animations - this._current = this._animations[++this._index]; - this._onAnimateCtx = d.connect(this._current, "onAnimate", this, "_onAnimate"); - this._onEndCtx = d.connect(this._current, "onEnd", this, "_onEnd"); - this._current.play(0, true); + // For monkey patching + AccordionContainer._InnerContainer = AccordionInnerContainer; + AccordionContainer._Button = AccordionButton; + + return AccordionContainer; +}); + +}, +'dijit/form/_AutoCompleterMixin':function(){ +define("dijit/form/_AutoCompleterMixin", [ + "dojo/_base/connect", // keys keys.SHIFT + "dojo/data/util/filter", // patternToRegExp + "dojo/_base/declare", // declare + "dojo/_base/Deferred", // Deferred.when + "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/_base/sniff", // has("ie") + "dojo/string", // string.substitute + "dojo/_base/window", // win.doc.selection.createRange + "./DataList", + "../registry", // registry.byId + "./_TextBoxMixin" // defines _TextBoxMixin.selectInputText +], function(connect, filter, declare, Deferred, domAttr, event, keys, lang, query, regexp, has, string, win, + DataList, registry, _TextBoxMixin){ + + // module: + // dijit/form/_AutoCompleterMixin + // summary: + // A mixin that implements the base functionality for `dijit.form.ComboBox`/`dijit.form.FilteringSelect` + + + return declare("dijit.form._AutoCompleterMixin", null, { + // 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.data.store implementation that + // provides the data for this ComboBox, it's the currently selected item. + item: null, + + // pageSize: Integer + // Argument to data provider. + // Specifies number of search results per page (before hitting "next" button) + pageSize: Infinity, + + // store: [const] dojo.store.api.Store + // Reference to data provider object used by this ComboBox + 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, + // before doing further filtering based on `searchAttr` and the key. + // Any reference to the `searchAttr` is ignored. + query: {}, + + // 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", + + // searchDelay: Integer + // Delay in milliseconds between when user types something and we start + // searching based on that value + searchDelay: 100, + + // searchAttr: String + // Search for items in the data store where this attribute (in the item) + // matches what the user typed + searchAttr: "name", + + // 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", + + // queryExpr: String + // This specifies what query ComboBox/FilteringSelect sends to the data store, + // based on what the user has typed. Changing this expression will modify + // whether the drop down shows only exact matches, a "starting with" match, + // etc. Use it in conjunction with highlightMatch. + // 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 ComboBox/FilteringSelect should ignore case when matching possible items + ignoreCase: true, + + // 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 = win.doc.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; }, - play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){ - if(!this._current){ this._current = this._animations[this._index = 0]; } - if(!gotoStart && this._current.status() == "playing"){ return this; } - var beforeBegin = d.connect(this._current, "beforeBegin", this, function(){ - this._fire("beforeBegin"); - }), - onBegin = d.connect(this._current, "onBegin", this, function(arg){ - this._fire("onBegin", arguments); - }), - onPlay = d.connect(this._current, "onPlay", this, function(arg){ - this._fire("onPlay", arguments); - d.disconnect(beforeBegin); - d.disconnect(onBegin); - d.disconnect(onPlay); - }); - if(this._onAnimateCtx){ - d.disconnect(this._onAnimateCtx); - } - this._onAnimateCtx = d.connect(this._current, "onAnimate", this, "_onAnimate"); - if(this._onEndCtx){ - d.disconnect(this._onEndCtx); - } - this._onEndCtx = d.connect(this._current, "onEnd", this, "_onEnd"); - this._current.play.apply(this._current, arguments); - return this; + + _setCaretPos: function(/*DomNode*/ element, /*Number*/ location){ + location = parseInt(location); + _TextBoxMixin.selectInputText(element, location, location); }, - pause: function(){ - if(this._current){ - var e = d.connect(this._current, "onPause", this, function(arg){ - this._fire("onPause", arguments); - d.disconnect(e); - }); - this._current.pause(); - } - return this; + + _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); }, - gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){ - this.pause(); - var offset = this.duration * percent; - this._current = null; - d.some(this._animations, function(a){ - if(a.duration <= offset){ - this._current = a; - return true; - } - offset -= a.duration; - return false; - }); - if(this._current){ - this._current.gotoPercent(offset / this._current.duration, andPlay); + + _abortQuery: function(){ + // stop in-progress query + if(this.searchTimer){ + clearTimeout(this.searchTimer); + this.searchTimer = null; } - return this; - }, - stop: function(/*boolean?*/ gotoEnd){ - if(this._current){ - if(gotoEnd){ - for(; this._index + 1 < this._animations.length; ++this._index){ - this._animations[this._index].stop(true); - } - this._current = this._animations[this._index]; + if(this._fetchHandle){ + if(this._fetchHandle.cancel){ + this._cancelingQuery = true; + this._fetchHandle.cancel(); + this._cancelingQuery = false; } - var e = d.connect(this._current, "onStop", this, function(arg){ - this._fire("onStop", arguments); - d.disconnect(e); - }); - this._current.stop(); + this._fetchHandle = null; } - return this; }, - status: function(){ - return this._current ? this._current.status() : "stopped"; + + _onInput: function(/*Event*/ evt){ + // summary: + // Handles paste events + this.inherited(arguments); + if(evt.charOrCode == 229){ // IME or cut/paste event + this._onKey(evt); + } }, - destroy: function(){ - if(this._onAnimateCtx){ d.disconnect(this._onAnimateCtx); } - if(this._onEndCtx){ d.disconnect(this._onEndCtx); } - } - }); - d.extend(_chain, _baseObj); - dojo.fx.chain = function(/*dojo.Animation[]*/ animations){ - // summary: - // Chain a list of `dojo.Animation`s to run in sequence - // - // description: - // Return a `dojo.Animation` which will play all passed - // `dojo.Animation` instances in sequence, firing its own - // synthesized events simulating a single animation. (eg: - // onEnd of this animation means the end of the chain, - // not the individual animations within) - // - // example: - // Once `node` is faded out, fade in `otherNode` - // | dojo.fx.chain([ - // | dojo.fadeIn({ node:node }), - // | dojo.fadeOut({ node:otherNode }) - // | ]).play(); - // - return new _chain(animations) // dojo.Animation - }; + _onKey: function(/*Event*/ evt){ + // summary: + // Handles keyboard events - var _combine = function(animations){ - this._animations = animations||[]; - this._connects = []; - this._finished = 0; + if(this.disabled || this.readOnly){ return; } + var key = evt.charOrCode; - this.duration = 0; - d.forEach(animations, function(a){ - var duration = a.duration; - if(a.delay){ duration += a.delay; } - if(this.duration < duration){ this.duration = duration; } - this._connects.push(d.connect(a, "onEnd", this, "_onEnd")); - }, this); - - this._pseudoAnimation = new d.Animation({curve: [0, 1], duration: this.duration}); - var self = this; - d.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop", "onEnd"], - function(evt){ - self._connects.push(d.connect(self._pseudoAnimation, evt, - function(){ self._fire(evt, arguments); } - )); - } - ); - }; - d.extend(_combine, { - _doAction: function(action, args){ - d.forEach(this._animations, function(a){ - a[action].apply(a, args); - }); - return this; - }, - _onEnd: function(){ - if(++this._finished > this._animations.length){ - this._fire("onEnd"); + // 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 } - }, - _call: function(action, args){ - var t = this._pseudoAnimation; - t[action].apply(t, args); - }, - play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){ - this._finished = 0; - this._doAction("play", arguments); - this._call("play", arguments); - return this; - }, - pause: function(){ - this._doAction("pause", arguments); - this._call("pause", arguments); - return this; - }, - gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){ - var ms = this.duration * percent; - d.forEach(this._animations, function(a){ - a.gotoPercent(a.duration < ms ? 1 : (ms / a.duration), andPlay); - }); - this._call("gotoPercent", arguments); - return this; - }, - stop: function(/*boolean?*/ gotoEnd){ - this._doAction("stop", arguments); - this._call("stop", arguments); - return this; - }, - status: function(){ - return this._pseudoAnimation.status(); - }, - destroy: function(){ - d.forEach(this._connects, dojo.disconnect); - } - }); - d.extend(_combine, _baseObj); - dojo.fx.combine = function(/*dojo.Animation[]*/ animations){ - // summary: - // Combine a list of `dojo.Animation`s to run in parallel - // - // description: - // Combine an array of `dojo.Animation`s to run in parallel, - // providing a new `dojo.Animation` instance encompasing each - // animation, firing standard animation events. - // - // example: - // Fade out `node` while fading in `otherNode` simultaneously - // | dojo.fx.combine([ - // | dojo.fadeIn({ node:node }), - // | dojo.fadeOut({ node:otherNode }) - // | ]).play(); - // - // example: - // When the longest animation ends, execute a function: - // | var anim = dojo.fx.combine([ - // | dojo.fadeIn({ node: n, duration:700 }), - // | dojo.fadeOut({ node: otherNode, duration: 300 }) - // | ]); - // | dojo.connect(anim, "onEnd", function(){ - // | // overall animation is done. - // | }); - // | anim.play(); // play the animation - // - return new _combine(animations); // dojo.Animation - }; + var doSearch = false; + var pw = this.dropDown; + var highlighted = null; + this._prev_key_backspace = false; + this._abortQuery(); - dojo.fx.wipeIn = function(/*Object*/ args){ - // summary: - // Expand a node to it's natural height. - // - // description: - // Returns an animation that will expand the - // node defined in 'args' object from it's current height to - // it's natural height (with no scrollbar). - // Node must have no margin/border/padding. - // - // args: Object - // A hash-map of standard `dojo.Animation` constructor properties - // (such as easing: node: duration: and so on) - // - // example: - // | dojo.fx.wipeIn({ - // | node:"someId" - // | }).play() - var node = args.node = d.byId(args.node), s = node.style, o; + // _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); - var anim = d.animateProperty(d.mixin({ - properties: { - height: { - // wrapped in functions so we wait till the last second to query (in case value has changed) - start: function(){ - // start at current [computed] height, but use 1px rather than 0 - // because 0 causes IE to display the whole panel - o = s.overflow; - s.overflow = "hidden"; - if(s.visibility == "hidden" || s.display == "none"){ - s.height = "1px"; - s.display = ""; - s.visibility = ""; - return 1; - }else{ - var height = d.style(node, "height"); - return Math.max(height, 1); + 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); + break; + }else if(highlighted == pw.previousButton){ + this._nextSearch(-1); + event.stop(evt); + break; } - }, - end: function(){ - return node.scrollHeight; + }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 } - } - } - }, args)); + // default case: + // if enter pressed while drop down is open, or for FilteringSelect, + // if we are in the middle of a query to convert a directly typed in value to an item, + // prevent submit + if(this._opened || this._fetchHandle){ + event.stop(evt); + } + // fall through - d.connect(anim, "onEnd", function(){ - s.height = "auto"; - s.overflow = o; - }); + 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 - return anim; // dojo.Animation - }; + case keys.ESCAPE: + if(this._opened){ + this._lastQuery = null; // in case results come back later + this.closeDropDown(); + } + break; - dojo.fx.wipeOut = function(/*Object*/ args){ - // summary: - // Shrink a node to nothing and hide it. - // - // description: - // Returns an animation that will shrink node defined in "args" - // from it's current height to 1px, and then hide it. - // - // args: Object - // A hash-map of standard `dojo.Animation` constructor properties - // (such as easing: node: duration: and so on) - // - // example: - // | dojo.fx.wipeOut({ node:"someId" }).play() - - var node = args.node = d.byId(args.node), s = node.style, o; - - var anim = d.animateProperty(d.mixin({ - properties: { - height: { - end: 1 // 0 causes IE to display the whole panel - } - } - }, args)); + case ' ': + if(highlighted){ + // user is effectively clicking a choice in the drop down menu + event.stop(evt); + this._selectOption(highlighted); + this.closeDropDown(); + }else{ + // user typed a space into the input box, treat as normal character + doSearch = true; + } + break; - d.connect(anim, "beforeBegin", function(){ - o = s.overflow; - s.overflow = "hidden"; - s.display = ""; - }); - d.connect(anim, "onEnd", function(){ - s.overflow = o; - s.height = "auto"; - s.display = "none"; - }); + case keys.DELETE: + case keys.BACKSPACE: + this._prev_key_backspace = true; + doSearch = true; + break; - return anim; // dojo.Animation - }; + default: + // Non char keys (F1-F12 etc..) shouldn't open list. + // 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 + this.item = undefined; // undefined means item needs to be set + this.searchTimer = setTimeout(lang.hitch(this, "_startSearchFromInput"),1); + } + }, - dojo.fx.slideTo = function(/*Object*/ args){ - // summary: - // Slide a node to a new top/left position - // - // description: - // Returns an animation that will slide "node" - // defined in args Object from its current position to - // the position defined by (args.left, args.top). - // - // args: Object - // A hash-map of standard `dojo.Animation` constructor properties - // (such as easing: node: duration: and so on). Special args members - // are `top` and `left`, which indicate the new position to slide to. - // - // example: - // | dojo.fx.slideTo({ node: node, left:"40", top:"50", units:"px" }).play() + _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 node = args.node = d.byId(args.node), - top = null, left = null; + var fn = this.focusNode; - var init = (function(n){ - return function(){ - var cs = d.getComputedStyle(n); - var pos = cs.position; - top = (pos == 'absolute' ? n.offsetTop : parseInt(cs.top) || 0); - left = (pos == 'absolute' ? n.offsetLeft : parseInt(cs.left) || 0); - if(pos != 'absolute' && pos != 'relative'){ - var ret = d.position(n, true); - top = ret.y; - left = ret.x; - n.style.position="absolute"; - n.style.top=top+"px"; - n.style.left=left+"px"; - } - }; - })(node); - init(); + // 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); + } + }, - var anim = d.animateProperty(d.mixin({ - properties: { - top: args.top || 0, - left: args.left || 0 + _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 + this._fetchHandle = null; + if( this.disabled || + this.readOnly || + (query[this.searchAttr] !== this._lastQuery) // TODO: better way to avoid getting unwanted notify + ){ + return; + } + 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; } - }, args)); - d.connect(anim, "beforeBegin", anim, init); - return anim; // dojo.Animation - }; + // 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 nodes = this.dropDown.createOptions( + results, + options, + lang.hitch(this, "_getMenuLabelFromItem") + ); -} + // show our list (only if we have content, else nothing) + this._showResultList(); -if(!dojo._hasResource["dojo.NodeList-fx"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.NodeList-fx"] = true; -dojo.provide("dojo.NodeList-fx"); + // #4091: + // tell the screen reader that the paging callback finished by + // shouting the next choice + if(options.direction){ + if(1 == options.direction){ + this.dropDown.highlightFirstOption(); + }else if(-1 == 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(nodes[1]); // 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. -/*===== -dojo["NodeList-fx"] = { - // summary: Adds dojo.fx animation support to dojo.query() -}; -=====*/ + this._startSearchAll(); + }, -dojo.extend(dojo.NodeList, { - _anim: function(obj, method, args){ - args = args||{}; - var a = dojo.fx.combine( - this.map(function(item){ - var tmpArgs = { node: item }; - dojo.mixin(tmpArgs, args); - return obj[method](tmpArgs); - }) - ); - return args.auto ? a.play() && this : a; // dojo.Animation|dojo.NodeList - }, + isLoaded: function(){ + // signal to _HasDropDown that it needs to call loadDropDown() to load the + // drop down asynchronously before displaying it + return false; + }, - wipeIn: function(args){ - // summary: - // wipe in all elements of this NodeList via `dojo.fx.wipeIn` - // - // args: Object? - // Additional dojo.Animation arguments to mix into this set with the addition of - // an `auto` parameter. - // - // returns: dojo.Animation|dojo.NodeList - // A special args member `auto` can be passed to automatically play the animation. - // If args.auto is present, the original dojo.NodeList will be returned for further - // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed - // - // example: - // Fade in all tables with class "blah": - // | dojo.query("table.blah").wipeIn().play(); - // - // example: - // Utilizing `auto` to get the NodeList back: - // | dojo.query(".titles").wipeIn({ auto:true }).onclick(someFunction); - // - return this._anim(dojo.fx, "wipeIn", args); // dojo.Animation|dojo.NodeList - }, + 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"); + } + }, - wipeOut: function(args){ - // summary: - // wipe out all elements of this NodeList via `dojo.fx.wipeOut` - // - // args: Object? - // Additional dojo.Animation arguments to mix into this set with the addition of - // an `auto` parameter. - // - // returns: dojo.Animation|dojo.NodeList - // A special args member `auto` can be passed to automatically play the animation. - // If args.auto is present, the original dojo.NodeList will be returned for further - // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed - // - // example: - // Wipe out all tables with class "blah": - // | dojo.query("table.blah").wipeOut().play(); - return this._anim(dojo.fx, "wipeOut", args); // dojo.Animation|dojo.NodeList - }, + _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(); + } + }, - slideTo: function(args){ - // summary: - // slide all elements of the node list to the specified place via `dojo.fx.slideTo` - // - // args: Object? - // Additional dojo.Animation arguments to mix into this set with the addition of - // an `auto` parameter. - // - // returns: dojo.Animation|dojo.NodeList - // A special args member `auto` can be passed to automatically play the animation. - // If args.auto is present, the original dojo.NodeList will be returned for further - // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed - // - // example: - // | Move all tables with class "blah" to 300/300: - // | dojo.query("table.blah").slideTo({ - // | left: 40, - // | top: 50 - // | }).play(); - return this._anim(dojo.fx, "slideTo", args); // dojo.Animation|dojo.NodeList - }, + _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. - fadeIn: function(args){ - // summary: - // fade in all elements of this NodeList via `dojo.fadeIn` - // - // args: Object? - // Additional dojo.Animation arguments to mix into this set with the addition of - // an `auto` parameter. - // - // returns: dojo.Animation|dojo.NodeList - // A special args member `auto` can be passed to automatically play the animation. - // If args.auto is present, the original dojo.NodeList will be returned for further - // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed - // - // example: - // Fade in all tables with class "blah": - // | dojo.query("table.blah").fadeIn().play(); - return this._anim(dojo, "fadeIn", args); // dojo.Animation|dojo.NodeList - }, + 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{ + newValue = (this.store._oldAPI ? // remove getValue() for 2.0 (old dojo.data API) + this.store.getValue(node.item, this.searchAttr) : node.item[this.searchAttr]).toString(); + this.set('item', node.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); + }, - fadeOut: function(args){ - // summary: - // fade out all elements of this NodeList via `dojo.fadeOut` - // - // args: Object? - // Additional dojo.Animation arguments to mix into this set with the addition of - // an `auto` parameter. - // - // returns: dojo.Animation|dojo.NodeList - // A special args member `auto` can be passed to automatically play the animation. - // If args.auto is present, the original dojo.NodeList will be returned for further - // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed - // - // example: - // Fade out all elements with class "zork": - // | dojo.query(".zork").fadeOut().play(); - // example: - // Fade them on a delay and do something at the end: - // | var fo = dojo.query(".zork").fadeOut(); - // | dojo.connect(fo, "onEnd", function(){ /*...*/ }); - // | fo.play(); - // example: - // Using `auto`: - // | dojo.query("li").fadeOut({ auto:true }).filter(filterFn).forEach(doit); - // - return this._anim(dojo, "fadeOut", args); // dojo.Animation|dojo.NodeList - }, - - animateProperty: function(args){ - // summary: - // Animate all elements of this NodeList across the properties specified. - // syntax identical to `dojo.animateProperty` - // - // returns: dojo.Animation|dojo.NodeList - // A special args member `auto` can be passed to automatically play the animation. - // If args.auto is present, the original dojo.NodeList will be returned for further - // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed - // - // example: - // | dojo.query(".zork").animateProperty({ - // | duration: 500, - // | properties: { - // | color: { start: "black", end: "white" }, - // | left: { end: 300 } - // | } - // | }).play(); - // - // example: - // | dojo.query(".grue").animateProperty({ - // | auto:true, - // | properties: { - // | height:240 - // | } - // | }).onclick(handler); - return this._anim(dojo, "animateProperty", args); // dojo.Animation|dojo.NodeList - }, - - anim: function( /*Object*/ properties, - /*Integer?*/ duration, - /*Function?*/ easing, - /*Function?*/ onEnd, - /*Integer?*/ delay){ - // summary: - // Animate one or more CSS properties for all nodes in this list. - // The returned animation object will already be playing when it - // is returned. See the docs for `dojo.anim` for full details. - // properties: Object - // the properties to animate. does NOT support the `auto` parameter like other - // NodeList-fx methods. - // duration: Integer? - // Optional. The time to run the animations for - // easing: Function? - // Optional. The easing function to use. - // onEnd: Function? - // A function to be called when the animation ends - // delay: - // how long to delay playing the returned animation - // example: - // Another way to fade out: - // | dojo.query(".thinger").anim({ opacity: 0 }); - // example: - // animate all elements with the "thigner" class to a width of 500 - // pixels over half a second - // | dojo.query(".thinger").anim({ width: 500 }, 700); - var canim = dojo.fx.combine( - this.map(function(item){ - return dojo.animateProperty({ - node: item, - properties: properties, - duration: duration||350, - easing: easing - }); - }) - ); - if(onEnd){ - dojo.connect(canim, "onEnd", onEnd); - } - return canim.play(delay||0); // dojo.Animation - } -}); - -} - -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"); + _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); + }, -dojo.getObject("colors", true, dojo); + _startSearchAll: function(){ + this._startSearch(''); + }, -//TODO: this module appears to break naming conventions + _startSearchFromInput: function(){ + this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g, "\\$1")); + }, -/*===== -dojo.colors = { - // summary: Color utilities -} -=====*/ + _getQueryString: function(/*String*/ text){ + return string.substitute(this.queryExpr, [text]); + }, -(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], a; - if((t == "rgb" && l == 3) || (t == "rgba" && l == 4)){ - var r = c[0]; - if(r.charAt(r.length - 1) == "%"){ - // 3 rgb percentage values - 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 + _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 } - } - 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 - }; -})(); + this._lastInput = key; // Store exactly what was entered by the user. + // Setup parameters to be passed to store.query(). + // Create a new query to prevent accidentally querying for a hidden + // value from FilteringSelect's keyField + var query = lang.clone(this.query); // #5970 + var options = { + start: 0, + count: this.pageSize, + queryOptions: { // remove for 2.0 + ignoreCase: this.ignoreCase, + deep: true + } + }; + lang.mixin(options, this.fetchProperties); -dojo.colors.makeGrey = function(/*Number*/ g, /*Number?*/ a){ - // summary: creates a greyscale color with an optional alpha - return dojo.colorFromArray([g, g, g, a]); -}; + // Generate query + var qs = this._getQueryString(key), 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; + + // Function to run the query, wait for the results, and then call _openResultList() + var _this = this, + startQuery = function(){ + var resPromise = _this._fetchHandle = _this.store.query(query, options); + Deferred.when(resPromise, function(res){ + _this._fetchHandle = null; + res.total = resPromise.total; + _this._openResultList(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()); + _this.closeDropDown(); + } + }); + }; -// mixin all CSS3 named colors not already in _base, along with SVG 1.0 variant spellings -dojo.mixin(dojo.Color.named, { - 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] -}); + // #5970: 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.searchTimer = setTimeout(lang.hitch(this, function(query, _this){ + this.searchTimer = null; -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"); + startQuery(); -dojo.getObject("i18n", true, dojo); + // Setup method to handle clicking next/previous buttons to page through results + this._nextSearch = this.dropDown.onPage = function(direction){ + options.start += options.count * direction; + // tell callback the direction of the paging so the screen + // reader knows which menu option to shout + options.direction = direction; + startQuery(); + _this.focus(); + }; + }, query, this), this.searchDelay); + }, -/*===== -dojo.i18n = { - // summary: Utility classes to enable loading of resources for internationalization (i18n) -}; -=====*/ + _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; + }, -// when using a real AMD loader, dojo.i18n.getLocalization is already defined by dojo/lib/backCompat -dojo.i18n.getLocalization = 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; - } + //////////// INITIALIZATION METHODS /////////////////////////////////////// - // 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 - } - } + constructor: function(){ + this.query={}; + this.fetchProperties={}; + }, - throw new Error("Bundle not found: " + bundleName + " in " + packageName+" , locale=" + locale); -}; + postMixInProperties: function(){ + if(!this.store){ + var srcNodeRef = this.srcNodeRef; + var list = this.list; + if(list){ + this.store = registry.byId(list); + }else{ + // if user didn't specify store, then assume there are option tags + this.store = new DataList({}, srcNodeRef); + } -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 -}; + // 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]; + } + } + } -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. + this.inherited(arguments); + }, - 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. - //Using ["indexOf"] so customBase builds do not see - //this as a dojo._base.array dependency. - if(targetLocale["indexOf"](flatLocales[i]) == 0){ - if(flatLocales[i].length > bestLocale.length){ - bestLocale = flatLocales[i]; - } - } - } - if(!bestLocale){ - bestLocale = "ROOT"; - } - } + postCreate: function(){ + // summary: + // Subclasses must call this method from their postCreate() methods + // tags: + // protected - //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]; - } + // find any associated label element and add to ComboBox node. + var label=query('label[for="'+this.id+'"]'); + if(label.length){ + label[0].id = (this.id+"_label"); + this.domNode.setAttribute("aria-labelledby", label[0].id); - 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){ - hash = hash.root || 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; } + this.inherited(arguments); + }, - 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; + _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._escapeHtml(this._lastInput)); + labelType = "html"; } - }); - } + return {html: labelType == "html", label: label}; + }, - //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, '_')]; - } -}; + 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 -(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 + // 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 + return this._escapeHtml(label).replace( + // prepend ^ when this.queryExpr == "${0}*" and append $ when this.queryExpr == "*${0}" + new RegExp((i == 0 ? "^" : "") + "("+ find +")" + (i == (this.queryExpr.length - 4) ? "$" : ""), modifiers), + '<span class="dijitComboBoxHighlightMatch">$1</span>' + ); // returns String, (almost) valid HTML (entities encoded) + }, - var extra = dojo.config.extraLocale; - if(extra){ - if(!extra instanceof Array){ - extra = [extra]; - } + _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*/ item, /*dojo.store.api.Store*/ store){ + // summary: + // Computes the label to display based on the dojo.data store item. + // 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 + }, - 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<extra.length; i++){ - req(m,b,extra[i], availableFlatLocales); + _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){ 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); } - }; - } -})(); + } + }); +}); -dojo.i18n._searchLocalePath = function(/*String*/locale, /*Boolean*/down, /*Function*/searchFunc){ - // summary: - // A helper method to assist in searching for locale-based resources. - // Will iterate through the variants of a particular locale, either up - // or down, executing a callback function. For example, "en-us" and - // true will try "en-us" followed by "en" and finally "ROOT". +}, +'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", +'url:dijit/layout/templates/_ScrollingTabControllerButton.html':"<div data-dojo-attach-event=\"onclick:_onClick\">\n\t<div role=\"presentation\" class=\"dijitTabInnerDiv\" data-dojo-attach-point=\"innerDiv,focusNode\">\n\t\t<div role=\"presentation\" class=\"dijitTabContent dijitButtonContents\" data-dojo-attach-point=\"tabContent\">\n\t\t\t<img role=\"presentation\" alt=\"\" src=\"${_blankGif}\" class=\"dijitTabStripIcon\" data-dojo-attach-point=\"iconNode\"/>\n\t\t\t<span data-dojo-attach-point=\"containerNode,titleNode\" class=\"dijitButtonText\"></span>\n\t\t</div>\n\t</div>\n</div>", +'dijit/form/MappedTextBox':function(){ +define("dijit/form/MappedTextBox", [ + "dojo/_base/declare", // declare + "dojo/dom-construct", // domConstruct.place + "./ValidationTextBox" +], function(declare, domConstruct, ValidationTextBox){ - locale = dojo.i18n.normalizeLocale(locale); +/*===== + var ValidationTextBox = dijit.form.ValidationTextBox; +=====*/ - var elements = locale.split('-'); - var searchlist = []; - for(var i = elements.length; i > 0; i--){ - searchlist.push(elements.slice(0, i).join('-')); - } - searchlist.push(false); - if(down){searchlist.reverse();} + // module: + // dijit/form/MappedTextBox + // 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. - for(var j = searchlist.length - 1; j >= 0; j--){ - var loc = searchlist[j] || "ROOT"; - var stop = searchFunc(loc); - if(stop){ break; } - } -}; + 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 -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<localesGenerated.length;i++){ - if(localesGenerated[i] == loc){ - dojo["require"](bundlePrefix+"_"+loc); - return true; // Boolean - } - } - return false; // Boolean - }); - } - preload(); - var extra = dojo.config.extraLocale||[]; - for(var i=0; i<extra.length; i++){ - preload(extra[i]); - } -}; + 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 = ""; + }, -if(!dojo._hasResource["dijit._PaletteMixin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._PaletteMixin"] = true; -dojo.provide("dijit._PaletteMixin"); + // 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 + }, -dojo.declare("dijit._PaletteMixin", - [dijit._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. + validate: function(){ + // Overrides `dijit.form.TextBox.validate` + this.valueNode.value = this.toString(); + return this.inherited(arguments); + }, - // defaultTimeout: Number - // Number of milliseconds before a held key or button becomes typematic - defaultTimeout: 500, + buildRendering: function(){ + // Overrides `dijit._TemplatedMixin.buildRendering` - // 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, + this.inherited(arguments); - // value: String - // Currently selected color/emoticon/etc. - value: null, - - // _selectedCell: [private] Integer - // Index of the currently selected cell. Initially, none selected - _selectedCell: -1, + // 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"); + }, -/*===== - // _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, -=====*/ + reset: function(){ + // Overrides `dijit.form.ValidationTextBox.reset` to + // reset the hidden textbox value to '' + this.valueNode.value = ''; + this.inherited(arguments); + } + }); +}); -/*===== - // _xDim: [protected] Integer - // This is the number of cells horizontally across. - _xDim: null, -=====*/ +}, +'dijit/form/ComboBoxMixin':function(){ +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=\"presentation\"\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", // dojo.store.util.QueryResults + "./_AutoCompleterMixin", + "./_ComboBoxMenu", + "../_HasDropDown", + "dojo/text!./templates/DropDownBox.html" +], function(declare, Deferred, kernel, lang, QueryResults, _AutoCompleterMixin, _ComboBoxMenu, _HasDropDown, template){ /*===== - // _yDim: [protected] Integer - // This is the number of cells vertically down. - _yDim: null, + var _AutoCompleterMixin = dijit.form._AutoCompleterMixin; + var _ComboBoxMenu = dijit.form._ComboBoxMenu; + var _HasDropDown = dijit._HasDropDown; =====*/ - // tabIndex: String - // Widget tab index. - tabIndex: "0", + // module: + // dijit/form/ComboBoxMixin + // summary: + // Provides main functionality of ComboBox widget - // cellClass: [protected] String - // CSS class applied to each cell in the palette - cellClass: "dijitPaletteCell", + return declare("dijit.form.ComboBoxMixin", [_HasDropDown, _AutoCompleterMixin], { + // summary: + // Provides main functionality of ComboBox widget - // dyeClass: [protected] String - // Name of javascript class for Object created for each cell of the palette. - // dyeClass should implements dijit.Dye interface - dyeClass: '', + // dropDownClass: [protected extension] Function String + // Dropdown widget class used to select a date/time. + // Subclasses should specify this. + dropDownClass: _ComboBoxMenu, - _preparePalette: function(choices, titles, dyeClassObj) { - // 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 - // dyeClassObj: Constructor? - // If specified, use this constructor rather than this.dyeClass + // hasDownArrow: Boolean + // Set this textbox to have a down arrow button, to display the drop down list. + // Defaults to true. + hasDownArrow: true, - this._cells = []; - var url = this._blankGif; - - dyeClassObj = dyeClassObj || dojo.getObject(this.dyeClass); + templateString: template, - for(var row=0; row < choices.length; row++){ - var rowNode = dojo.create("tr", {tabIndex: "-1"}, this.gridNode); - for(var col=0; col < choices[row].length; col++){ - var value = choices[row][col]; - if(value){ - var cellObject = new dyeClassObj(value, row, col); - - var cellNode = dojo.create("td", { - "class": this.cellClass, - tabIndex: "-1", - title: titles[value] - }); + baseClass: "dijitTextBox dijitComboBox", - // prepare cell inner structure - cellObject.fillCell(cellNode, url); + /*===== + // 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, + =====*/ - this.connect(cellNode, "ondijitclick", "_onCellClick"); - this._trackMouseState(cellNode, this.cellClass); + // Set classes like dijitDownArrowButtonHover depending on + // mouse action over button node + cssStateNodes: { + "_buttonNode": "dijitDownArrowButton" + }, - dojo.place(cellNode, rowNode); + _setHasDownArrowAttr: function(/*Boolean*/ val){ + this._set("hasDownArrow", val); + this._buttonNode.style.display = val ? "" : "none"; + }, - cellNode.index = this._cells.length; + _showResultList: function(){ + // hide the tooltip + this.displayMessage(""); + this.inherited(arguments); + }, - // save cell info into _cells - this._cells.push({node:cellNode, dye:cellObject}); - } + _setStoreAttr: function(store){ + // 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(){ fetchHandle.abort && fetchHandle.abort(); }); + var fetchHandle = this.fetch(lang.mixin({ + query: query, + onBegin: function(count){ + deferred.total = count; + }, + onComplete: function(results){ + deferred.resolve(results); + }, + onError: function(error){ + deferred.reject(error); + } + }, options)); + return QueryResults(deferred); + } + }); } - } - this._xDim = choices[0].length; - this._yDim = choices.length; + this._set("store", store); + }, - // 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. + postMixInProperties: function(){ + // Since _setValueAttr() depends on this.store, _setStoreAttr() needs to execute first. + // Unfortunately, without special code, it ends up executing second. + if(this.params.store){ + this._setStoreAttr(this.params.store); + } - 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._connects.push( - dijit.typematic.addKeyListener( - this.domNode, - {charOrCode: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 - ) - ); + 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){ + 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); + })); + } + }); + } } - }, + }); +}); - postCreate: function(){ - this.inherited(arguments); +}, +'dijit/form/_TextBoxMixin':function(){ +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 + ".." // for exporting dijit._setSelectionRange, dijit.selectInputText +], function(array, declare, dom, event, keys, lang, dijit){ + +// module: +// dijit/form/_TextBoxMixin +// summary: +// A mixin for textbox form input widgets - // Set initial navigable node. - this._setCurrent(this._cells[0].node); - }, +var _TextBoxMixin = declare("dijit.form._TextBoxMixin", null, { + // summary: + // A mixin for textbox form input widgets - focus: function(){ - // summary: - // Focus this widget. Puts focus on the most recently focused cell. + // trim: Boolean + // Removes leading and trailing whitespace if true. Default is false. + trim: false, - // The cell already has tabIndex set, just need to set CSS and focus it - dijit.focus(this._currentFocus); - }, + // uppercase: Boolean + // Converts all characters to uppercase if true. Default is false. + uppercase: false, - _onCellClick: function(/*Event*/ evt){ - // summary: - // Handler for click, enter key & space key. Selects the cell. - // evt: - // The event. - // tags: - // private + // lowercase: Boolean + // Converts all characters to lowercase if true. Default is false. + lowercase: false, - var target = evt.currentTarget, - value = this._getDye(target).getValue(); + // propercase: Boolean + // Converts the first character of each word to uppercase if true. + propercase: false, - // 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. - // Use setTimeout because IE doesn't like changing focus inside of an event handler. - this._setCurrent(target); - setTimeout(dojo.hitch(this, function(){ - dijit.focus(target); - this._setValueAttr(value, true); - })); + // maxLength: String + // HTML INPUT tag maxLength declaration. + maxLength: "", + + // selectOnClick: [const] Boolean + // If true, all text will be selected when focused with mouse + selectOnClick: false, - // workaround bug where hover class is not removed on popup because the popup is - // closed and then there's no onblur event on the cell - dojo.removeClass(target, "dijitPaletteCellHover"); + // 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: "", - dojo.stopEvent(evt); + _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); }, - _setCurrent: function(/*DomNode*/ node){ + _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ // summary: - // Sets which node is the focused cell. + // Hook so set('value', ...) works. + // // 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. + // Sets the value of the widget to "value" which can be of + // any type as determined by the widget. // - // 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 - dojo.attr(this._currentFocus, "tabIndex", "-1"); + // 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 && formattedValue != undefined && ((typeof formattedValue) != "number" || !isNaN(formattedValue)) && this.textbox.value != formattedValue){ + this.textbox.value = formattedValue; + this._set("displayedValue", this.get("displayedValue")); } - // Set tabIndex of new cell - this._currentFocus = node; - if(node){ - dojo.attr(node, "tabIndex", this.tabIndex); + if(this.textDir == "auto"){ + this.applyTextDir(this.focusNode, formattedValue); } + + this.inherited(arguments, [filteredValue, priorityChange]); }, - _setValueAttr: function(value, 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: - // This selects a cell. It triggers the onChange event. - // value: String value of the cell to select - // tags: - // protected - // priorityChange: - // Optional parameter used to tell the select whether or not to fire - // onChange event. - - // clear old selected cell - if(this._selectedCell >= 0){ - dojo.removeClass(this._cells[this._selectedCell].node, "dijitPaletteCellSelected"); - } - this._selectedCell = -1; + // 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) - // 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; - dojo.addClass(this._cells[i].node, "dijitPaletteCellSelected"); - break; - } - } - } - - // record new value, or null if no matching cell - this._set("value", this._selectedCell >= 0 ? value : null); + // 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); + }, - if(priorityChange || priorityChange === undefined){ - this.onChange(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 || value === 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); } }, - onChange: function(value){ + format: function(value /*=====, constraints =====*/){ // summary: - // Callback when a cell is selected. + // Replaceable function to convert a value to a properly formatted string. // value: String - // Value corresponding to cell. + // constraints: Object + // tags: + // protected extension + return ((value == null || value == undefined) ? "" : (value.toString ? value.toString() : value)); }, - _navigateByKey: function(increment, typeCount){ + parse: function(value /*=====, constraints =====*/){ // 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. + // Replaceable function to convert a formatted string to a value + // value: String + // constraints: Object // tags: - // private + // protected extension - // typecount == -1 means the key is released. - if(typeCount == -1){ return; } + return value; // String + }, - var newFocusIndex = this._currentFocus.index + increment; - if(newFocusIndex < this._cells.length && newFocusIndex > -1){ - var focusNode = this._cells[newFocusIndex].node; - this._setCurrent(focusNode); + _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 + }, - // Actually focus the node, for the benefit of screen readers. - // Use setTimeout because IE doesn't like changing focus inside of an event handler - setTimeout(dojo.hitch(dijit, "focus", focusNode), 0); - } + /*===== + 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(){}, - _getDye: function(/*DomNode*/ cell){ + __skipInputEvent: false, + _onInput: function(){ // summary: - // Get JS object for given cell DOMNode + // 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); + } - return this._cells[cell.index].dye; - } -}); + this._refreshState(); -/*===== -dojo.declare("dijit.Dye", - null, - { + // 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 charCode = e.charOrCode || e.keyCode || 229; + if(e.type == "keydown"){ + switch(charCode){ // ignore "state" keys + case keys.SHIFT: + case keys.ALT: + case keys.CTRL: + case keys.META: + case keys.CAPS_LOCK: + return; + default: + if(charCode >= 65 && charCode <= 90){ return; } // keydown for A-Z can be processed with keypress + } + } + if(e.type == "keypress" && typeof charCode != "string"){ return; } + 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 = lang.mixin({}, e, { + charOrCode: charCode, + wasConsumed: false, + preventDefault: function(){ + faux.wasConsumed = true; + e.preventDefault(); + }, + stopPropagation: function(){ e.stopPropagation(); } + }); + // give web page author a chance to consume the event + if(this.onInput(faux) === false){ + event.stop(faux); // return false means stop + } + if(faux.wasConsumed){ return; } // if preventDefault was called + setTimeout(lang.hitch(this, "_onInput", faux), 0); // widget notification after key has posted + }; + array.forEach([ "onkeydown", "onkeypress", "onpaste", "oncut", "oninput", "oncompositionend" ], function(event){ + this.connect(this.textbox, event, handleEvent); + }, this); + }, + + _blankValue: '', // if the textbox is blank, what value should be reported + filter: function(val){ // summary: - // Interface for the JS Object associated with a palette cell (i.e. DOMNode) + // 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; + }, - constructor: function(alias, row, col){ - // summary: - // Initialize according to value or alias like "white" - // alias: String - }, + _setBlurValue: function(){ + this._setValueAttr(this.get('value'), true); + }, - 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. - }, + _onBlur: function(e){ + if(this.disabled){ return; } + this._setBlurValue(); + this.inherited(arguments); - fillCell: function(cell, blankGif){ - // summary: - // Add cell DOMNode inner structure - // cell: DomNode - // The surrounding cell - // blankGif: String - // URL for blank cell image + if(this._selectOnClickHandle){ + this.disconnect(this._selectOnClickHandle); } - } -); -=====*/ + }, -} + _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); + + // 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); + } + }); + } + // 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(); + }, -if(!dojo._hasResource["dijit.ColorPalette"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.ColorPalette"] = true; -dojo.provide("dijit.ColorPalette"); + 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; +}); +}, +'dijit/form/SimpleTextarea':function(){ +define("dijit/form/SimpleTextarea", [ + "dojo/_base/declare", // declare + "dojo/dom-class", // domClass.add + "dojo/_base/sniff", // has("ie") has("opera") + "dojo/_base/window", // win.doc.selection win.doc.selection.createRange + "./TextBox" +], function(declare, domClass, has, win, TextBox){ +/*===== + var TextBox = dijit.form.TextBox; +=====*/ +// module: +// dijit/form/SimpleTextarea +// 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. -dojo.declare("dijit.ColorPalette", - [dijit._Widget, dijit._Templated, dijit._PaletteMixin], - { +return declare("dijit.form.SimpleTextarea", TextBox, { // 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. + // 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: - // | <div dojoType="dijit.ColorPalette"></div> + // | <textarea data-dojo-type="dijit.form.SimpleTextarea" name="foo" value="bar" rows=30 cols=40></textarea> // // example: - // | var picker = new dijit.ColorPalette({ },srcNode); - // | picker.startup(); - + // | new dijit.form.SimpleTextarea({ rows:20, cols:30 }, "foo"); - // palette: [const] String - // Size of grid, either "7x10" or "3x4". - palette: "7x10", + baseClass: "dijitTextBox dijitTextArea", - // _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"]], + // rows: Number + // The number of rows of text. + rows: "3", - "3x4": [["white", "lime", "green", "blue"], - ["silver", "yellow", "fuchsia", "navy"], - ["gray", "red", "purple", "black"]] - }, + // rows: Number + // The number of characters per line. + cols: "20", - // templateString: String - // The template of this widget. - templateString: dojo.cache("dijit", "templates/ColorPalette.html", "<div class=\"dijitInline dijitColorPalette\">\n\t<table class=\"dijitPaletteTable\" cellSpacing=\"0\" cellPadding=\"0\">\n\t\t<tbody dojoAttachPoint=\"gridNode\"></tbody>\n\t</table>\n</div>\n"), + templateString: "<textarea ${!nameAttrSetting} data-dojo-attach-point='focusNode,containerNode,textbox' autocomplete='off'></textarea>", - baseClass: "dijitColorPalette", + 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(){ - // Instantiate the template, which makes a skeleton into which we'll insert a bunch of - // <img> nodes this.inherited(arguments); + if(has("ie") && this.cols){ // attribute selectors is not supported in IE6 + domClass.add(this.textbox, "dijitTextAreaCols"); + } + }, - // Creates <img> nodes in each cell of the template. - // Pass in "customized" dijit._Color constructor for specified palette and high-contrast vs. normal mode - this._preparePalette( - this._palettes[this.palette], - dojo.i18n.getLocalization("dojo", "colors", this.lang), - dojo.declare(dijit._Color, { - hc: dojo.hasClass(dojo.body(), "dijit_a11y"), - palette: this.palette - }) - ); + 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(win.doc.selection){ //IE + textarea.focus(); + var range = win.doc.selection.createRange(); + // delete overflow characters + range.moveStart("character", -overflow); + range.text = ''; + // show cursor + range.select(); + } + } + } + this.inherited(arguments); } }); -dojo.declare("dijit._Color", dojo.Color, { +}); + +}, +'url:dijit/layout/templates/_TabButton.html':"<div role=\"presentation\" data-dojo-attach-point=\"titleNode\" data-dojo-attach-event='onclick:onClick'>\n <div role=\"presentation\" class='dijitTabInnerDiv' data-dojo-attach-point='innerDiv'>\n <div role=\"presentation\" class='dijitTabContent' data-dojo-attach-point='tabContent'>\n \t<div role=\"presentation\" data-dojo-attach-point='focusNode'>\n\t\t <img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitTabButtonIcon\" data-dojo-attach-point='iconNode' />\n\t\t <span data-dojo-attach-point='containerNode' class='tabLabel'></span>\n\t\t <span class=\"dijitInline dijitTabCloseButton dijitTabCloseIcon\" data-dojo-attach-point='closeNode'\n\t\t \t\tdata-dojo-attach-event='onclick: onClickCloseButton' role=\"presentation\">\n\t\t <span data-dojo-attach-point='closeText' class='dijitTabCloseText'>[x]</span\n\t\t ></span>\n\t\t\t</div>\n </div>\n </div>\n</div>\n", +'dijit/_base/window':function(){ +define("dijit/_base/window", [ + "dojo/window", // windowUtils.get + ".." // export symbol to dijit +], function(windowUtils, dijit){ + // module: + // dijit/_base/window // summary: - // Object associated with each cell in a ColorPalette palette. - // Implements dijit.Dye. + // Back compatibility module, new code should use windowUtils directly instead of using this module. - // 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}' class='dijitColorPaletteSwatch' style='background-color: ${color}'/>" + - "</span>", + dijit.getDocumentWindow = function(doc){ + return windowUtils.get(doc); + }; +}); - // 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}' style='position: absolute; left: ${left}px; top: ${top}px; ${size}'/>" + - "</span>", +}, +'dijit/form/RadioButton':function(){ +define("dijit/form/RadioButton", [ + "dojo/_base/declare", // declare + "./CheckBox", + "./_RadioButtonMixin" +], function(declare, CheckBox, _RadioButtonMixin){ - // _imagePaths: [protected] Map - // This is stores the path to the palette images used for high-contrast mode display - _imagePaths: { - "7x10": dojo.moduleUrl("dijit.themes", "a11y/colors7x10.png"), - "3x4": dojo.moduleUrl("dijit.themes", "a11y/colors3x4.png") - }, +/*===== + var CheckBox = dijit.form.CheckBox; + var _RadioButtonMixin = dijit.form._RadioButtonMixin; +=====*/ - constructor: function(/*String*/alias, /*Number*/ row, /*Number*/ col){ - this._alias = alias; - this._row = row; - this._col = col; - this.setColor(dojo.Color.named[alias]); - }, + // module: + // dijit/form/RadioButton + // summary: + // Radio button widget - getValue: function(){ + return declare("dijit.form.RadioButton", [CheckBox, _RadioButtonMixin], { // 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 = dojo.string.substitute(this.hc ? this.hcTemplate : this.template, { - // substitution variables for normal mode - color: this.toHex(), - blankGif: blankGif, - alt: this._alias, - - // 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" - }); + // Same as an HTML radio, but with fancy styling. - dojo.place(html, cell); - } + baseClass: "dijitRadio" + }); }); -} - -if(!dojo._hasResource["dojo.dnd.common"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.dnd.common"] = true; -dojo.provide("dojo.dnd.common"); - -dojo.getObject("dnd", true, dojo); - -dojo.dnd.getCopyKeyState = dojo.isCopyKey; - -dojo.dnd._uniqueId = 0; -dojo.dnd.getUniqueId = function(){ +}, +'dijit/main':function(){ +define("dijit/main", [ + "dojo/_base/kernel" +], function(dojo){ + // module: + // dijit // summary: - // returns a unique string for use with any DOM element - var id; - do{ - id = dojo._scopeName + "Unique" + (++dojo.dnd._uniqueId); - }while(dojo.byId(id)); - return id; -}; + // The dijit package main module -dojo.dnd._empty = {}; + return dojo.dijit; +}); -dojo.dnd.isFormElement = function(/*Event*/ e){ +}, +'dijit/_OnDijitClickMixin':function(){ +define("dijit/_OnDijitClickMixin", [ + "dojo/on", + "dojo/_base/array", // array.forEach + "dojo/keys", // keys.ENTER keys.SPACE + "dojo/_base/declare", // declare + "dojo/_base/sniff", // has("ie") + "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/_OnDijitClickMixin // summary: - // returns true if user clicked on a form element - var t = e.target; - if(t.nodeType == 3 /*TEXT_NODE*/){ - t = t.parentNode; + // Mixin so you can pass "ondijitclick" to this.connect() method, + // as a way to handle clicks by mouse, or by keyboard (SPACE/ENTER key) + + + // 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("ie")){ + (function(){ + var keydownCallback = function(evt){ + lastKeyDownNode = evt.srcElement; + }; + win.doc.attachEvent('onkeydown', keydownCallback); + unload.addOnWindowUnload(function(){ + win.doc.detachEvent('onkeydown', keydownCallback); + }); + })(); + }else{ + win.doc.addEventListener('keydown', function(evt){ + lastKeyDownNode = evt.target; + }, true); } - return " button textarea input select option ".indexOf(" " + t.tagName.toLowerCase() + " ") >= 0; // Boolean -}; -} + // Custom a11yclick (a.k.a. ondijitclick) event + var a11yclick = function(node, listener){ + 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. + + function clickKey(/*Event*/ e){ + return (e.keyCode == keys.ENTER || e.keyCode == keys.SPACE) && + !e.ctrlKey && !e.shiftKey && !e.altKey && !e.metaKey; + } + var handles = [ + on(node, "keypress", 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) + // Do this onkeypress rather than onkeydown because onkeydown.preventDefault() will + // suppress the onkeypress event, breaking _HasDropDown + e.preventDefault(); + } + }), -if(!dojo._hasResource["dojo.dnd.autoscroll"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.dnd.autoscroll"] = true; -dojo.provide("dojo.dnd.autoscroll"); + 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; + listener.call(this, e); + } + }), + on(node, "click", function(e){ + // and connect for mouse clicks too (or touch-clicks on mobile) + listener.call(this, e); + }) + ]; -dojo.getObject("dnd", true, dojo); + return { + remove: function(){ + array.forEach(handles, function(h){ h.remove(); }); + } + }; + } + }; -dojo.dnd.getViewport = dojo.window.getBox; + return 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 dijit.form.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 -dojo.dnd.V_TRIGGER_AUTOSCROLL = 32; -dojo.dnd.H_TRIGGER_AUTOSCROLL = 32; + return this.inherited(arguments, [obj, event == "ondijitclick" ? a11yclick : event, method]); + } + }); +}); -dojo.dnd.V_AUTOSCROLL_VALUE = 16; -dojo.dnd.H_AUTOSCROLL_VALUE = 16; +}, +'dijit/InlineEditBox':function(){ +require({cache:{ +'url:dijit/templates/InlineEditBox.html':"<span data-dojo-attach-point=\"editNode\" role=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\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", [ + "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/_base/sniff", // has("ie") + "./focus", + "./_Widget", + "./_TemplatedMixin", + "./_WidgetsInTemplateMixin", + "./_Container", + "./form/Button", + "./form/_TextBoxMixin", + "./form/TextBox", + "dojo/text!./templates/InlineEditBox.html", + "dojo/i18n!./nls/common" +], function(array, declare, domAttr, domClass, domConstruct, domStyle, event, i18n, kernel, keys, lang, has, + fm, _Widget, _TemplatedMixin, _WidgetsInTemplateMixin, _Container, Button, _TextBoxMixin, TextBox, template){ -dojo.dnd.autoScroll = function(e){ +/*===== + var _Widget = dijit._Widget; + var _TemplatedMixin = dijit._TemplatedMixin; + var _WidgetsInTemplateMixin = dijit._WidgetsInTemplateMixin; + var _Container = dijit._Container; + var Button = dijit.form.Button; + var TextBox = dijit.form.TextBox; +=====*/ + +// module: +// dijit/InlineEditBox +// summary: +// An element with in-line edit capabilities + +var InlineEditor = declare("dijit._InlineEditor", [_Widget, _TemplatedMixin, _WidgetsInTemplateMixin], { // summary: - // a handler for onmousemove event, which scrolls the window, if - // necesary - // e: Event - // onmousemove event + // 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 - // FIXME: needs more docs! - var v = dojo.window.getBox(), dx = 0, dy = 0; - if(e.clientX < dojo.dnd.H_TRIGGER_AUTOSCROLL){ - dx = -dojo.dnd.H_AUTOSCROLL_VALUE; - }else if(e.clientX > v.w - dojo.dnd.H_TRIGGER_AUTOSCROLL){ - dx = dojo.dnd.H_AUTOSCROLL_VALUE; - } - if(e.clientY < dojo.dnd.V_TRIGGER_AUTOSCROLL){ - dy = -dojo.dnd.V_AUTOSCROLL_VALUE; - }else if(e.clientY > v.h - dojo.dnd.V_TRIGGER_AUTOSCROLL){ - dy = dojo.dnd.V_AUTOSCROLL_VALUE; - } - window.scrollBy(dx, dy); -}; + templateString: template, -dojo.dnd._validNodes = {"div": 1, "p": 1, "td": 1}; -dojo.dnd._validOverflow = {"auto": 1, "scroll": 1}; + 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); + }, -dojo.dnd.autoScrollNodes = function(e){ - // summary: - // a handler for onmousemove event, which scrolls the first avaialble - // Dom element, it falls back to dojo.dnd.autoScroll() - // e: Event - // onmousemove event + buildRendering: function(){ + this.inherited(arguments); - // FIXME: needs more docs! - for(var n = e.target; n;){ - if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){ - var s = dojo.getComputedStyle(n); - if(s.overflow.toLowerCase() in dojo.dnd._validOverflow){ - var b = dojo._getContentBox(n, s), t = dojo.position(n, true); - //console.log(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop); - var w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2), - h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2), - rx = e.pageX - t.x, ry = e.pageY - t.y, dx = 0, dy = 0; - if(dojo.isWebKit || dojo.isOpera){ - // FIXME: this code should not be here, it should be taken into account - // either by the event fixing code, or the dojo.position() - // FIXME: this code doesn't work on Opera 9.5 Beta - rx += dojo.body().scrollLeft; - ry += dojo.body().scrollTop; - } - if(rx > 0 && rx < b.w){ - if(rx < w){ - dx = -w; - }else if(rx > b.w - w){ - dx = w; - } - } - //console.log("ry =", ry, "b.h =", b.h, "h =", h); - if(ry > 0 && ry < b.h){ - if(ry < h){ - dy = -h; - }else if(ry > b.h - h){ - dy = h; - } - } - var oldLeft = n.scrollLeft, oldTop = n.scrollTop; - n.scrollLeft = n.scrollLeft + dx; - n.scrollTop = n.scrollTop + dy; - if(oldLeft != n.scrollLeft || oldTop != n.scrollTop){ return; } + // Create edit widget in place in the template + var cls = typeof this.editor == "string" ? lang.getObject(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"], 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" : "")) + ";"; } - try{ - n = n.parentNode; - }catch(x){ - n = null; + 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); } - } - dojo.dnd.autoScroll(e); -}; + }, -} + postCreate: function(){ + this.inherited(arguments); -if(!dojo._hasResource["dojo.dnd.Mover"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.dnd.Mover"] = true; -dojo.provide("dojo.dnd.Mover"); + 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); + } + } + }, + _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); + }, -dojo.declare("dojo.dnd.Mover", null, { - constructor: function(node, e, host){ + getValue: function(){ // summary: - // an object which makes a node follow the mouse, or touch-drag on touch devices. - // Used as a default mover, and as a base class for custom movers. - // node: Node - // a node (or node's id) to be moved - // e: Event - // a mouse event, which started the move; - // only pageX and pageY properties are used - // host: Object? - // object which implements the functionality of the move, - // and defines proper events (onMoveStart and onMoveStop) - this.node = dojo.byId(node); - var pos = e.touches ? e.touches[0] : e; - this.marginBox = {l: pos.pageX, t: pos.pageY}; - this.mouseButton = e.button; - var h = (this.host = host), d = node.ownerDocument; - this.events = [ - // At the start of a drag, onFirstMove is called, and then the following two - // connects are disconnected - dojo.connect(d, "onmousemove", this, "onFirstMove"), - dojo.connect(d, "ontouchmove", this, "onFirstMove"), + // Return the [display] value of the edit widget + var ew = this.editWidget; + return String(ew.get("displayedValue" in ew ? "displayedValue" : "value")); + }, - // These are called continually during the drag - dojo.connect(d, "onmousemove", this, "onMouseMove"), - dojo.connect(d, "ontouchmove", this, "onMouseMove"), + _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 - // And these are called at the end of the drag - dojo.connect(d, "onmouseup", this, "onMouseUp"), - dojo.connect(d, "ontouchend", this, "onMouseUp"), + 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 + } - // cancel text selection and text dragging - dojo.connect(d, "ondragstart", dojo.stopEvent), - dojo.connect(d.body, "onselectstart", dojo.stopEvent) - ]; - // notify that the move has started - if(h && h.onMoveStart){ - h.onMoveStart(this); + // _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. } }, - // mouse event processors - onMouseMove: function(e){ + + _onBlur: function(){ // summary: - // event processor for onmousemove/ontouchmove - // e: Event - // mouse/touch event - dojo.dnd.autoScroll(e); - var m = this.marginBox, - pos = e.touches ? e.touches[0] : e; - this.host.onMove(this, {l: m.l + pos.pageX, t: m.t + pos.pageY}, e); - dojo.stopEvent(e); - }, - onMouseUp: function(e){ - if(dojo.isWebKit && dojo.isMac && this.mouseButton == 2 ? - e.button == 0 : this.mouseButton == e.button){ // TODO Should condition be met for touch devices, too? - this.destroy(); + // 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); + } } - dojo.stopEvent(e); }, - // utilities - onFirstMove: function(e){ + + _onChange: function(){ // summary: - // makes the node absolute; it is meant to be called only once. - // relative and absolutely positioned nodes are assumed to use pixel units - var s = this.node.style, l, t, h = this.host; - switch(s.position){ - case "relative": - case "absolute": - // assume that left and top values are in pixels already - l = Math.round(parseFloat(s.left)) || 0; - t = Math.round(parseFloat(s.top)) || 0; - break; - default: - s.position = "absolute"; // enforcing the absolute mode - var m = dojo.marginBox(this.node); - // event.pageX/pageY (which we used to generate the initial - // margin box) includes padding and margin set on the body. - // However, setting the node's position to absolute and then - // doing dojo.marginBox on it *doesn't* take that additional - // space into account - so we need to subtract the combined - // padding and margin. We use getComputedStyle and - // _getMarginBox/_getContentBox to avoid the extra lookup of - // the computed style. - var b = dojo.doc.body; - var bs = dojo.getComputedStyle(b); - var bm = dojo._getMarginBox(b, bs); - var bc = dojo._getContentBox(b, bs); - l = m.l - (bc.l - bm.l); - t = m.t - (bc.t - bm.t); - break; - } - this.marginBox.l = l - this.marginBox.l; - this.marginBox.t = t - this.marginBox.t; - if(h && h.onFirstMove){ - h.onFirstMove(this, e); + // 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 } - - // Disconnect onmousemove and ontouchmove events that call this function - dojo.disconnect(this.events.shift()); - dojo.disconnect(this.events.shift()); }, - destroy: function(){ - // summary: - // stops the move, deletes all references, so the object can be garbage-collected - dojo.forEach(this.events, dojo.disconnect); - // undo global settings - var h = this.host; - if(h && h.onMoveStop){ - h.onMoveStop(this); - } - // destroy objects - this.events = this.node = this.host = null; - } -}); -} + 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 + ); + }, -if(!dojo._hasResource["dojo.dnd.Moveable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.dnd.Moveable"] = true; -dojo.provide("dojo.dnd.Moveable"); + focus: function(){ + // summary: + // Focus the edit widget. + // tags: + // protected + this.editWidget.focus(); + setTimeout(lang.hitch(this, function(){ + if(this.editWidget.focusNode && this.editWidget.focusNode.tagName == "INPUT"){ + _TextBoxMixin.selectInputText(this.editWidget.focusNode); + } + }), 0); + } +}); -/*===== -dojo.declare("dojo.dnd.__MoveableArgs", [], { - // handle: Node||String - // A node (or node's id), which is used as a mouse handle. - // If omitted, the node itself is used as a handle. - handle: null, +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 - // delay: Number - // delay move by this number of pixels - delay: 0, + // editing: [readonly] Boolean + // Is the node currently in edit mode? + editing: false, - // skip: Boolean - // skip move of form elements - skip: 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, - // mover: Object - // a constructor of custom Mover - mover: dojo.dnd.Mover -}); -=====*/ + // buttonSave: String + // Save button label + buttonSave: "", -dojo.declare("dojo.dnd.Moveable", null, { - // object attributes (for markup) - handle: "", - delay: 0, - skip: false, - - constructor: function(node, params){ + // 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 + // Class name (or reference to the Class) 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: - // an object, which makes a node moveable - // node: Node - // a node (or node's id) to be moved - // params: dojo.dnd.__MoveableArgs? - // optional parameters - this.node = dojo.byId(node); - if(!params){ params = {}; } - this.handle = params.handle ? dojo.byId(params.handle) : null; - if(!this.handle){ this.handle = this.node; } - this.delay = params.delay > 0 ? params.delay : 0; - this.skip = params.skip; - this.mover = params.mover ? params.mover : dojo.dnd.Mover; - this.events = [ - dojo.connect(this.handle, "onmousedown", this, "onMouseDown"), - dojo.connect(this.handle, "ontouchstart", this, "onMouseDown"), - // cancel text selection and text dragging - dojo.connect(this.handle, "ondragstart", this, "onSelectStart"), - dojo.connect(this.handle, "onselectstart", this, "onSelectStart") - ]; + // Set this handler to be notified of changes to value. + // tags: + // callback }, - // markup methods - markupFactory: function(params, node){ - return new dojo.dnd.Moveable(node, params); + onCancel: function(){ + // summary: + // Set this handler to be notified when editing is cancelled. + // tags: + // callback }, - // methods - destroy: function(){ + // 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(){ // summary: - // stops watching for possible move, deletes all references, so the object can be garbage-collected - dojo.forEach(this.events, dojo.disconnect); - this.events = this.node = this.handle = null; + // Sets up private arrays etc. + // tags: + // private + this.editorParams = {}; }, - - // mouse event processors - onMouseDown: function(e){ - // summary: - // event processor for onmousedown/ontouchstart, creates a Mover for the node - // e: Event - // mouse/touch event - if(this.skip && dojo.dnd.isFormElement(e)){ return; } - if(this.delay){ - this.events.push( - dojo.connect(this.handle, "onmousemove", this, "onMouseMove"), - dojo.connect(this.handle, "ontouchmove", this, "onMouseMove"), - dojo.connect(this.handle, "onmouseup", this, "onMouseUp"), - dojo.connect(this.handle, "ontouchend", this, "onMouseUp") - ); - var pos = e.touches ? e.touches[0] : e; - this._lastX = pos.pageX; - this._lastY = pos.pageY; - }else{ - this.onDragDetected(e); + + 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]); } - dojo.stopEvent(e); - }, - onMouseMove: function(e){ - // summary: - // event processor for onmousemove/ontouchmove, used only for delayed drags - // e: Event - // mouse/touch event - var pos = e.touches ? e.touches[0] : e; - if(Math.abs(pos.pageX - this._lastX) > this.delay || Math.abs(pos.pageY - this._lastY) > this.delay){ - this.onMouseUp(e); - this.onDragDetected(e); + this.displayNode.setAttribute("role", "button"); + if(!this.displayNode.getAttribute("tabIndex")){ + this.displayNode.setAttribute("tabIndex", 0); } - dojo.stopEvent(e); - }, - onMouseUp: function(e){ - // summary: - // event processor for onmouseup, used only for delayed drags - // e: Event - // mouse event - for(var i = 0; i < 2; ++i){ - dojo.disconnect(this.events.pop()); + + 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||"")); } - dojo.stopEvent(e); - }, - onSelectStart: function(e){ - // summary: - // event processor for onselectevent and ondragevent - // e: Event - // mouse event - if(!this.skip || !dojo.dnd.isFormElement(e)){ - dojo.stopEvent(e); + if(!this.value){ + this.displayNode.innerHTML = this.noValueIndicator; } + + domClass.add(this.displayNode, 'dijitInlineEditBoxDisplayMode'); }, - - // local events - onDragDetected: function(/* Event */ e){ + + setDisabled: function(/*Boolean*/ disabled){ // summary: - // called when the drag is detected; - // responsible for creation of the mover - new this.mover(this.node, e, this); + // 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); }, - onMoveStart: function(/* dojo.dnd.Mover */ mover){ + + _setDisabledAttr: function(/*Boolean*/ disabled){ // summary: - // called before every move operation - dojo.publish("/dnd/move/start", [mover]); - dojo.addClass(dojo.body(), "dojoMove"); - dojo.addClass(this.node, "dojoMoveItem"); + // Hook to make set("disabled", ...) work. + // Set disabled state of widget. + this.domNode.setAttribute("aria-disabled", disabled); + if(disabled){ + this.displayNode.removeAttribute("tabIndex"); + }else{ + this.displayNode.setAttribute("tabIndex", 0); + } + domClass.toggle(this.displayNode, "dijitInlineEditBoxDisplayModeDisabled", disabled); + this._set("disabled", disabled); }, - onMoveStop: function(/* dojo.dnd.Mover */ mover){ + + _onMouseOver: function(){ // summary: - // called after every move operation - dojo.publish("/dnd/move/stop", [mover]); - dojo.removeClass(dojo.body(), "dojoMove"); - dojo.removeClass(this.node, "dojoMoveItem"); + // Handler for onmouseover and onfocus event. + // tags: + // private + if(!this.disabled){ + domClass.add(this.displayNode, "dijitInlineEditBoxDisplayModeHover"); + } }, - onFirstMove: function(/* dojo.dnd.Mover */ mover, /* Event */ e){ + + _onMouseOut: function(){ // summary: - // called during the very first move notification; - // can be used to initialize coordinates, can be overwritten. - - // default implementation does nothing + // Handler for onmouseout and onblur event. + // tags: + // private + domClass.remove(this.displayNode, "dijitInlineEditBoxDisplayModeHover"); }, - onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop, /* Event */ e){ + + _onClick: function(/*Event*/ e){ // summary: - // called during every move notification; - // should actually move the node; can be overwritten. - this.onMoving(mover, leftTop); - var s = mover.node.style; - s.left = leftTop.l + "px"; - s.top = leftTop.t + "px"; - this.onMoved(mover, leftTop); + // 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... + setTimeout(lang.hitch(this, "edit"), 0); }, - onMoving: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){ + + edit: function(){ // summary: - // called before every incremental move; can be overwritten. - - // default implementation does nothing - }, - onMoved: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){ - // summary: - // called after every incremental move; can be overwritten. - - // default implementation does nothing - } -}); - -} + // Display the editor widget in place of the original (read only) markup. + // tags: + // private -if(!dojo._hasResource["dojo.dnd.move"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.dnd.move"] = true; -dojo.provide("dojo.dnd.move"); + if(this.disabled || this.editing){ return; } + this._set('editing', true); + // save some display node values that can be restored later + this._savedPosition = domStyle.get(this.displayNode, "position") || "static"; + this._savedOpacity = domStyle.get(this.displayNode, "opacity") || "1"; + 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._started){ + this.startup(); + } + } + var ww = this.wrapperWidget; -/*===== -dojo.declare("dojo.dnd.move.__constrainedMoveableArgs", [dojo.dnd.__MoveableArgs], { - // constraints: Function - // Calculates a constraint box. - // It is called in a context of the moveable object. - constraints: function(){}, + // 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 + // visiblity:hidden removes focus outline - // within: Boolean - // restrict move within boundaries. - within: false -}); -=====*/ + domStyle.set(this.displayNode, { position: "absolute", opacity: "0" }); // makes display node invisible, display style used for focus-ability + domStyle.set(ww.domNode, { position: this._savedPosition, visibility: "visible", opacity: "1" }); + domAttr.set(this.displayNode, "tabIndex", "-1"); // needed by WebKit for TAB from editor to skip displayNode -dojo.declare("dojo.dnd.move.constrainedMoveable", dojo.dnd.Moveable, { - // object attributes (for markup) - constraints: function(){}, - within: false, - - // markup methods - markupFactory: function(params, node){ - return new dojo.dnd.move.constrainedMoveable(node, params); + // Replace the display widget with edit widget, leaving them both displayed for a brief time so that + // focus can be shifted without incident. (browser may needs some time to render the editor.) + setTimeout(lang.hitch(ww, function(){ + this.focus(); // both nodes are showing, so we can switch focus safely + this._resetValue = this.getValue(); + }), 0); }, - constructor: function(node, params){ + _onBlur: function(){ // summary: - // an object that makes a node moveable - // node: Node - // a node (or node's id) to be moved - // params: dojo.dnd.move.__constrainedMoveableArgs? - // an optional object with additional parameters; - // the rest is passed to the base class - if(!params){ params = {}; } - this.constraints = params.constraints; - this.within = params.within; + // 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... + setTimeout(lang.hitch(this, function(){ + if(this.wrapperWidget){ + this.wrapperWidget.destroy(); + delete this.wrapperWidget; + } + }), 0); + */ + } }, - onFirstMove: function(/* dojo.dnd.Mover */ mover){ + + destroy: function(){ + if(this.wrapperWidget && !this.wrapperWidget._destroyed){ + this.wrapperWidget.destroy(); + delete this.wrapperWidget; + } + this.inherited(arguments); + }, + + _showText: function(/*Boolean*/ focus){ // summary: - // called during the very first move notification; - // can be used to initialize coordinates, can be overwritten. - var c = this.constraintBox = this.constraints.call(this, mover); - c.r = c.l + c.w; - c.b = c.t + c.h; - if(this.within){ - var mb = dojo._getMarginSize(mover.node); - c.r -= mb.w; - c.b -= mb.h; + // Revert to display mode, and optionally focus on display node + // tags: + // private + + var ww = this.wrapperWidget; + domStyle.set(ww.domNode, { position: "absolute", visibility: "hidden", opacity: "0" }); // hide the editor from mouse/keyboard events + domStyle.set(this.displayNode, { position: this._savedPosition, opacity: this._savedOpacity }); // make the original text visible + domAttr.set(this.displayNode, "tabIndex", this._savedTabIndex); + if(focus){ + fm.focus(this.displayNode); } }, - onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){ + + save: function(/*Boolean*/ focus){ // summary: - // called during every move notification; - // should actually move the node; can be overwritten. - var c = this.constraintBox, s = mover.node.style; - this.onMoving(mover, leftTop); - leftTop.l = leftTop.l < c.l ? c.l : c.r < leftTop.l ? c.r : leftTop.l; - leftTop.t = leftTop.t < c.t ? c.t : c.b < leftTop.t ? c.b : leftTop.t; - s.left = leftTop.l + "px"; - s.top = leftTop.t + "px"; - this.onMoved(mover, leftTop); - } -}); + // Save the contents of the editor and revert to display mode. + // focus: Boolean + // Focus on the display mode text + // tags: + // private -/*===== -dojo.declare("dojo.dnd.move.__boxConstrainedMoveableArgs", [dojo.dnd.move.__constrainedMoveableArgs], { - // box: Object - // a constraint box - box: {} -}); -=====*/ + if(this.disabled || !this.editing){ return; } + this._set('editing', false); -dojo.declare("dojo.dnd.move.boxConstrainedMoveable", dojo.dnd.move.constrainedMoveable, { - // box: - // object attributes (for markup) - box: {}, - - // markup methods - markupFactory: function(params, node){ - return new dojo.dnd.move.boxConstrainedMoveable(node, params); + var ww = this.wrapperWidget; + var value = ww.getValue(); + this.set('value', value); // display changed, formatted value + + this._showText(focus); // set focus as needed }, - constructor: function(node, params){ + setValue: function(/*String*/ val){ // summary: - // an object, which makes a node moveable - // node: Node - // a node (or node's id) to be moved - // params: dojo.dnd.move.__boxConstrainedMoveableArgs? - // an optional object with parameters - var box = params && params.box; - this.constraints = function(){ return box; }; - } -}); + // 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); + }, -/*===== -dojo.declare("dojo.dnd.move.__parentConstrainedMoveableArgs", [dojo.dnd.move.__constrainedMoveableArgs], { - // area: String - // A parent's area to restrict the move. - // Can be "margin", "border", "padding", or "content". - area: "" -}); -=====*/ + _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. -dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constrainedMoveable, { - // area: - // object attributes (for markup) - area: "content", + 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); - // markup methods - markupFactory: function(params, node){ - return new dojo.dnd.move.parentConstrainedMoveable(node, params); + if(this._started){ + // tell the world that we have changed + setTimeout(lang.hitch(this, "onChange", val), 0); // setTimeout 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); + } }, - constructor: function(node, params){ + getValue: function(){ // summary: - // an object, which makes a node moveable - // node: Node - // a node (or node's id) to be moved - // params: dojo.dnd.move.__parentConstrainedMoveableArgs? - // an optional object with parameters - var area = params && params.area; - this.constraints = function(){ - var n = this.node.parentNode, - s = dojo.getComputedStyle(n), - mb = dojo._getMarginBox(n, s); - if(area == "margin"){ - return mb; // Object - } - var t = dojo._getMarginExtents(n, s); - mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h; - if(area == "border"){ - return mb; // Object - } - t = dojo._getBorderExtents(n, s); - mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h; - if(area == "padding"){ - return mb; // Object - } - t = dojo._getPadExtents(n, s); - mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h; - return mb; // Object - }; - } + // 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 + setTimeout(lang.hitch(this, "onCancel"), 0); // setTimeout 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 + } + } }); -// patching functions one level up for compatibility +InlineEditBox._InlineEditor = InlineEditor; // for monkey patching -dojo.dnd.constrainedMover = dojo.dnd.move.constrainedMover; -dojo.dnd.boxConstrainedMover = dojo.dnd.move.boxConstrainedMover; -dojo.dnd.parentConstrainedMover = dojo.dnd.move.parentConstrainedMover; +return InlineEditBox; +}); +}, +'dojo/selector/acme':function(){ +define("dojo/selector/acme", ["../_base/kernel", "../has", "../dom", "../_base/sniff", "../_base/array", "../_base/lang", "../_base/window"], function(dojo, has, dom){ + // module: + // dojo/selector/acme + // summary: + // This module defines the Acme selector engine -} +/* + acme architectural overview: + + acme is a relatively full-featured CSS3 query library. It is + designed to take any valid CSS3 selector and return the nodes matching + the selector. To do this quickly, it processes queries in several + steps, applying caching where profitable. + + The steps (roughly in reverse order of the way they appear in the code): + 1.) check to see if we already have a "query dispatcher" + - if so, use that with the given parameterization. Skip to step 4. + 2.) attempt to determine which branch to dispatch the query to: + - JS (optimized DOM iteration) + - native (FF3.1+, Safari 3.1+, IE 8+) + 3.) tokenize and convert to executable "query dispatcher" + - this is where the lion's share of the complexity in the + system lies. In the DOM version, the query dispatcher is + assembled as a chain of "yes/no" test functions pertaining to + a section of a simple query statement (".blah:nth-child(odd)" + but not "div div", which is 2 simple statements). Individual + statement dispatchers are cached (to prevent re-definition) + as are entire dispatch chains (to make re-execution of the + same query fast) + 4.) the resulting query dispatcher is called in the passed scope + (by default the top-level document) + - for DOM queries, this results in a recursive, top-down + evaluation of nodes based on each simple query section + - for native implementations, this may mean working around spec + bugs. So be it. + 5.) matched nodes are pruned to ensure they are unique (if necessary) +*/ -if(!dojo._hasResource["dojo.dnd.TimedMoveable"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.dnd.TimedMoveable"] = true; -dojo.provide("dojo.dnd.TimedMoveable"); + //////////////////////////////////////////////////////////////////////// + // Toolkit aliases + //////////////////////////////////////////////////////////////////////// + // if you are extracting acme for use in your own system, you will + // need to provide these methods and properties. No other porting should be + // necessary, save for configuring the system to use a class other than + // dojo.NodeList as the return instance instantiator + var trim = dojo.trim; + var each = dojo.forEach; + // d.isIE; // float + // d.isSafari; // float + // d.isOpera; // float + // d.isWebKit; // float + // d.doc ; // document element -/*===== -dojo.declare("dojo.dnd.__TimedMoveableArgs", [dojo.dnd.__MoveableArgs], { - // timeout: Number - // delay move by this number of ms, - // accumulating position changes during the timeout - timeout: 0 -}); -=====*/ + var getDoc = function(){ return dojo.doc; }; + // NOTE(alex): the spec is idiotic. CSS queries should ALWAYS be case-sensitive, but nooooooo + var cssCaseBug = ((dojo.isWebKit||dojo.isMozilla) && ((getDoc().compatMode) == "BackCompat")); -(function(){ - // precalculate long expressions - var oldOnMove = dojo.dnd.Moveable.prototype.onMove; - - dojo.declare("dojo.dnd.TimedMoveable", dojo.dnd.Moveable, { - // summary: - // A specialized version of Moveable to support an FPS throttling. - // This class puts an upper restriction on FPS, which may reduce - // the CPU load. The additional parameter "timeout" regulates - // the delay before actually moving the moveable object. - - // object attributes (for markup) - timeout: 40, // in ms, 40ms corresponds to 25 fps - - constructor: function(node, params){ - // summary: - // an object that makes a node moveable with a timer - // node: Node||String - // a node (or node's id) to be moved - // params: dojo.dnd.__TimedMoveableArgs - // object with additional parameters. - - // sanitize parameters - if(!params){ params = {}; } - if(params.timeout && typeof params.timeout == "number" && params.timeout >= 0){ - this.timeout = params.timeout; + //////////////////////////////////////////////////////////////////////// + // Global utilities + //////////////////////////////////////////////////////////////////////// + + + var specials = ">~+"; + + // global thunk to determine whether we should treat the current query as + // case sensitive or not. This switch is flipped by the query evaluator + // based on the document passed as the context to search. + var caseSensitive = false; + + // how high? + var yesman = function(){ return true; }; + + //////////////////////////////////////////////////////////////////////// + // Tokenizer + //////////////////////////////////////////////////////////////////////// + + var getQueryParts = function(query){ + // summary: + // state machine for query tokenization + // description: + // instead of using a brittle and slow regex-based CSS parser, + // acme implements an AST-style query representation. This + // representation is only generated once per query. For example, + // the same query run multiple times or under different root nodes + // does not re-parse the selector expression but instead uses the + // cached data structure. The state machine implemented here + // terminates on the last " " (space) character and returns an + // ordered array of query component structures (or "parts"). Each + // part represents an operator or a simple CSS filtering + // expression. The structure for parts is documented in the code + // below. + + + // NOTE: + // this code is designed to run fast and compress well. Sacrifices + // to readability and maintainability have been made. Your best + // bet when hacking the tokenizer is to put The Donnas on *really* + // loud (may we recommend their "Spend The Night" release?) and + // just assume you're gonna make mistakes. Keep the unit tests + // open and run them frequently. Knowing is half the battle ;-) + if(specials.indexOf(query.slice(-1)) >= 0){ + // if we end with a ">", "+", or "~", that means we're implicitly + // searching all children, so make it explicit + query += " * " + }else{ + // if you have not provided a terminator, one will be provided for + // you... + query += " "; + } + + var ts = function(/*Integer*/ s, /*Integer*/ e){ + // trim and slice. + + // take an index to start a string slice from and an end position + // and return a trimmed copy of that sub-string + return trim(query.slice(s, e)); + }; + + // the overall data graph of the full query, as represented by queryPart objects + var queryParts = []; + + + // state keeping vars + var inBrackets = -1, inParens = -1, inMatchFor = -1, + inPseudo = -1, inClass = -1, inId = -1, inTag = -1, + lc = "", cc = "", pStart; + + // iteration vars + var x = 0, // index in the query + ql = query.length, + currentPart = null, // data structure representing the entire clause + _cp = null; // the current pseudo or attr matcher + + // several temporary variables are assigned to this structure during a + // potential sub-expression match: + // attr: + // a string representing the current full attribute match in a + // bracket expression + // type: + // if there's an operator in a bracket expression, this is + // used to keep track of it + // value: + // the internals of parenthetical expression for a pseudo. for + // :nth-child(2n+1), value might be "2n+1" + + var endTag = function(){ + // called when the tokenizer hits the end of a particular tag name. + // Re-sets state variables for tag matching and sets up the matcher + // to handle the next type of token (tag or operator). + if(inTag >= 0){ + var tv = (inTag == x) ? null : ts(inTag, x); // .toLowerCase(); + currentPart[ (specials.indexOf(tv) < 0) ? "tag" : "oper" ] = tv; + inTag = -1; } - }, - - // markup methods - markupFactory: function(params, node){ - return new dojo.dnd.TimedMoveable(node, params); - }, - - onMoveStop: function(/* dojo.dnd.Mover */ mover){ - if(mover._timer){ - // stop timer - clearTimeout(mover._timer) - // reflect the last received position - oldOnMove.call(this, mover, mover._leftTop) + }; + + var endId = function(){ + // called when the tokenizer might be at the end of an ID portion of a match + if(inId >= 0){ + currentPart.id = ts(inId, x).replace(/\\/g, ""); + inId = -1; } - dojo.dnd.Moveable.prototype.onMoveStop.apply(this, arguments); - }, - onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){ - mover._leftTop = leftTop; - if(!mover._timer){ - var _t = this; // to avoid using dojo.hitch() - mover._timer = setTimeout(function(){ - // we don't have any pending requests - mover._timer = null; - // reflect the last received position - oldOnMove.call(_t, mover, mover._leftTop); - }, this.timeout); + }; + + var endClass = function(){ + // called when the tokenizer might be at the end of a class name + // match. CSS allows for multiple classes, so we augment the + // current item with another class in its list + if(inClass >= 0){ + currentPart.classes.push(ts(inClass + 1, x).replace(/\\/g, "")); + inClass = -1; } - } - }); -})(); + }; -} + var endAll = function(){ + // at the end of a simple fragment, so wall off the matches + endId(); + endTag(); + endClass(); + }; -if(!dojo._hasResource["dijit.form._FormMixin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form._FormMixin"] = true; -dojo.provide("dijit.form._FormMixin"); + var endPart = function(){ + endAll(); + if(inPseudo >= 0){ + currentPart.pseudos.push({ name: ts(inPseudo + 1, x) }); + } + // hint to the selector engine to tell it whether or not it + // needs to do any iteration. Many simple selectors don't, and + // we can avoid significant construction-time work by advising + // the system to skip them + currentPart.loops = ( + currentPart.pseudos.length || + currentPart.attrs.length || + currentPart.classes.length ); + + currentPart.oquery = currentPart.query = ts(pStart, x); // save the full expression as a string + + + // otag/tag are hints to suggest to the system whether or not + // it's an operator or a tag. We save a copy of otag since the + // tag name is cast to upper-case in regular HTML matches. The + // system has a global switch to figure out if the current + // expression needs to be case sensitive or not and it will use + // otag or tag accordingly + currentPart.otag = currentPart.tag = (currentPart["oper"]) ? null : (currentPart.tag || "*"); + + if(currentPart.tag){ + // if we're in a case-insensitive HTML doc, we likely want + // the toUpperCase when matching on element.tagName. If we + // do it here, we can skip the string op per node + // comparison + currentPart.tag = currentPart.tag.toUpperCase(); + } + + // add the part to the list + if(queryParts.length && (queryParts[queryParts.length-1].oper)){ + // operators are always infix, so we remove them from the + // list and attach them to the next match. The evaluator is + // responsible for sorting out how to handle them. + currentPart.infixOper = queryParts.pop(); + currentPart.query = currentPart.infixOper.query + " " + currentPart.query; + /* + console.debug( "swapping out the infix", + currentPart.infixOper, + "and attaching it to", + currentPart); + */ + } + queryParts.push(currentPart); + + currentPart = null; + }; + // iterate over the query, character by character, building up a + // list of query part objects + for(; lc=cc, cc=query.charAt(x), x < ql; x++){ + // cc: the current character in the match + // lc: the last character (if any) + + // someone is trying to escape something, so don't try to match any + // fragments. We assume we're inside a literal. + if(lc == "\\"){ continue; } + if(!currentPart){ // a part was just ended or none has yet been created + // NOTE: I hate all this alloc, but it's shorter than writing tons of if's + pStart = x; + // rules describe full CSS sub-expressions, like: + // #someId + // .className:first-child + // but not: + // thinger > div.howdy[type=thinger] + // the indidual components of the previous query would be + // split into 3 parts that would be represented a structure + // like: + // [ + // { + // query: "thinger", + // tag: "thinger", + // }, + // { + // query: "div.howdy[type=thinger]", + // classes: ["howdy"], + // infixOper: { + // query: ">", + // oper: ">", + // } + // }, + // ] + currentPart = { + query: null, // the full text of the part's rule + pseudos: [], // CSS supports multiple pseud-class matches in a single rule + attrs: [], // CSS supports multi-attribute match, so we need an array + classes: [], // class matches may be additive, e.g.: .thinger.blah.howdy + tag: null, // only one tag... + oper: null, // ...or operator per component. Note that these wind up being exclusive. + id: null, // the id component of a rule + getTag: function(){ + return (caseSensitive) ? this.otag : this.tag; + } + }; + // if we don't have a part, we assume we're going to start at + // the beginning of a match, which should be a tag name. This + // might fault a little later on, but we detect that and this + // iteration will still be fine. + inTag = x; + } + + if(inBrackets >= 0){ + // look for a the close first + if(cc == "]"){ // if we're in a [...] clause and we end, do assignment + if(!_cp.attr){ + // no attribute match was previously begun, so we + // assume this is an attribute existence match in the + // form of [someAttributeName] + _cp.attr = ts(inBrackets+1, x); + }else{ + // we had an attribute already, so we know that we're + // matching some sort of value, as in [attrName=howdy] + _cp.matchFor = ts((inMatchFor||inBrackets+1), x); + } + var cmf = _cp.matchFor; + if(cmf){ + // try to strip quotes from the matchFor value. We want + // [attrName=howdy] to match the same + // as [attrName = 'howdy' ] + if( (cmf.charAt(0) == '"') || (cmf.charAt(0) == "'") ){ + _cp.matchFor = cmf.slice(1, -1); + } + } + // end the attribute by adding it to the list of attributes. + currentPart.attrs.push(_cp); + _cp = null; // necessary? + inBrackets = inMatchFor = -1; + }else if(cc == "="){ + // if the last char was an operator prefix, make sure we + // record it along with the "=" operator. + var addToCc = ("|~^$*".indexOf(lc) >=0 ) ? lc : ""; + _cp.type = addToCc+cc; + _cp.attr = ts(inBrackets+1, x-addToCc.length); + inMatchFor = x+1; + } + // now look for other clause parts + }else if(inParens >= 0){ + // if we're in a parenthetical expression, we need to figure + // out if it's attached to a pseudo-selector rule like + // :nth-child(1) + if(cc == ")"){ + if(inPseudo >= 0){ + _cp.value = ts(inParens+1, x); + } + inPseudo = inParens = -1; + } + }else if(cc == "#"){ + // start of an ID match + endAll(); + inId = x+1; + }else if(cc == "."){ + // start of a class match + endAll(); + inClass = x; + }else if(cc == ":"){ + // start of a pseudo-selector match + endAll(); + inPseudo = x; + }else if(cc == "["){ + // start of an attribute match. + endAll(); + inBrackets = x; + // provide a new structure for the attribute match to fill-in + _cp = { + /*===== + attr: null, type: null, matchFor: null + =====*/ + }; + }else if(cc == "("){ + // we really only care if we've entered a parenthetical + // expression if we're already inside a pseudo-selector match + if(inPseudo >= 0){ + // provide a new structure for the pseudo match to fill-in + _cp = { + name: ts(inPseudo+1, x), + value: null + }; + currentPart.pseudos.push(_cp); + } + inParens = x; + }else if( + (cc == " ") && + // if it's a space char and the last char is too, consume the + // current one without doing more work + (lc != cc) + ){ + endPart(); + } + } + return queryParts; + }; -dojo.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"] } -=====*/ + //////////////////////////////////////////////////////////////////////// + // DOM query infrastructure + //////////////////////////////////////////////////////////////////////// - // 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: "", + var agree = function(first, second){ + // the basic building block of the yes/no chaining system. agree(f1, + // f2) generates a new function which returns the boolean results of + // both of the passed functions to a single logical-anded result. If + // either are not passed, the other is used exclusively. + if(!first){ return second; } + if(!second){ return first; } - // 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}, ...]) - // - // + return function(){ + return first.apply(window, arguments) && second.apply(window, arguments); + } + }; - reset: function(){ - dojo.forEach(this.getDescendants(), function(widget){ - if(widget.reset){ - widget.reset(); - } - }); - }, + var getArr = function(i, arr){ + // helps us avoid array alloc when we don't need it + var r = arr||[]; // FIXME: should this be 'new d._NodeListCtor()' ? + if(i){ r.push(i); } + return r; + }; - 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 dojo.every(dojo.map(this.getDescendants(), 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 - dojo.window.scrollIntoView(widget.containerNode || widget.domNode); - widget.focus(); - didFocus = true; - } - return valid; - }), function(item){ return item; }); - }, + var _isElement = function(n){ return (1 == n.nodeType); }; - setValues: function(val){ - dojo.deprecated(this.declaredClass+"::setValues() is deprecated. Use set('value', val) instead.", "", "2.0"); - return this.set('value', val); + // FIXME: need to coalesce _getAttr with defaultGetter + var blank = ""; + var _getAttr = function(elem, attr){ + if(!elem){ return blank; } + if(attr == "class"){ + return elem.className || blank; + } + if(attr == "for"){ + return elem.htmlFor || blank; + } + if(attr == "style"){ + return elem.style.cssText || blank; + } + return (caseSensitive ? elem.getAttribute(attr) : elem.getAttribute(attr, 2)) || blank; + }; + + var attrs = { + "*=": function(attr, value){ + return function(elem){ + // E[foo*="bar"] + // an E element whose "foo" attribute value contains + // the substring "bar" + return (_getAttr(elem, attr).indexOf(value)>=0); + } + }, + "^=": function(attr, value){ + // E[foo^="bar"] + // an E element whose "foo" attribute value begins exactly + // with the string "bar" + return function(elem){ + return (_getAttr(elem, attr).indexOf(value)==0); + } + }, + "$=": function(attr, value){ + // E[foo$="bar"] + // an E element whose "foo" attribute value ends exactly + // with the string "bar" + return function(elem){ + var ea = " "+_getAttr(elem, attr); + return (ea.lastIndexOf(value)==(ea.length-value.length)); + } + }, + "~=": function(attr, value){ + // E[foo~="bar"] + // an E element whose "foo" attribute value is a list of + // space-separated values, one of which is exactly equal + // to "bar" + + // return "[contains(concat(' ',@"+attr+",' '), ' "+ value +" ')]"; + var tval = " "+value+" "; + return function(elem){ + var ea = " "+_getAttr(elem, attr)+" "; + return (ea.indexOf(tval)>=0); + } + }, + "|=": function(attr, value){ + // E[hreflang|="en"] + // an E element whose "hreflang" attribute has a + // hyphen-separated list of values beginning (from the + // left) with "en" + var valueDash = value+"-"; + return function(elem){ + var ea = _getAttr(elem, attr); + return ( + (ea == value) || + (ea.indexOf(valueDash)==0) + ); + } }, - _setValueAttr: function(/*Object*/ obj){ - // summary: - // Fill in form values from according to an Object (in the format returned by get('value')) + "=": function(attr, value){ + return function(elem){ + return (_getAttr(elem, attr) == value); + } + } + }; - // generate map from name --> [list of widgets with that name] - var map = { }; - dojo.forEach(this.getDescendants(), function(widget){ - if(!widget.name){ return; } - var entry = map[widget.name] || (map[widget.name] = [] ); - entry.push(widget); - }); + // avoid testing for node type if we can. Defining this in the negative + // here to avoid negation in the fast path. + var _noNES = (typeof getDoc().firstChild.nextElementSibling == "undefined"); + var _ns = !_noNES ? "nextElementSibling" : "nextSibling"; + var _ps = !_noNES ? "previousElementSibling" : "previousSibling"; + var _simpleNodeTest = (_noNES ? _isElement : yesman); - for(var name in map){ - if(!map.hasOwnProperty(name)){ - continue; + var _lookLeft = function(node){ + // look left + while(node = node[_ps]){ + if(_simpleNodeTest(node)){ return false; } + } + return true; + }; + + var _lookRight = function(node){ + // look right + while(node = node[_ns]){ + if(_simpleNodeTest(node)){ return false; } + } + return true; + }; + + var getNodeIndex = function(node){ + var root = node.parentNode; + var i = 0, + tret = root.children || root.childNodes, + ci = (node["_i"]||-1), + cl = (root["_l"]||-1); + + if(!tret){ return -1; } + var l = tret.length; + + // we calculate the parent length as a cheap way to invalidate the + // cache. It's not 100% accurate, but it's much more honest than what + // other libraries do + if( cl == l && ci >= 0 && cl >= 0 ){ + // if it's legit, tag and release + return ci; + } + + // else re-key things + root["_l"] = l; + ci = -1; + for(var te = root["firstElementChild"]||root["firstChild"]; te; te = te[_ns]){ + if(_simpleNodeTest(te)){ + te["_i"] = ++i; + if(node === te){ + // NOTE: + // shortcutting the return at this step in indexing works + // very well for benchmarking but we avoid it here since + // it leads to potential O(n^2) behavior in sequential + // getNodexIndex operations on a previously un-indexed + // parent. We may revisit this at a later time, but for + // now we just want to get the right answer more often + // than not. + ci = i; } - var widgets = map[name], // array of widgets w/this name - values = dojo.getObject(name, false, obj); // list of values for those widgets + } + } + return ci; + }; - if(values === undefined){ - continue; + var isEven = function(elem){ + return !((getNodeIndex(elem)) % 2); + }; + + var isOdd = function(elem){ + return ((getNodeIndex(elem)) % 2); + }; + + var pseudos = { + "checked": function(name, condition){ + return function(elem){ + return !!("checked" in elem ? elem.checked : elem.selected); + } + }, + "first-child": function(){ return _lookLeft; }, + "last-child": function(){ return _lookRight; }, + "only-child": function(name, condition){ + return function(node){ + return _lookLeft(node) && _lookRight(node); + }; + }, + "empty": function(name, condition){ + return function(elem){ + // DomQuery and jQuery get this wrong, oddly enough. + // The CSS 3 selectors spec is pretty explicit about it, too. + var cn = elem.childNodes; + var cnl = elem.childNodes.length; + // if(!cnl){ return true; } + for(var x=cnl-1; x >= 0; x--){ + var nt = cn[x].nodeType; + if((nt === 1)||(nt == 3)){ return false; } } - if(!dojo.isArray(values)){ - values = [ values ]; + return true; + } + }, + "contains": function(name, condition){ + var cz = condition.charAt(0); + if( cz == '"' || cz == "'" ){ //remove quote + condition = condition.slice(1, -1); + } + return function(elem){ + return (elem.innerHTML.indexOf(condition) >= 0); + } + }, + "not": function(name, condition){ + var p = getQueryParts(condition)[0]; + var ignores = { el: 1 }; + if(p.tag != "*"){ + ignores.tag = 1; + } + if(!p.classes.length){ + ignores.classes = 1; + } + var ntf = getSimpleFilterFunc(p, ignores); + return function(elem){ + return (!ntf(elem)); + } + }, + "nth-child": function(name, condition){ + var pi = parseInt; + // avoid re-defining function objects if we can + if(condition == "odd"){ + return isOdd; + }else if(condition == "even"){ + return isEven; + } + // FIXME: can we shorten this? + if(condition.indexOf("n") != -1){ + var tparts = condition.split("n", 2); + var pred = tparts[0] ? ((tparts[0] == '-') ? -1 : pi(tparts[0])) : 1; + var idx = tparts[1] ? pi(tparts[1]) : 0; + var lb = 0, ub = -1; + if(pred > 0){ + if(idx < 0){ + idx = (idx % pred) && (pred + (idx % pred)); + }else if(idx>0){ + if(idx >= pred){ + lb = idx - idx % pred; + } + idx = idx % pred; + } + }else if(pred<0){ + pred *= -1; + // idx has to be greater than 0 when pred is negative; + // shall we throw an error here? + if(idx > 0){ + ub = idx; + idx = idx % pred; + } } - if(typeof widgets[0].checked == 'boolean'){ - // for checkbox/radio, values is a list of which widgets should be checked - dojo.forEach(widgets, function(w, i){ - w.set('value', dojo.indexOf(values, w.value) != -1); - }); - }else if(widgets[0].multiple){ - // it takes an array (e.g. multi-select) - widgets[0].set('value', values); + if(pred > 0){ + return function(elem){ + var i = getNodeIndex(elem); + return (i>=lb) && (ub<0 || i<=ub) && ((i % pred) == idx); + } }else{ - // otherwise, values is a list of values to be assigned sequentially to each widget - dojo.forEach(widgets, function(w, i){ - w.set('value', values[i]); - }); + condition = idx; } } + var ncount = pi(condition); + return function(elem){ + return (getNodeIndex(elem) == ncount); + } + } + }; - /*** - * TODO: code for plain input boxes (this shouldn't run for inputs that are part of widgets) + var defaultGetter = (dojo.isIE && (dojo.isIE < 9 || dojo.isQuirks)) ? function(cond){ + var clc = cond.toLowerCase(); + if(clc == "class"){ cond = "className"; } + return function(elem){ + return (caseSensitive ? elem.getAttribute(cond) : elem[cond]||elem[clc]); + } + } : function(cond){ + return function(elem){ + return (elem && elem.getAttribute && elem.hasAttribute(cond)); + } + }; - dojo.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 + var getSimpleFilterFunc = function(query, ignores){ + // generates a node tester function based on the passed query part. The + // query part is one of the structures generated by the query parser + // when it creates the query AST. The "ignores" object specifies which + // (if any) tests to skip, allowing the system to avoid duplicating + // work where it may have already been taken into account by other + // factors such as how the nodes to test were fetched in the first + // place + if(!query){ return yesman; } + ignores = ignores||{}; - nameIndex=parseInt(nameA[1]); - if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){ - myObj[nameA[0]][nameIndex] = { }; - } - myObj=myObj[nameA[0]][nameIndex]; - continue; - } // repeater support ends + var ff = null; - if(typeof(myObj[p]) == "undefined"){ - myObj=undefined; - break; - }; - myObj=myObj[p]; + if(!("el" in ignores)){ + ff = agree(ff, _isElement); + } + + if(!("tag" in ignores)){ + if(query.tag != "*"){ + ff = agree(ff, function(elem){ + return (elem && (elem.tagName == query.getTag())); + }); + } + } + + if(!("classes" in ignores)){ + each(query.classes, function(cname, idx, arr){ + // get the class name + /* + var isWildcard = cname.charAt(cname.length-1) == "*"; + if(isWildcard){ + cname = cname.substr(0, cname.length-1); } + // I dislike the regex thing, even if memoized in a cache, but it's VERY short + var re = new RegExp("(?:^|\\s)" + cname + (isWildcard ? ".*" : "") + "(?:\\s|$)"); + */ + var re = new RegExp("(?:^|\\s)" + cname + "(?:\\s|$)"); + ff = agree(ff, function(elem){ + return re.test(elem.className); + }); + ff.count = idx; + }); + } - if(typeof(myObj) == "undefined"){ - return; // like "continue" + if(!("pseudos" in ignores)){ + each(query.pseudos, function(pseudo){ + var pn = pseudo.name; + if(pseudos[pn]){ + ff = agree(ff, pseudos[pn](pn, pseudo.value)); } - if(typeof(myObj[name]) == "undefined" && this.ignoreNullValues){ - return; // like "continue" + }); + } + + if(!("attrs" in ignores)){ + each(query.attrs, function(attr){ + var matcher; + var a = attr.attr; + // type, attr, matchFor + if(attr.type && attrs[attr.type]){ + matcher = attrs[attr.type](a, attr.matchFor); + }else if(a.length){ + matcher = defaultGetter(a); } + if(matcher){ + ff = agree(ff, matcher); + } + }); + } - // TODO: widget values (just call set('value', ...) on the widget) + if(!("id" in ignores)){ + if(query.id){ + ff = agree(ff, function(elem){ + return (!!elem && (elem.id == query.id)); + }); + } + } - // TODO: maybe should call dojo.getNodeProp() instead - switch(element.type){ - case "checkbox": - element.checked = (name in myObj) && - dojo.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; - dojo.forEach(element.options, function(option){ - option.selected = dojo.some(myObj[name], function(val){ return option.value == val; }); - }); - break; - case "select-one": - element.selectedIndex="0"; - dojo.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; + if(!ff){ + if(!("default" in ignores)){ + ff = yesman; + } + } + return ff; + }; + + var _nextSibling = function(filterFunc){ + return function(node, ret, bag){ + while(node = node[_ns]){ + if(_noNES && (!_isElement(node))){ continue; } + if( + (!bag || _isUnique(node, bag)) && + filterFunc(node) + ){ + ret.push(node); } - }); - */ - - // Note: no need to call this._set("value", ...) as the child updates will trigger onChange events - // which I am monitoring. - }, + break; + } + return ret; + } + }; - getValues: function(){ - dojo.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: + var _nextSiblings = function(filterFunc){ + return function(root, ret, bag){ + var te = root[_ns]; + while(te){ + if(_simpleNodeTest(te)){ + if(bag && !_isUnique(te, bag)){ + break; + } + if(filterFunc(te)){ + ret.push(te); + } + } + te = te[_ns]; + } + return ret; + } + }; - // 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 setTimout(..., 0) 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 an array of child *elements*, skipping text and comment nodes + var _childElements = function(filterFunc){ + filterFunc = filterFunc||yesman; + return function(root, ret, bag){ + // get an array of child elements, skipping text and comment nodes + var te, x = 0, tret = root.children || root.childNodes; + while(te = tret[x++]){ + if( + _simpleNodeTest(te) && + (!bag || _isUnique(te, bag)) && + (filterFunc(te, x)) + ){ + ret.push(te); + } + } + return ret; + }; + }; - // get widget values - var obj = { }; - dojo.forEach(this.getDescendants(), function(widget){ - var name = widget.name; - if(!name || widget.disabled){ return; } + /* + // thanks, Dean! + var itemIsAfterRoot = d.isIE ? function(item, root){ + return (item.sourceIndex > root.sourceIndex); + } : function(item, root){ + return (item.compareDocumentPosition(root) == 2); + }; + */ - // Single value widget (checkbox, radio, or plain <input> type widget) - var value = widget.get('value'); + // test to see if node is below root + var _isDescendant = function(node, root){ + var pn = node.parentNode; + while(pn){ + if(pn == root){ + break; + } + pn = pn.parentNode; + } + return !!pn; + }; - // 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){ - dojo.setObject(name, value, obj); - }else{ - // give radio widgets a default of null - value = dojo.getObject(name, false, obj); - if(value === undefined){ - dojo.setObject(name, null, obj); - } - } - }else{ - // checkbox/toggle button - var ary=dojo.getObject(name, false, obj); - if(!ary){ - ary=[]; - dojo.setObject(name, ary, obj); - } - if(value !== false){ - ary.push(value); + var _getElementsFuncCache = {}; + + var getElementsFunc = function(query){ + var retFunc = _getElementsFuncCache[query.query]; + // if we've got a cached dispatcher, just use that + if(retFunc){ return retFunc; } + // else, generate a new on + + // NOTE: + // this function returns a function that searches for nodes and + // filters them. The search may be specialized by infix operators + // (">", "~", or "+") else it will default to searching all + // descendants (the " " selector). Once a group of children is + // found, a test function is applied to weed out the ones we + // don't want. Many common cases can be fast-pathed. We spend a + // lot of cycles to create a dispatcher that doesn't do more work + // than necessary at any point since, unlike this function, the + // dispatchers will be called every time. The logic of generating + // efficient dispatchers looks like this in pseudo code: + // + // # if it's a purely descendant query (no ">", "+", or "~" modifiers) + // if infixOperator == " ": + // if only(id): + // return def(root): + // return d.byId(id, root); + // + // elif id: + // return def(root): + // return filter(d.byId(id, root)); + // + // elif cssClass && getElementsByClassName: + // return def(root): + // return filter(root.getElementsByClassName(cssClass)); + // + // elif only(tag): + // return def(root): + // return root.getElementsByTagName(tagName); + // + // else: + // # search by tag name, then filter + // return def(root): + // return filter(root.getElementsByTagName(tagName||"*")); + // + // elif infixOperator == ">": + // # search direct children + // return def(root): + // return filter(root.children); + // + // elif infixOperator == "+": + // # search next sibling + // return def(root): + // return filter(root.nextElementSibling); + // + // elif infixOperator == "~": + // # search rightward siblings + // return def(root): + // return filter(nextSiblings(root)); + + var io = query.infixOper; + var oper = (io ? io.oper : ""); + // the default filter func which tests for all conditions in the query + // part. This is potentially inefficient, so some optimized paths may + // re-define it to test fewer things. + var filterFunc = getSimpleFilterFunc(query, { el: 1 }); + var qt = query.tag; + var wildcardTag = ("*" == qt); + var ecs = getDoc()["getElementsByClassName"]; + + if(!oper){ + // if there's no infix operator, then it's a descendant query. ID + // and "elements by class name" variants can be accelerated so we + // call them out explicitly: + if(query.id){ + // testing shows that the overhead of yesman() is acceptable + // and can save us some bytes vs. re-defining the function + // everywhere. + filterFunc = (!query.loops && wildcardTag) ? + yesman : + getSimpleFilterFunc(query, { el: 1, id: 1 }); + + retFunc = function(root, arr){ + var te = dom.byId(query.id, (root.ownerDocument||root)); + if(!te || !filterFunc(te)){ return; } + if(9 == root.nodeType){ // if root's a doc, we just return directly + return getArr(te, arr); + }else{ // otherwise check ancestry + if(_isDescendant(te, root)){ + return getArr(te, arr); } } - }else{ - var prev=dojo.getObject(name, false, obj); - if(typeof prev != "undefined"){ - if(dojo.isArray(prev)){ - prev.push(value); - }else{ - dojo.setObject(name, [prev, value], obj); + } + }else if( + ecs && + // isAlien check. Workaround for Prototype.js being totally evil/dumb. + /\{\s*\[native code\]\s*\}/.test(String(ecs)) && + query.classes.length && + !cssCaseBug + ){ + // it's a class-based query and we've got a fast way to run it. + + // ignore class and ID filters since we will have handled both + filterFunc = getSimpleFilterFunc(query, { el: 1, classes: 1, id: 1 }); + var classesString = query.classes.join(" "); + retFunc = function(root, arr, bag){ + var ret = getArr(0, arr), te, x=0; + var tret = root.getElementsByClassName(classesString); + while((te = tret[x++])){ + if(filterFunc(te, root) && _isUnique(te, bag)){ + ret.push(te); } - }else{ - // unique name - dojo.setObject(name, value, obj); } - } - }); + return ret; + }; - /*** - * code for plain input boxes (see also dojo.formToObject, can we use that instead of this code? - * but it doesn't understand [] notation, presumably) - var obj = { }; - dojo.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(!wildcardTag && !query.loops){ + // it's tag only. Fast-path it. + retFunc = function(root, arr, bag){ + var ret = getArr(0, arr), te, x=0; + var tret = root.getElementsByTagName(query.getTag()); + while((te = tret[x++])){ + if(_isUnique(te, bag)){ + ret.push(te); } - } 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); + return ret; + }; + }else{ + // the common case: + // a descendant selector without a fast path. By now it's got + // to have a tag selector, even if it's just "*" so we query + // by that and filter + filterFunc = getSimpleFilterFunc(query, { el: 1, tag: 1, id: 1 }); + retFunc = function(root, arr, bag){ + var ret = getArr(0, arr), te, x=0; + // we use getTag() to avoid case sensitivity issues + var tret = root.getElementsByTagName(query.getTag()); + while((te = tret[x++])){ + if(filterFunc(te, root) && _isUnique(te, bag)){ + ret.push(te); } } - } // if - name=undefined; - }); // forEach - ***/ - return obj; - }, + return ret; + }; + } + }else{ + // the query is scoped in some way. Instead of querying by tag we + // use some other collection to find candidate nodes + var skipFilters = { el: 1 }; + if(wildcardTag){ + skipFilters.tag = 1; + } + filterFunc = getSimpleFilterFunc(query, skipFilters); + if("+" == oper){ + retFunc = _nextSibling(filterFunc); + }else if("~" == oper){ + retFunc = _nextSiblings(filterFunc); + }else if(">" == oper){ + retFunc = _childElements(filterFunc); + } + } + // cache it and return + return _getElementsFuncCache[query.query] = retFunc; + }; - isValid: function(){ - // summary: - // Returns true if all of the widgets are valid. - // Deprecated, will be removed in 2.0. Use get("state") instead. + var filterDown = function(root, queryParts){ + // NOTE: + // this is the guts of the DOM query system. It takes a list of + // parsed query parts and a root and finds children which match + // the selector represented by the parts + var candidates = getArr(root), qp, x, te, qpl = queryParts.length, bag, ret; + + for(var i = 0; i < qpl; i++){ + ret = []; + qp = queryParts[i]; + x = candidates.length - 1; + if(x > 0){ + // if we have more than one root at this level, provide a new + // hash to use for checking group membership but tell the + // system not to post-filter us since we will already have been + // gauranteed to be unique + bag = {}; + ret.nozip = true; + } + var gef = getElementsFunc(qp); + for(var j = 0; (te = candidates[j]); j++){ + // for every root, get the elements that match the descendant + // selector, adding them to the "ret" array and filtering them + // via membership in this level's bag. If there are more query + // parts, then this level's return will be used as the next + // level's candidates + gef(te, ret, bag); + } + if(!ret.length){ break; } + candidates = ret; + } + return ret; + }; - return this.state == ""; - }, + //////////////////////////////////////////////////////////////////////// + // the query runner + //////////////////////////////////////////////////////////////////////// - onValidStateChange: function(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. - }, + // these are the primary caches for full-query results. The query + // dispatcher functions are generated then stored here for hash lookup in + // the future + var _queryFuncCacheDOM = {}, + _queryFuncCacheQSA = {}; - _getState: function(){ - // summary: - // Compute what this.state should be based on state of children - var states = dojo.map(this._descendants, function(w){ - return w.get("state") || ""; - }); + // this is the second level of spliting, from full-length queries (e.g., + // "div.foo .bar") into simple query expressions (e.g., ["div.foo", + // ".bar"]) + var getStepQueryFunc = function(query){ + var qparts = getQueryParts(trim(query)); - return dojo.indexOf(states, "Error") >= 0 ? "Error" : - dojo.indexOf(states, "Incomplete") >= 0 ? "Incomplete" : ""; - }, + // if it's trivial, avoid iteration and zipping costs + if(qparts.length == 1){ + // we optimize this case here to prevent dispatch further down the + // chain, potentially slowing things down. We could more elegantly + // handle this in filterDown(), but it's slower for simple things + // that need to be fast (e.g., "#someId"). + var tef = getElementsFunc(qparts[0]); + return function(root){ + var r = tef(root, []); + if(r){ r.nozip = true; } + return r; + } + } - disconnectChildren: function(){ - // summary: - // Remove connections to monitor changes to children's value, error state, and disabled state, - // in order to update Form.value and Form.state. - dojo.forEach(this._childConnections || [], dojo.hitch(this, "disconnect")); - dojo.forEach(this._childWatches || [], function(w){ w.unwatch(); }); - }, + // otherwise, break it up and return a runner that iterates over the parts recursively + return function(root){ + return filterDown(root, qparts); + } + }; - connectChildren: function(/*Boolean*/ inStartup){ - // summary: - // Setup connections to monitor changes to children's value, error state, and disabled state, - // in order to update Form.value and Form.state. - // - // 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. + // NOTES: + // * we can't trust QSA for anything but document-rooted queries, so + // caching is split into DOM query evaluators and QSA query evaluators + // * caching query results is dirty and leak-prone (or, at a minimum, + // prone to unbounded growth). Other toolkits may go this route, but + // they totally destroy their own ability to manage their memory + // footprint. If we implement it, it should only ever be with a fixed + // total element reference # limit and an LRU-style algorithm since JS + // has no weakref support. Caching compiled query evaluators is also + // potentially problematic, but even on large documents the size of the + // query evaluators is often < 100 function objects per evaluator (and + // LRU can be applied if it's ever shown to be an issue). + // * since IE's QSA support is currently only for HTML documents and even + // then only in IE 8's "standards mode", we have to detect our dispatch + // route at query time and keep 2 separate caches. Ugg. + + // we need to determine if we think we can run a given query via + // querySelectorAll or if we'll need to fall back on DOM queries to get + // there. We need a lot of information about the environment and the query + // to make the determiniation (e.g. does it support QSA, does the query in + // question work in the native QSA impl, etc.). + var nua = navigator.userAgent; + // some versions of Safari provided QSA, but it was buggy and crash-prone. + // We need te detect the right "internal" webkit version to make this work. + var wk = "WebKit/"; + var is525 = ( + dojo.isWebKit && + (nua.indexOf(wk) > 0) && + (parseFloat(nua.split(wk)[1]) > 528) + ); - var _this = this; + // IE QSA queries may incorrectly include comment nodes, so we throw the + // zipping function into "remove" comments mode instead of the normal "skip + // it" which every other QSA-clued browser enjoys + var noZip = dojo.isIE ? "commentStrip" : "nozip"; - // Remove old connections, if any - this.disconnectChildren(); + var qsa = "querySelectorAll"; + var qsaAvail = ( + !!getDoc()[qsa] && + // see #5832 + (!dojo.isSafari || (dojo.isSafari > 3.1) || is525 ) + ); - this._descendants = this.getDescendants(); + //Don't bother with n+3 type of matches, IE complains if we modify those. + var infixSpaceRe = /n\+\d|([^ ])?([>~+])([^ =])?/g; + var infixSpaceFunc = function(match, pre, ch, post){ + return ch ? (pre ? pre + " " : "") + ch + (post ? " " + post : "") : /*n+3*/ match; + }; - // (Re)set this.value and this.state. Send watch() notifications but not on startup. - var set = inStartup ? function(name, val){ _this[name] = val; } : dojo.hitch(this, "_set"); - set("value", this.get("value")); - set("state", this._getState()); + var getQueryFunc = function(query, forceDOM){ + //Normalize query. The CSS3 selectors spec allows for omitting spaces around + //infix operators, >, ~ and + + //Do the work here since detection for spaces is used as a simple "not use QSA" + //test below. + query = query.replace(infixSpaceRe, infixSpaceFunc); - // Monitor changes to error state and disabled state in order to update - // Form.state - var conns = (this._childConnections = []), - watches = (this._childWatches = []); - dojo.forEach(dojo.filter(this._descendants, - function(item){ return item.validate; } - ), - function(widget){ - // We are interested in whenever the widget changes validity state - or - // whenever the disabled attribute on that widget is changed. - dojo.forEach(["state", "disabled"], function(attr){ - watches.push(widget.watch(attr, function(attr, oldVal, newVal){ - _this.set("state", _this._getState()); - })); - }); - }); + if(qsaAvail){ + // if we've got a cached variant and we think we can do it, run it! + var qsaCached = _queryFuncCacheQSA[query]; + if(qsaCached && !forceDOM){ return qsaCached; } + } - // And monitor calls to child.onChange so we can update this.value - var onChange = function(){ - // summary: - // Called when child's value or disabled state changes - - // Use setTimeout() 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(_this._onChangeDelayTimer){ - clearTimeout(_this._onChangeDelayTimer); - } - _this._onChangeDelayTimer = setTimeout(function(){ - delete _this._onChangeDelayTimer; - _this._set("value", _this.get("value")); - }, 10); - }; - dojo.forEach( - dojo.filter(this._descendants, function(item){ return item.onChange; } ), - function(widget){ - // When a child widget's value changes, - // the efficient thing to do is to just update that one attribute in this.value, - // but that gets a little complicated when a checkbox is checked/unchecked - // since this.value["checkboxName"] contains an array of all the checkboxes w/the same name. - // Doing simple thing for now. - conns.push(_this.connect(widget, "onChange", onChange)); + // else if we've got a DOM cached variant, assume that we already know + // all we need to and use it + var domCached = _queryFuncCacheDOM[query]; + if(domCached){ return domCached; } - // Disabling/enabling a child widget should remove it's value from this.value. - // Again, this code could be more efficient, doing simple thing for now. - watches.push(widget.watch("disabled", onChange)); - } - ); - }, + // TODO: + // today we're caching DOM and QSA branches separately so we + // recalc useQSA every time. If we had a way to tag root+query + // efficiently, we'd be in good shape to do a global cache. + + var qcz = query.charAt(0); + var nospace = (-1 == query.indexOf(" ")); + + // byId searches are wicked fast compared to QSA, even when filtering + // is required + if( (query.indexOf("#") >= 0) && (nospace) ){ + forceDOM = true; + } + + var useQSA = ( + qsaAvail && (!forceDOM) && + // as per CSS 3, we can't currently start w/ combinator: + // http://www.w3.org/TR/css3-selectors/#w3cselgrammar + (specials.indexOf(qcz) == -1) && + // IE's QSA impl sucks on pseudos + (!dojo.isIE || (query.indexOf(":") == -1)) && + + (!(cssCaseBug && (query.indexOf(".") >= 0))) && + + // FIXME: + // need to tighten up browser rules on ":contains" and "|=" to + // figure out which aren't good + // Latest webkit (around 531.21.8) does not seem to do well with :checked on option + // elements, even though according to spec, selected options should + // match :checked. So go nonQSA for it: + // http://bugs.dojotoolkit.org/ticket/5179 + (query.indexOf(":contains") == -1) && (query.indexOf(":checked") == -1) && + (query.indexOf("|=") == -1) // some browsers don't grok it + ); - startup: function(){ - this.inherited(arguments); - - // Initialize value and valid/invalid state tracking. Needs to be done in startup() - // so that children are initialized. - this.connectChildren(true); + // TODO: + // if we've got a descendant query (e.g., "> .thinger" instead of + // just ".thinger") in a QSA-able doc, but are passed a child as a + // root, it should be possible to give the item a synthetic ID and + // trivially rewrite the query to the form "#synid > .thinger" to + // use the QSA branch - // Make state change call onValidStateChange(), will be removed in 2.0 - this.watch("state", function(attr, oldVal, newVal){ this.onValidStateChange(newVal == ""); }); - }, - destroy: function(){ - this.disconnectChildren(); - this.inherited(arguments); + if(useQSA){ + var tq = (specials.indexOf(query.charAt(query.length-1)) >= 0) ? + (query + " *") : query; + return _queryFuncCacheQSA[query] = function(root){ + try{ + // the QSA system contains an egregious spec bug which + // limits us, effectively, to only running QSA queries over + // entire documents. See: + // http://ejohn.org/blog/thoughts-on-queryselectorall/ + // despite this, we can also handle QSA runs on simple + // selectors, but we don't want detection to be expensive + // so we're just checking for the presence of a space char + // right now. Not elegant, but it's cheaper than running + // the query parser when we might not need to + if(!((9 == root.nodeType) || nospace)){ throw ""; } + var r = root[qsa](tq); + // skip expensive duplication checks and just wrap in a NodeList + r[noZip] = true; + return r; + }catch(e){ + // else run the DOM branch on this query, ensuring that we + // default that way in the future + return getQueryFunc(query, true)(root); + } + } + }else{ + // DOM branch + var parts = query.split(/\s*,\s*/); + return _queryFuncCacheDOM[query] = ((parts.length < 2) ? + // if not a compound query (e.g., ".foo, .bar"), cache and return a dispatcher + getStepQueryFunc(query) : + // if it *is* a complex query, break it up into its + // constituent parts and return a dispatcher that will + // merge the parts when run + function(root){ + var pindex = 0, // avoid array alloc for every invocation + ret = [], + tp; + while((tp = parts[pindex++])){ + ret = ret.concat(getStepQueryFunc(tp)(root)); + } + return ret; + } + ); } + }; - }); - -} - -if(!dojo._hasResource["dijit._DialogMixin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._DialogMixin"] = true; -dojo.provide("dijit._DialogMixin"); - - - -dojo.declare("dijit._DialogMixin", null, - { - // summary: - // This provides functions useful to Dialog and TooltipDialog - - attributeMap: dijit._Widget.prototype.attributeMap, - - 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')); - }, + var _zipIdx = 0; - _getFocusItems: function(){ - // summary: - // Finds focusable items in dialog, - // and sets this._firstFocusItem and this._lastFocusItem - // tags: - // protected + // NOTE: + // this function is Moo inspired, but our own impl to deal correctly + // with XML in IE + var _nodeUID = dojo.isIE ? function(node){ + if(caseSensitive){ + // XML docs don't have uniqueID on their nodes + return (node.getAttribute("_uid") || node.setAttribute("_uid", ++_zipIdx) || _zipIdx); - var elems = dijit._getTabNavigable(this.containerNode); - this._firstFocusItem = elems.lowest || elems.first || this.closeButtonNode || this.domNode; - this._lastFocusItem = elems.last || elems.highest || this._firstFocusItem; + }else{ + return node.uniqueID; } - } -); - -} - -if(!dojo._hasResource["dijit.DialogUnderlay"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.DialogUnderlay"] = true; -dojo.provide("dijit.DialogUnderlay"); - - + } : + function(node){ + return (node._uid || (node._uid = ++_zipIdx)); + }; + // determine if a node in is unique in a "bag". In this case we don't want + // to flatten a list of unique items, but rather just tell if the item in + // question is already in the bag. Normally we'd just use hash lookup to do + // this for us but IE's DOM is busted so we can't really count on that. On + // the upside, it gives us a built in unique ID function. + var _isUnique = function(node, bag){ + if(!bag){ return 1; } + var id = _nodeUID(node); + if(!bag[id]){ return bag[id] = 1; } + return 0; + }; + // attempt to efficiently determine if an item in a list is a dupe, + // returning a list of "uniques", hopefully in doucment order + var _zipIdxName = "_zipIdx"; + var _zip = function(arr){ + if(arr && arr.nozip){ + return arr; + } + var ret = []; + if(!arr || !arr.length){ return ret; } + if(arr[0]){ + ret.push(arr[0]); + } + if(arr.length < 2){ return ret; } + + _zipIdx++; + + // we have to fork here for IE and XML docs because we can't set + // expandos on their nodes (apparently). *sigh* + if(dojo.isIE && caseSensitive){ + var szidx = _zipIdx+""; + arr[0].setAttribute(_zipIdxName, szidx); + for(var x = 1, te; te = arr[x]; x++){ + if(arr[x].getAttribute(_zipIdxName) != szidx){ + ret.push(te); + } + te.setAttribute(_zipIdxName, szidx); + } + }else if(dojo.isIE && arr.commentStrip){ + try{ + for(var x = 1, te; te = arr[x]; x++){ + if(_isElement(te)){ + ret.push(te); + } + } + }catch(e){ /* squelch */ } + }else{ + if(arr[0]){ arr[0][_zipIdxName] = _zipIdx; } + for(var x = 1, te; te = arr[x]; x++){ + if(arr[x][_zipIdxName] != _zipIdx){ + ret.push(te); + } + te[_zipIdxName] = _zipIdx; + } + } + return ret; + }; -dojo.declare( - "dijit.DialogUnderlay", - [dijit._Widget, dijit._Templated], - { - // summary: - // The component that blocks the screen behind a `dijit.Dialog` + // the main executor + var query = function(/*String*/ query, /*String|DOMNode?*/ root){ + // summary: + // Returns nodes which match the given CSS3 selector, searching the + // entire document by default but optionally taking a node to scope + // the search by. Returns an array. + // description: + // dojo.query() is the swiss army knife of DOM node manipulation in + // Dojo. Much like Prototype's "$$" (bling-bling) function or JQuery's + // "$" function, dojo.query provides robust, high-performance + // CSS-based node selector support with the option of scoping searches + // to a particular sub-tree of a document. // - // 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` + // Supported Selectors: + // -------------------- // - // The underlay itself can be styled based on and id: - // | #myDialog_underlay { background-color:red; } + // acme supports a rich set of CSS3 selectors, including: // - // 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' dojoAttachPoint='node'></div></div>", - - // Parameters on creation or updatable later + // * class selectors (e.g., `.foo`) + // * node type selectors like `span` + // * ` ` descendant selectors + // * `>` child element selectors + // * `#foo` style ID selectors + // * `*` universal selector + // * `~`, the preceded-by sibling selector + // * `+`, the immediately preceded-by sibling selector + // * attribute queries: + // | * `[foo]` attribute presence selector + // | * `[foo='bar']` attribute value exact match + // | * `[foo~='bar']` attribute value list item match + // | * `[foo^='bar']` attribute start match + // | * `[foo$='bar']` attribute end match + // | * `[foo*='bar']` attribute substring match + // * `:first-child`, `:last-child`, and `:only-child` positional selectors + // * `:empty` content emtpy selector + // * `:checked` pseudo selector + // * `:nth-child(n)`, `:nth-child(2n+1)` style positional calculations + // * `:nth-child(even)`, `:nth-child(odd)` positional selectors + // * `:not(...)` negation pseudo selectors + // + // Any legal combination of these selectors will work with + // `dojo.query()`, including compound selectors ("," delimited). + // Very complex and useful searches can be constructed with this + // palette of selectors and when combined with functions for + // manipulation presented by dojo.NodeList, many types of DOM + // manipulation operations become very straightforward. + // + // Unsupported Selectors: + // ---------------------- + // + // While dojo.query handles many CSS3 selectors, some fall outside of + // what's reasonable for a programmatic node querying engine to + // handle. Currently unsupported selectors include: + // + // * namespace-differentiated selectors of any form + // * all `::` pseduo-element selectors + // * certain pseduo-selectors which don't get a lot of day-to-day use: + // | * `:root`, `:lang()`, `:target`, `:focus` + // * all visual and state selectors: + // | * `:root`, `:active`, `:hover`, `:visisted`, `:link`, + // `:enabled`, `:disabled` + // * `:*-of-type` pseudo selectors + // + // dojo.query and XML Documents: + // ----------------------------- + // + // `dojo.query` (as of dojo 1.2) supports searching XML documents + // in a case-sensitive manner. If an HTML document is served with + // a doctype that forces case-sensitivity (e.g., XHTML 1.1 + // Strict), dojo.query() will detect this and "do the right + // thing". Case sensitivity is dependent upon the document being + // searched and not the query used. It is therefore possible to + // use case-sensitive queries on strict sub-documents (iframes, + // etc.) or XML documents while still assuming case-insensitivity + // for a host/root document. + // + // Non-selector Queries: + // --------------------- + // + // If something other than a String is passed for the query, + // `dojo.query` will return a new `dojo.NodeList` instance + // constructed from that parameter alone and all further + // processing will stop. This means that if you have a reference + // to a node or NodeList, you can quickly construct a new NodeList + // from the original by calling `dojo.query(node)` or + // `dojo.query(list)`. + // + // query: + // The CSS3 expression to match against. For details on the syntax of + // CSS3 selectors, see <http://www.w3.org/TR/css3-selectors/#selectors> + // root: + // A DOMNode (or node id) to scope the search from. Optional. + // returns: Array + // example: + // search the entire document for elements with the class "foo": + // | dojo.query(".foo"); + // these elements will match: + // | <span class="foo"></span> + // | <span class="foo bar"></span> + // | <p class="thud foo"></p> + // example: + // search the entire document for elements with the classes "foo" *and* "bar": + // | dojo.query(".foo.bar"); + // these elements will match: + // | <span class="foo bar"></span> + // while these will not: + // | <span class="foo"></span> + // | <p class="thud foo"></p> + // example: + // find `<span>` elements which are descendants of paragraphs and + // which have a "highlighted" class: + // | dojo.query("p span.highlighted"); + // the innermost span in this fragment matches: + // | <p class="foo"> + // | <span>... + // | <span class="highlighted foo bar">...</span> + // | </span> + // | </p> + // example: + // set an "odd" class on all odd table rows inside of the table + // `#tabular_data`, using the `>` (direct child) selector to avoid + // affecting any nested tables: + // | dojo.query("#tabular_data > tbody > tr:nth-child(odd)").addClass("odd"); + // example: + // remove all elements with the class "error" from the document + // and store them in a list: + // | var errors = dojo.query(".error").orphan(); + // example: + // add an onclick handler to every submit button in the document + // which causes the form to be sent via Ajax instead: + // | dojo.query("input[type='submit']").onclick(function(e){ + // | dojo.stopEvent(e); // prevent sending the form + // | var btn = e.target; + // | dojo.xhrPost({ + // | form: btn.form, + // | load: function(data){ + // | // replace the form with the response + // | var div = dojo.doc.createElement("div"); + // | dojo.place(div, btn.form, "after"); + // | div.innerHTML = data; + // | dojo.style(btn.form, "display", "none"); + // | } + // | }); + // | }); - // dialogId: String - // Id of the dialog.... DialogUnderlay's id is based on this id - dialogId: "", + root = root||getDoc(); + var od = root.ownerDocument||root.documentElement; - // class: String - // This class name is used on the DialogUnderlay node, in addition to dijitDialogUnderlay - "class": "", + // throw the big case sensitivity switch - attributeMap: { id: "domNode" }, + // NOTE: + // Opera in XHTML mode doesn't detect case-sensitivity correctly + // and it's not clear that there's any way to test for it + caseSensitive = (root.contentType && root.contentType=="application/xml") || + (dojo.isOpera && (root.doctype || od.toString() == "[object XMLDocument]")) || + (!!od) && + (dojo.isIE ? od.xml : (root.xmlVersion || od.xmlVersion)); - _setDialogIdAttr: function(id){ - dojo.attr(this.node, "id", id + "_underlay"); - this._set("dialogId", id); - }, + // NOTE: + // adding "true" as the 2nd argument to getQueryFunc is useful for + // testing the DOM branch without worrying about the + // behavior/performance of the QSA branch. + var r = getQueryFunc(query)(root); - _setClassAttr: function(clazz){ - this.node.className = "dijitDialogUnderlay " + clazz; - this._set("class", clazz); - }, + // FIXME: + // need to investigate this branch WRT #8074 and #8075 + if(r && r.nozip){ + return r; + } + return _zip(r); // dojo.NodeList + }; + query.filter = function(/*Node[]*/ nodeList, /*String*/ filter, /*String|DOMNode?*/ root){ + // summary: + // function for filtering a NodeList based on a selector, optimized for simple selectors + var tmpNodeList = [], + parts = getQueryParts(filter), + filterFunc = + (parts.length == 1 && !/[^\w#\.]/.test(filter)) ? + getSimpleFilterFunc(parts[0]) : + function(node){ + return dojo.query(filter, root).indexOf(node) != -1; + }; + for(var x = 0, te; te = nodeList[x]; x++){ + if(filterFunc(te)){ tmpNodeList.push(te); } + } + return tmpNodeList; + }; + return query; +});//end defineQuery - postCreate: function(){ - // summary: - // Append the underlay to the body - dojo.body().appendChild(this.domNode); - }, +}, +'dojo/dnd/autoscroll':function(){ +define("dojo/dnd/autoscroll", ["../main", "../window"], function(dojo) { + // module: + // dojo/dnd/autoscroll + // summary: + // TODOC - 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 +dojo.getObject("dnd", true, dojo); - var is = this.node.style, - os = this.domNode.style; +dojo.dnd.getViewport = dojo.window.getBox; - // 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"; +dojo.dnd.V_TRIGGER_AUTOSCROLL = 32; +dojo.dnd.H_TRIGGER_AUTOSCROLL = 32; - // then resize and show - var viewport = dojo.window.getBox(); - os.top = viewport.t + "px"; - os.left = viewport.l + "px"; - is.width = viewport.w + "px"; - is.height = viewport.h + "px"; - os.display = "block"; - }, +dojo.dnd.V_AUTOSCROLL_VALUE = 16; +dojo.dnd.H_AUTOSCROLL_VALUE = 16; - show: function(){ - // summary: - // Show the dialog underlay - this.domNode.style.display = "block"; - this.layout(); - this.bgIframe = new dijit.BackgroundIframe(this.domNode); - }, +dojo.dnd.autoScroll = function(e){ + // summary: + // a handler for onmousemove event, which scrolls the window, if + // necesary + // e: Event + // onmousemove event - hide: function(){ - // summary: - // Hides the dialog underlay - this.bgIframe.destroy(); - delete this.bgIframe; - this.domNode.style.display = "none"; - } + // FIXME: needs more docs! + var v = dojo.window.getBox(), dx = 0, dy = 0; + if(e.clientX < dojo.dnd.H_TRIGGER_AUTOSCROLL){ + dx = -dojo.dnd.H_AUTOSCROLL_VALUE; + }else if(e.clientX > v.w - dojo.dnd.H_TRIGGER_AUTOSCROLL){ + dx = dojo.dnd.H_AUTOSCROLL_VALUE; } -); - -} - -if(!dojo._hasResource["dijit.layout._ContentPaneResizeMixin"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.layout._ContentPaneResizeMixin"] = true; -dojo.provide("dijit.layout._ContentPaneResizeMixin"); - - + if(e.clientY < dojo.dnd.V_TRIGGER_AUTOSCROLL){ + dy = -dojo.dnd.V_AUTOSCROLL_VALUE; + }else if(e.clientY > v.h - dojo.dnd.V_TRIGGER_AUTOSCROLL){ + dy = dojo.dnd.V_AUTOSCROLL_VALUE; + } + window.scrollBy(dx, dy); +}; +dojo.dnd._validNodes = {"div": 1, "p": 1, "td": 1}; +dojo.dnd._validOverflow = {"auto": 1, "scroll": 1}; -dojo.declare("dijit.layout._ContentPaneResizeMixin", null, { +dojo.dnd.autoScrollNodes = function(e){ // 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 + // a handler for onmousemove event, which scrolls the first avaialble + // Dom element, it falls back to dojo.dnd.autoScroll() + // e: Event + // onmousemove event - // 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, + // FIXME: needs more docs! - // isContainer: [protected] Boolean - // Indicates that this widget acts as a "parent" to the descendant widgets. - // When the parent is started it will call startup() on the child widgets. - // See also `isLayoutContainer`. - isContainer: true, + var b, t, w, h, rx, ry, dx = 0, dy = 0, oldLeft, oldTop; - // isLayoutContainer: [protected] Boolean - // Indicates that this widget will call resize() on it's child widgets - // when they become visible. - isLayoutContainer: true, - - _startChildren: function(){ - // summary: - // Call startup() on all children including non _Widget ones like dojo.dnd.Source objects - - // This starts all the widgets - dojo.forEach(this.getChildren(), function(child){ - child.startup(); - child._started = true; - }); - }, - - startup: function(){ - // summary: - // See `dijit.layout._LayoutWidget.startup` for description. - // Although ContentPane doesn't extend _LayoutWidget, it does implement - // the same API. + for(var n = e.target; n;){ + if(n.nodeType == 1 && (n.tagName.toLowerCase() in dojo.dnd._validNodes)){ + var s = dojo.getComputedStyle(n), + overflow = (s.overflow.toLowerCase() in dojo.dnd._validOverflow), + overflowX = (s.overflowX.toLowerCase() in dojo.dnd._validOverflow), + overflowY = (s.overflowY.toLowerCase() in dojo.dnd._validOverflow); + if(overflow || overflowX || overflowY){ + b = dojo._getContentBox(n, s); + t = dojo.position(n, true); + } + // overflow-x + if(overflow || overflowX){ + w = Math.min(dojo.dnd.H_TRIGGER_AUTOSCROLL, b.w / 2); + rx = e.pageX - t.x; + if(dojo.isWebKit || dojo.isOpera){ + // FIXME: this code should not be here, it should be taken into account + // either by the event fixing code, or the dojo.position() + // FIXME: this code doesn't work on Opera 9.5 Beta + rx += dojo.body().scrollLeft; + } + dx = 0; + if(rx > 0 && rx < b.w){ + if(rx < w){ + dx = -w; + }else if(rx > b.w - w){ + dx = w; + } + oldLeft = n.scrollLeft; + n.scrollLeft = n.scrollLeft + dx; + } + } + // overflow-y + if(overflow || overflowY){ + //console.log(b.l, b.t, t.x, t.y, n.scrollLeft, n.scrollTop); + h = Math.min(dojo.dnd.V_TRIGGER_AUTOSCROLL, b.h / 2); + ry = e.pageY - t.y; + if(dojo.isWebKit || dojo.isOpera){ + // FIXME: this code should not be here, it should be taken into account + // either by the event fixing code, or the dojo.position() + // FIXME: this code doesn't work on Opera 9.5 Beta + ry += dojo.body().scrollTop; + } + dy = 0; + if(ry > 0 && ry < b.h){ + if(ry < h){ + dy = -h; + }else if(ry > b.h - h){ + dy = h; + } + oldTop = n.scrollTop; + n.scrollTop = n.scrollTop + dy; + } + } + if(dx || dy){ return; } + } + try{ + n = n.parentNode; + }catch(x){ + n = null; + } + } + dojo.dnd.autoScroll(e); +}; - if(this._started){ return; } + return dojo.dnd; +}); - var parent = dijit._Contained.prototype.getParent.call(this); - this._childOfLayoutWidget = parent && parent.isLayoutContainer; +}, +'dojo/data/ItemFileWriteStore':function(){ +define("dojo/data/ItemFileWriteStore", ["../_base/lang", "../_base/declare", "../_base/array", "../_base/json", "../_base/window", + "./ItemFileReadStore", "../date/stamp" +], function(lang, declare, arrayUtil, jsonUtil, window, ItemFileReadStore, dateStamp) { + // module: + // dojo/data/ItemFileWriteStore + // summary: + // TODOC - // 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; +/*===== var ItemFileReadStore = dojo.data.ItemFileReadStore; =====*/ +return declare("dojo.data.ItemFileWriteStore", ItemFileReadStore, { + constructor: function(/* object */ keywordParameters){ + // keywordParameters: {typeMap: object) + // The structure of the typeMap object is as follows: + // { + // type0: function || object, + // type1: function || object, + // ... + // typeN: function || object + // } + // Where if it is a function, it is assumed to be an object constructor that takes the + // value of _value as the initialization parameters. It is serialized assuming object.toString() + // serialization. If it is an object, then it is assumed + // to be an object of general form: + // { + // type: function, //constructor. + // deserialize: function(value) //The function that parses the value and constructs the object defined by type appropriately. + // serialize: function(object) //The function that converts the object back into the proper file format form. + // } - this.inherited(arguments); + // ItemFileWriteStore extends ItemFileReadStore to implement these additional dojo.data APIs + this._features['dojo.data.api.Write'] = true; + this._features['dojo.data.api.Notification'] = true; - this._startChildren(); + // For keeping track of changes so that we can implement isDirty and revert + this._pending = { + _newItems:{}, + _modifiedItems:{}, + _deletedItems:{} + }; - if(this._isShown()){ - this._onShow(); + if(!this._datatypeMap['Date'].serialize){ + this._datatypeMap['Date'].serialize = function(obj){ + return dateStamp.toISOString(obj, {zulu:true}); + }; } - - if(!this._childOfLayoutWidget){ - // If my parent isn't a layout container, since my style *may be* width=height=100% - // or something similar (either set directly or via a CSS class), - // monitor when my size changes so that I can re-layout. - // For browsers where I can't directly monitor when my size changes, - // monitor when the viewport changes size, which *may* indicate a size change for me. - this.connect(dojo.isIE ? this.domNode : dojo.global, 'onresize', function(){ - // Using function(){} closure to ensure no arguments to resize. - this._needLayout = !this._childOfLayoutWidget; - this.resize(); - }); + //Disable only if explicitly set to false. + if(keywordParameters && (keywordParameters.referenceIntegrity === false)){ + this.referenceIntegrity = false; } - }, - - _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 childNodes = dojo.query("> *", this.containerNode).filter(function(node){ - return node.tagName !== "SCRIPT"; // or a regexp for hidden elements like script|area|map|etc.. - }), - childWidgetNodes = childNodes.filter(function(node){ - return dojo.hasAttr(node, "data-dojo-type") || dojo.hasAttr(node, "dojoType") || dojo.hasAttr(node, "widgetId"); - }), - candidateWidgets = dojo.filter(childWidgetNodes.map(dijit.byNode), function(widget){ - return widget && widget.domNode && widget.resize; - }); + // this._saveInProgress is set to true, briefly, from when save() is first called to when it completes + this._saveInProgress = false; + }, - if( - // all child nodes are widgets - childNodes.length == childWidgetNodes.length && + referenceIntegrity: true, //Flag that defaultly enabled reference integrity tracking. This way it can also be disabled pogrammatially or declaratively. - // all but one are invisible (like dojo.data) - candidateWidgets.length == 1 - ){ - this._singleChild = candidateWidgets[0]; - }else{ - delete this._singleChild; + _assert: function(/* boolean */ condition){ + if(!condition){ + throw new Error("assertion failed in ItemFileWriteStore"); } + }, - // So we can set overflow: hidden to avoid a safari bug w/scrollbars showing up (#9449) - dojo.toggleClass(this.containerNode, this.baseClass + "SingleChild", !!this._singleChild); + _getIdentifierAttribute: function(){ + // this._assert((identifierAttribute === Number) || (dojo.isString(identifierAttribute))); + return this.getFeatures()['dojo.data.api.Identity']; }, - resize: function(changeSize, resultSize){ - // summary: - // See `dijit.layout._LayoutWidget.resize` for description. - // Although ContentPane doesn't extend _LayoutWidget, it does implement - // the same API. - // For the TabContainer --> BorderContainer --> ContentPane case, _onShow() is - // never called, 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(); - } +/* dojo.data.api.Write */ - this._resizeCalled = true; + newItem: function(/* Object? */ keywordArgs, /* Object? */ parentInfo){ + // summary: See dojo.data.api.Write.newItem() - this._scheduleLayout(changeSize, resultSize); - }, + this._assert(!this._saveInProgress); - _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; + if(!this._loadFinished){ + // We need to do this here so that we'll be able to find out what + // identifierAttribute was specified in the data file. + this._forceLoad(); } - }, - - _layout: function(changeSize, resultSize){ - // summary: - // Resize myself according to optional changeSize/resultSize parameters, like a layout widget. - // Also, since I am a Container widget, each of my children expects me to - // call resize() or layout() on them. - // - // 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 - // Set margin box size, unless it wasn't specified, in which case use current size. - if(changeSize){ - dojo.marginBox(this.domNode, changeSize); + if(typeof keywordArgs != "object" && typeof keywordArgs != "undefined"){ + throw new Error("newItem() was passed something other than an object"); } - - // 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 || {}; - dojo.mixin(mb, changeSize || {}); // changeSize overrides resultSize - if(!("h" in mb) || !("w" in mb)){ - mb = dojo.mixin(dojo.marginBox(cn), mb); // just use dojo.marginBox() to fill in missing values - } - this._contentBox = dijit.layout.marginBox2contentBox(cn, mb); + var newIdentity = null; + var identifierAttribute = this._getIdentifierAttribute(); + if(identifierAttribute === Number){ + newIdentity = this._arrayOfAllItems.length; }else{ - this._contentBox = dojo.contentBox(cn); + newIdentity = keywordArgs[identifierAttribute]; + if(typeof newIdentity === "undefined"){ + throw new Error("newItem() was not passed an identity for the new item"); + } + if(lang.isArray(newIdentity)){ + throw new Error("newItem() was not passed an single-valued identity"); + } } - this._layoutChildren(); - - delete this._needLayout; - }, - - _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(); + // make sure this identity is not already in use by another item, if identifiers were + // defined in the file. Otherwise it would be the item count, + // which should always be unique in this case. + if(this._itemsByIdentity){ + this._assert(typeof this._itemsByIdentity[newIdentity] === "undefined"); } + this._assert(typeof this._pending._newItems[newIdentity] === "undefined"); + this._assert(typeof this._pending._deletedItems[newIdentity] === "undefined"); - if(this._singleChild && this._singleChild.resize){ - var cb = this._contentBox || dojo.contentBox(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. - dojo.forEach(this.getChildren(), function(widget){ - if(widget.resize){ - widget.resize(); - } - }); + var newItem = {}; + newItem[this._storeRefPropName] = this; + newItem[this._itemNumPropName] = this._arrayOfAllItems.length; + if(this._itemsByIdentity){ + this._itemsByIdentity[newIdentity] = newItem; + //We have to set the identifier now, otherwise we can't look it + //up at calls to setValueorValues in parentInfo handling. + newItem[identifierAttribute] = [newIdentity]; } - }, + this._arrayOfAllItems.push(newItem); - _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 + //We need to construct some data for the onNew call too... + var pInfo = null; - 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; + // Now we need to check to see where we want to assign this thingm if any. + if(parentInfo && parentInfo.parent && parentInfo.attribute){ + pInfo = { + item: parentInfo.parent, + attribute: parentInfo.attribute, + oldValue: undefined + }; + + //See if it is multi-valued or not and handle appropriately + //Generally, all attributes are multi-valued for this store + //So, we only need to append if there are already values present. + var values = this.getValues(parentInfo.parent, parentInfo.attribute); + if(values && values.length > 0){ + var tempValues = values.slice(0, values.length); + if(values.length === 1){ + pInfo.oldValue = values[0]; + }else{ + pInfo.oldValue = values.slice(0, values.length); + } + tempValues.push(newItem); + this._setValueOrValues(parentInfo.parent, parentInfo.attribute, tempValues, false); + pInfo.newValue = this.getValues(parentInfo.parent, parentInfo.attribute); + }else{ + this._setValueOrValues(parentInfo.parent, parentInfo.attribute, newItem, false); + pInfo.newValue = newItem; } - 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') && !dojo.hasClass(node, "dijitHidden") && - parent && parent.style && (parent.style.display != 'none'); + //Toplevel item, add to both top list as well as all list. + newItem[this._rootItemPropName]=true; + this._arrayOfTopLevelItems.push(newItem); } - }, - _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) + this._pending._newItems[newIdentity] = newItem; - if(this._needLayout){ - // If a layout has been scheduled for when we become visible, do it now - this._layout(this._changeSize, this._resultSize); + //Clone over the properties to the new item + for(var key in keywordArgs){ + if(key === this._storeRefPropName || key === this._itemNumPropName){ + // Bummer, the user is trying to do something like + // newItem({_S:"foo"}). Unfortunately, our superclass, + // ItemFileReadStore, is already using _S in each of our items + // to hold private info. To avoid a naming collision, we + // need to move all our private info to some other property + // of all the items/objects. So, we need to iterate over all + // the items and do something like: + // item.__S = item._S; + // item._S = undefined; + // But first we have to make sure the new "__S" variable is + // not in use, which means we have to iterate over all the + // items checking for that. + throw new Error("encountered bug in ItemFileWriteStore.newItem"); + } + var value = keywordArgs[key]; + if(!lang.isArray(value)){ + value = [value]; + } + newItem[key] = value; + if(this.referenceIntegrity){ + for(var i = 0; i < value.length; i++){ + var val = value[i]; + if(this.isItem(val)){ + this._addReferenceToMap(val, newItem, key); + } + } + } } + this.onNew(newItem, pInfo); // dojo.data.api.Notification call + return newItem; // item + }, - this.inherited(arguments); - - // 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(!dojo._hasResource["dojo.html"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.html"] = true; -dojo.provide("dojo.html"); + _removeArrayElement: function(/* Array */ array, /* anything */ element){ + var index = arrayUtil.indexOf(array, element); + if(index != -1){ + array.splice(index, 1); + return true; + } + return false; + }, + deleteItem: function(/* item */ item){ + // summary: See dojo.data.api.Write.deleteItem() + this._assert(!this._saveInProgress); + this._assertIsItem(item); -dojo.getObject("html", true, dojo); + // Remove this item from the _arrayOfAllItems, but leave a null value in place + // of the item, so as not to change the length of the array, so that in newItem() + // we can still safely do: newIdentity = this._arrayOfAllItems.length; + var indexInArrayOfAllItems = item[this._itemNumPropName]; + var identity = this.getIdentity(item); -// the parser might be needed.. -(function(){ // private scope, sort of a namespace + //If we have reference integrity on, we need to do reference cleanup for the deleted item + if(this.referenceIntegrity){ + //First scan all the attributes of this items for references and clean them up in the map + //As this item is going away, no need to track its references anymore. - // idCounter is incremented with each instantiation to allow asignment of a unique id for tracking, logging purposes - var idCounter = 0, - d = dojo; - - dojo.html._secureForInnerHtml = function(/*String*/ cont){ - // summary: - // removes !DOCTYPE and title elements from the html string. - // - // khtml is picky about dom faults, you can't attach a style or <title> node as child of body - // must go into head, so we need to cut out those tags - // cont: - // An html string for insertion into the dom - // - return cont.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig, ""); // String - }; + //Get the attributes list before we generate the backup so it + //doesn't pollute the attributes list. + var attributes = this.getAttributes(item); -/*==== - dojo.html._emptyNode = function(node){ - // summary: - // removes all child nodes from the given node - // node: DOMNode - // the parent element - }; -=====*/ - dojo.html._emptyNode = dojo.empty; + //Backup the map, we'll have to restore it potentially, in a revert. + if(item[this._reverseRefMap]){ + item["backup_" + this._reverseRefMap] = lang.clone(item[this._reverseRefMap]); + } - dojo.html._setNodeContent = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont){ - // summary: - // inserts the given content into the given node - // node: - // the parent element - // content: - // the content to be set on the parent element. - // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes - - // always empty - d.empty(node); + //TODO: This causes a reversion problem. This list won't be restored on revert since it is + //attached to the 'value'. item, not ours. Need to back tese up somehow too. + //Maybe build a map of the backup of the entries and attach it to the deleted item to be restored + //later. Or just record them and call _addReferenceToMap on them in revert. + arrayUtil.forEach(attributes, function(attribute){ + arrayUtil.forEach(this.getValues(item, attribute), function(value){ + if(this.isItem(value)){ + //We have to back up all the references we had to others so they can be restored on a revert. + if(!item["backupRefs_" + this._reverseRefMap]){ + item["backupRefs_" + this._reverseRefMap] = []; + } + item["backupRefs_" + this._reverseRefMap].push({id: this.getIdentity(value), attr: attribute}); + this._removeReferenceFromMap(value, item, attribute); + } + }, this); + }, this); - if(cont) { - if(typeof cont == "string") { - cont = d._toDom(cont, node.ownerDocument); - } - if(!cont.nodeType && d.isArrayLike(cont)) { - // handle as enumerable, but it may shrink as we enumerate it - for(var startlen=cont.length, i=0; i<cont.length; i=startlen==cont.length ? i+1 : 0) { - d.place( cont[i], node, "last"); + //Next, see if we have references to this item, if we do, we have to clean them up too. + var references = item[this._reverseRefMap]; + if(references){ + //Look through all the items noted as references to clean them up. + for(var itemId in references){ + var containingItem = null; + if(this._itemsByIdentity){ + containingItem = this._itemsByIdentity[itemId]; + }else{ + containingItem = this._arrayOfAllItems[itemId]; + } + //We have a reference to a containing item, now we have to process the + //attributes and clear all references to the item being deleted. + if(containingItem){ + for(var attribute in references[itemId]){ + var oldValues = this.getValues(containingItem, attribute) || []; + var newValues = arrayUtil.filter(oldValues, function(possibleItem){ + return !(this.isItem(possibleItem) && this.getIdentity(possibleItem) == identity); + }, this); + //Remove the note of the reference to the item and set the values on the modified attribute. + this._removeReferenceFromMap(item, containingItem, attribute); + if(newValues.length < oldValues.length){ + this._setValueOrValues(containingItem, attribute, newValues, true); + } + } + } } - } else { - // pass nodes, documentFragments and unknowns through to dojo.place - d.place(cont, node, "last"); } } - // return DomNode - return node; - }; + this._arrayOfAllItems[indexInArrayOfAllItems] = null; - // we wrap up the content-setting operation in a object - dojo.declare("dojo.html._ContentSetter", null, - { - // node: DomNode|String - // An node which will be the parent element that we set content into - node: "", + item[this._storeRefPropName] = null; + if(this._itemsByIdentity){ + delete this._itemsByIdentity[identity]; + } + this._pending._deletedItems[identity] = item; - // content: String|DomNode|DomNode[] - // The content to be placed in the node. Can be an HTML string, a node reference, or a enumerable list of nodes - content: "", - - // id: String? - // Usually only used internally, and auto-generated with each instance - id: "", + //Remove from the toplevel items, if necessary... + if(item[this._rootItemPropName]){ + this._removeArrayElement(this._arrayOfTopLevelItems, item); + } + this.onDelete(item); // dojo.data.api.Notification call + return true; + }, - // cleanContent: Boolean - // Should the content be treated as a full html document, - // and the real content stripped of <html>, <body> wrapper before injection - cleanContent: false, - - // extractContent: Boolean - // Should the content be treated as a full html document, and the real content stripped of <html>, <body> wrapper before injection - extractContent: false, + setValue: function(/* item */ item, /* attribute-name-string */ attribute, /* almost anything */ value){ + // summary: See dojo.data.api.Write.set() + return this._setValueOrValues(item, attribute, value, true); // boolean + }, - // parseContent: Boolean - // Should the node by passed to the parser after the new content is set - parseContent: false, + setValues: function(/* item */ item, /* attribute-name-string */ attribute, /* array */ values){ + // summary: See dojo.data.api.Write.setValues() + return this._setValueOrValues(item, attribute, values, true); // boolean + }, - // 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: dojo._scopeName, + unsetAttribute: function(/* item */ item, /* attribute-name-string */ attribute){ + // summary: See dojo.data.api.Write.unsetAttribute() + return this._setValueOrValues(item, attribute, [], true); + }, - // startup: Boolean - // Start the child widgets after parsing them. Only obeyed if parseContent is true. - startup: true, - - // lifecyle methods - constructor: function(/* Object */params, /* String|DomNode */node){ - // summary: - // Provides a configurable, extensible object to wrap the setting on content on a node - // call the set() method to actually set the content.. - - // the original params are mixed directly into the instance "this" - dojo.mixin(this, params || {}); + _setValueOrValues: function(/* item */ item, /* attribute-name-string */ attribute, /* anything */ newValueOrValues, /*boolean?*/ callOnSet){ + this._assert(!this._saveInProgress); - // give precedence to params.node vs. the node argument - // and ensure its a node, not an id string - node = this.node = dojo.byId( this.node || node ); - - if(!this.id){ - this.id = [ - "Setter", - (node) ? node.id || node.tagName : "", - idCounter++ - ].join("_"); - } - }, - set: function(/* String|DomNode|NodeList? */ cont, /* Object? */ params){ - // summary: - // front-end to the set-content sequence - // cont: - // An html string, node or enumerable list of nodes for insertion into the dom - // If not provided, the object's content property will be used - if(undefined !== cont){ - this.content = cont; - } - // in the re-use scenario, set needs to be able to mixin new configuration - if(params){ - this._mixin(params); + // Check for valid arguments + this._assertIsItem(item); + this._assert(lang.isString(attribute)); + this._assert(typeof newValueOrValues !== "undefined"); + + // Make sure the user isn't trying to change the item's identity + var identifierAttribute = this._getIdentifierAttribute(); + if(attribute == identifierAttribute){ + throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier."); + } + + // To implement the Notification API, we need to make a note of what + // the old attribute value was, so that we can pass that info when + // we call the onSet method. + var oldValueOrValues = this._getValueOrValues(item, attribute); + + var identity = this.getIdentity(item); + if(!this._pending._modifiedItems[identity]){ + // Before we actually change the item, we make a copy of it to + // record the original state, so that we'll be able to revert if + // the revert method gets called. If the item has already been + // modified then there's no need to do this now, since we already + // have a record of the original state. + var copyOfItemState = {}; + for(var key in item){ + if((key === this._storeRefPropName) || (key === this._itemNumPropName) || (key === this._rootItemPropName)){ + copyOfItemState[key] = item[key]; + }else if(key === this._reverseRefMap){ + copyOfItemState[key] = lang.clone(item[key]); + }else{ + copyOfItemState[key] = item[key].slice(0, item[key].length); } + } + // Now mark the item as dirty, and save the copy of the original state + this._pending._modifiedItems[identity] = copyOfItemState; + } - this.onBegin(); - this.setContent(); - this.onEnd(); + // Okay, now we can actually change this attribute on the item + var success = false; - return this.node; - }, - setContent: function(){ - // summary: - // sets the content on the node + if(lang.isArray(newValueOrValues) && newValueOrValues.length === 0){ - var node = this.node; - if(!node) { - // can't proceed - throw new Error(this.declaredClass + ": setContent given no node"); + // If we were passed an empty array as the value, that counts + // as "unsetting" the attribute, so we need to remove this + // attribute from the item. + success = delete item[attribute]; + newValueOrValues = undefined; // used in the onSet Notification call below + + if(this.referenceIntegrity && oldValueOrValues){ + var oldValues = oldValueOrValues; + if(!lang.isArray(oldValues)){ + oldValues = [oldValues]; } - try{ - node = dojo.html._setNodeContent(node, this.content); - }catch(e){ - // check if a domfault occurs when we are appending this.errorMessage - // like for instance if domNode is a UL and we try append a DIV - - // FIXME: need to allow the user to provide a content error message string - var errMess = this.onContentError(e); - try{ - node.innerHTML = errMess; - }catch(e){ - console.error('Fatal ' + this.declaredClass + '.setContent could not change content due to '+e.message, e); + for(var i = 0; i < oldValues.length; i++){ + var value = oldValues[i]; + if(this.isItem(value)){ + this._removeReferenceFromMap(value, item, attribute); } } - // always put back the node for the next method - this.node = node; // DomNode - }, - - empty: function() { - // summary - // cleanly empty out existing content + } + }else{ + var newValueArray; + if(lang.isArray(newValueOrValues)){ + // Unfortunately, it's not safe to just do this: + // newValueArray = newValueOrValues; + // Instead, we need to copy the array, which slice() does very nicely. + // This is so that our internal data structure won't + // get corrupted if the user mucks with the values array *after* + // calling setValues(). + newValueArray = newValueOrValues.slice(0, newValueOrValues.length); + }else{ + newValueArray = [newValueOrValues]; + } - // destroy any widgets from a previous run - // NOTE: if you dont want this you'll need to empty - // the parseResults array property yourself to avoid bad things happenning - if(this.parseResults && this.parseResults.length) { - dojo.forEach(this.parseResults, function(w) { - if(w.destroy){ - w.destroy(); + //We need to handle reference integrity if this is on. + //In the case of set, we need to see if references were added or removed + //and update the reference tracking map accordingly. + if(this.referenceIntegrity){ + if(oldValueOrValues){ + var oldValues = oldValueOrValues; + if(!lang.isArray(oldValues)){ + oldValues = [oldValues]; + } + //Use an associative map to determine what was added/removed from the list. + //Should be O(n) performant. First look at all the old values and make a list of them + //Then for any item not in the old list, we add it. If it was already present, we remove it. + //Then we pass over the map and any references left it it need to be removed (IE, no match in + //the new values list). + var map = {}; + arrayUtil.forEach(oldValues, function(possibleItem){ + if(this.isItem(possibleItem)){ + var id = this.getIdentity(possibleItem); + map[id.toString()] = true; } - }); - delete this.parseResults; - } - // this is fast, but if you know its already empty or safe, you could - // override empty to skip this step - dojo.html._emptyNode(this.node); - }, - - onBegin: function(){ - // summary - // Called after instantiation, but before set(); - // It allows modification of any of the object properties - // - including the node and content provided - before the set operation actually takes place - // This default implementation checks for cleanContent and extractContent flags to - // optionally pre-process html string content - var cont = this.content; - - if(dojo.isString(cont)){ - if(this.cleanContent){ - cont = dojo.html._secureForInnerHtml(cont); + }, this); + arrayUtil.forEach(newValueArray, function(possibleItem){ + if(this.isItem(possibleItem)){ + var id = this.getIdentity(possibleItem); + if(map[id.toString()]){ + delete map[id.toString()]; + }else{ + this._addReferenceToMap(possibleItem, item, attribute); + } + } + }, this); + for(var rId in map){ + var removedItem; + if(this._itemsByIdentity){ + removedItem = this._itemsByIdentity[rId]; + }else{ + removedItem = this._arrayOfAllItems[rId]; + } + this._removeReferenceFromMap(removedItem, item, attribute); } - - if(this.extractContent){ - var match = cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im); - if(match){ cont = match[1]; } + }else{ + //Everything is new (no old values) so we have to just + //insert all the references, if any. + for(var i = 0; i < newValueArray.length; i++){ + var value = newValueArray[i]; + if(this.isItem(value)){ + this._addReferenceToMap(value, item, attribute); + } } } + } + item[attribute] = newValueArray; + success = true; + } - // clean out the node and any cruft associated with it - like widgets - this.empty(); - - this.content = cont; - return this.node; /* DomNode */ - }, - - onEnd: function(){ - // summary - // Called after set(), when the new content has been pushed into the node - // It provides an opportunity for post-processing before handing back the node to the caller - // This default implementation checks a parseContent flag to optionally run the dojo parser over the new content - if(this.parseContent){ - // populates this.parseResults if you need those.. - this._parse(); - } - return this.node; /* DomNode */ - }, - - tearDown: function(){ - // summary - // manually reset the Setter instance if its being re-used for example for another set() - // description - // tearDown() is not called automatically. - // In normal use, the Setter instance properties are simply allowed to fall out of scope - // but the tearDown method can be called to explicitly reset this instance. - delete this.parseResults; - delete this.node; - delete this.content; - }, - - onContentError: function(err){ - return "Error occured setting content: " + err; - }, - - _mixin: function(params){ - // mix properties/methods into the instance - // TODO: the intention with tearDown is to put the Setter's state - // back to that of the original constructor (vs. deleting/resetting everything regardless of ctor params) - // so we could do something here to move the original properties aside for later restoration - var empty = {}, key; - for(key in params){ - if(key in empty){ continue; } - // TODO: here's our opportunity to mask the properties we dont consider configurable/overridable - // .. but history shows we'll almost always guess wrong - this[key] = params[key]; - } - }, - _parse: function(){ - // summary: - // runs the dojo parser over the node contents, storing any results in this.parseResults - // Any errors resulting from parsing are passed to _onError for handling + // Now we make the dojo.data.api.Notification call + if(callOnSet){ + this.onSet(item, attribute, oldValueOrValues, newValueOrValues); + } + return success; // boolean + }, - var rootNode = this.node; - try{ - // store the results (widgets, whatever) for potential retrieval - var inherited = {}; - dojo.forEach(["dir", "lang", "textDir"], function(name){ - if(this[name]){ - inherited[name] = this[name]; - } - }, this); - this.parseResults = dojo.parser.parse({ - rootNode: rootNode, - noStart: !this.startup, - inherited: inherited, - scope: this.parserScope - }); - }catch(e){ - this._onError('Content', e, "Error parsing in _ContentSetter#"+this.id); - } - }, - - _onError: function(type, err, consoleText){ - // summary: - // shows user the string that is returned by on[type]Error - // overide/implement 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 - dojo.html._setNodeContent(this.node, errText, true); + _addReferenceToMap: function(/* item */ refItem, /* item */ parentItem, /* string */ attribute){ + // summary: + // Method to add an reference map entry for an item and attribute. + // description: + // Method to add an reference map entry for an item and attribute. // + // refItem: + // The item that is referenced. + // parentItem: + // The item that holds the new reference to refItem. + // attribute: + // The attribute on parentItem that contains the new reference. + + var parentId = this.getIdentity(parentItem); + var references = refItem[this._reverseRefMap]; + + if(!references){ + references = refItem[this._reverseRefMap] = {}; + } + var itemRef = references[parentId]; + if(!itemRef){ + itemRef = references[parentId] = {}; + } + itemRef[attribute] = true; + }, + + _removeReferenceFromMap: function(/* item */ refItem, /* item */ parentItem, /* string */ attribute){ + // summary: + // Method to remove an reference map entry for an item and attribute. + // description: + // Method to remove an reference map entry for an item and attribute. This will + // also perform cleanup on the map such that if there are no more references at all to + // the item, its reference object and entry are removed. + // + // refItem: + // The item that is referenced. + // parentItem: + // The item holding a reference to refItem. + // attribute: + // The attribute on parentItem that contains the reference. + var identity = this.getIdentity(parentItem); + var references = refItem[this._reverseRefMap]; + var itemId; + if(references){ + for(itemId in references){ + if(itemId == identity){ + delete references[itemId][attribute]; + if(this._isEmpty(references[itemId])){ + delete references[itemId]; + } } } - }); // end dojo.declare() + if(this._isEmpty(references)){ + delete refItem[this._reverseRefMap]; + } + } + }, - dojo.html.set = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont, /* Object? */ params){ - // summary: - // inserts (replaces) the given content into the given node. dojo.place(cont, node, "only") - // may be a better choice for simple HTML insertion. - // description: - // Unless you need to use the params capabilities of this method, you should use - // dojo.place(cont, node, "only"). dojo.place() has more robust support for injecting - // an HTML string into the DOM, but it only handles inserting an HTML string as DOM - // elements, or inserting a DOM node. dojo.place does not handle NodeList insertions - // or the other capabilities as defined by the params object for this method. - // node: - // the parent element that will receive the content - // cont: - // the content to be set on the parent element. - // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes - // params: - // Optional flags/properties to configure the content-setting. See dojo.html._ContentSetter - // example: - // A safe string/node/nodelist content replacement/injection with hooks for extension - // Example Usage: - // dojo.html.set(node, "some string"); - // dojo.html.set(node, contentNode, {options}); - // dojo.html.set(node, myNode.childNodes, {options}); - if(undefined == cont){ - console.warn("dojo.html.set: no cont argument provided, using empty string"); - cont = ""; + _dumpReferenceMap: function(){ + // summary: + // Function to dump the reverse reference map of all items in the store for debug purposes. + // description: + // Function to dump the reverse reference map of all items in the store for debug purposes. + var i; + for(i = 0; i < this._arrayOfAllItems.length; i++){ + var item = this._arrayOfAllItems[i]; + if(item && item[this._reverseRefMap]){ + console.log("Item: [" + this.getIdentity(item) + "] is referenced by: " + jsonUtil.toJson(item[this._reverseRefMap])); + } } - if(!params){ - // simple and fast - return dojo.html._setNodeContent(node, cont, true); + }, + + _getValueOrValues: function(/* item */ item, /* attribute-name-string */ attribute){ + var valueOrValues = undefined; + if(this.hasAttribute(item, attribute)){ + var valueArray = this.getValues(item, attribute); + if(valueArray.length == 1){ + valueOrValues = valueArray[0]; + }else{ + valueOrValues = valueArray; + } + } + return valueOrValues; + }, + + _flatten: function(/* anything */ value){ + if(this.isItem(value)){ + // Given an item, return an serializable object that provides a + // reference to the item. + // For example, given kermit: + // var kermit = store.newItem({id:2, name:"Kermit"}); + // we want to return + // {_reference:2} + return {_reference: this.getIdentity(value)}; }else{ - // more options but slower - // note the arguments are reversed in order, to match the convention for instantiation via the parser - var op = new dojo.html._ContentSetter(dojo.mixin( - params, - { content: cont, node: node } - )); - return op.set(); + if(typeof value === "object"){ + for(var type in this._datatypeMap){ + var typeMap = this._datatypeMap[type]; + if(lang.isObject(typeMap) && !lang.isFunction(typeMap)){ + if(value instanceof typeMap.type){ + if(!typeMap.serialize){ + throw new Error("ItemFileWriteStore: No serializer defined for type mapping: [" + type + "]"); + } + return {_type: type, _value: typeMap.serialize(value)}; + } + } else if(value instanceof typeMap){ + //SImple mapping, therefore, return as a toString serialization. + return {_type: type, _value: value.toString()}; + } + } + } + return value; } - }; -})(); + }, -} + _getNewFileContentString: function(){ + // summary: + // Generate a string that can be saved to a file. + // The result should look similar to: + // http://trac.dojotoolkit.org/browser/dojo/trunk/tests/data/countries.json + var serializableStructure = {}; -if(!dojo._hasResource["dijit.layout.ContentPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.layout.ContentPane"] = true; -dojo.provide("dijit.layout.ContentPane"); + var identifierAttribute = this._getIdentifierAttribute(); + if(identifierAttribute !== Number){ + serializableStructure.identifier = identifierAttribute; + } + if(this._labelAttr){ + serializableStructure.label = this._labelAttr; + } + serializableStructure.items = []; + for(var i = 0; i < this._arrayOfAllItems.length; ++i){ + var item = this._arrayOfAllItems[i]; + if(item !== null){ + var serializableItem = {}; + for(var key in item){ + if(key !== this._storeRefPropName && key !== this._itemNumPropName && key !== this._reverseRefMap && key !== this._rootItemPropName){ + var valueArray = this.getValues(item, key); + if(valueArray.length == 1){ + serializableItem[key] = this._flatten(valueArray[0]); + }else{ + var serializableArray = []; + for(var j = 0; j < valueArray.length; ++j){ + serializableArray.push(this._flatten(valueArray[j])); + serializableItem[key] = serializableArray; + } + } + } + } + serializableStructure.items.push(serializableItem); + } + } + var prettyPrint = true; + return jsonUtil.toJson(serializableStructure, prettyPrint); + }, + _isEmpty: function(something){ + // summary: + // Function to determine if an array or object has no properties or values. + // something: + // The array or object to examine. + var empty = true; + if(lang.isObject(something)){ + var i; + for(i in something){ + empty = false; + break; + } + }else if(lang.isArray(something)){ + if(something.length > 0){ + empty = false; + } + } + return empty; //boolean + }, + save: function(/* object */ keywordArgs){ + // summary: See dojo.data.api.Write.save() + this._assert(!this._saveInProgress); + // this._saveInProgress is set to true, briefly, from when save is first called to when it completes + this._saveInProgress = true; + var self = this; + var saveCompleteCallback = function(){ + self._pending = { + _newItems:{}, + _modifiedItems:{}, + _deletedItems:{} + }; + self._saveInProgress = false; // must come after this._pending is cleared, but before any callbacks + if(keywordArgs && keywordArgs.onComplete){ + var scope = keywordArgs.scope || window.global; + keywordArgs.onComplete.call(scope); + } + }; + var saveFailedCallback = function(err){ + self._saveInProgress = false; + if(keywordArgs && keywordArgs.onError){ + var scope = keywordArgs.scope || window.global; + keywordArgs.onError.call(scope, err); + } + }; + if(this._saveEverything){ + var newFileContentString = this._getNewFileContentString(); + this._saveEverything(saveCompleteCallback, saveFailedCallback, newFileContentString); + } + if(this._saveCustom){ + this._saveCustom(saveCompleteCallback, saveFailedCallback); + } + if(!this._saveEverything && !this._saveCustom){ + // Looks like there is no user-defined save-handler function. + // That's fine, it just means the datastore is acting as a "mock-write" + // store -- changes get saved in memory but don't get saved to disk. + saveCompleteCallback(); + } + }, -dojo.declare( - "dijit.layout.ContentPane", [dijit._Widget, dijit.layout._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: dojo._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, + revert: function(){ + // summary: See dojo.data.api.Write.revert() + this._assert(!this._saveInProgress); - // refreshOnShow: Boolean - // Refresh (re-download) content when pane goes from hidden to shown - refreshOnShow: false, + var identity; + for(identity in this._pending._modifiedItems){ + // find the original item and the modified item that replaced it + var copyOfItemState = this._pending._modifiedItems[identity]; + var modifiedItem = null; + if(this._itemsByIdentity){ + modifiedItem = this._itemsByIdentity[identity]; + }else{ + modifiedItem = this._arrayOfAllItems[identity]; + } - // loadingMessage: String - // Message that shows while downloading - loadingMessage: "<span class='dijitContentPaneLoading'>${loadingState}</span>", + // Restore the original item into a full-fledged item again, we want to try to + // keep the same object instance as if we don't it, causes bugs like #9022. + copyOfItemState[this._storeRefPropName] = this; + for(var key in modifiedItem){ + delete modifiedItem[key]; + } + lang.mixin(modifiedItem, copyOfItemState); + } + var deletedItem; + for(identity in this._pending._deletedItems){ + deletedItem = this._pending._deletedItems[identity]; + deletedItem[this._storeRefPropName] = this; + var index = deletedItem[this._itemNumPropName]; - // errorMessage: String - // Message that shows if an error occurs - errorMessage: "<span class='dijitContentPaneError'>${errorState}</span>", + //Restore the reverse refererence map, if any. + if(deletedItem["backup_" + this._reverseRefMap]){ + deletedItem[this._reverseRefMap] = deletedItem["backup_" + this._reverseRefMap]; + delete deletedItem["backup_" + this._reverseRefMap]; + } + this._arrayOfAllItems[index] = deletedItem; + if(this._itemsByIdentity){ + this._itemsByIdentity[identity] = deletedItem; + } + if(deletedItem[this._rootItemPropName]){ + this._arrayOfTopLevelItems.push(deletedItem); + } + } + //We have to pass through it again and restore the reference maps after all the + //undeletes have occurred. + for(identity in this._pending._deletedItems){ + deletedItem = this._pending._deletedItems[identity]; + if(deletedItem["backupRefs_" + this._reverseRefMap]){ + arrayUtil.forEach(deletedItem["backupRefs_" + this._reverseRefMap], function(reference){ + var refItem; + if(this._itemsByIdentity){ + refItem = this._itemsByIdentity[reference.id]; + }else{ + refItem = this._arrayOfAllItems[reference.id]; + } + this._addReferenceToMap(refItem, deletedItem, reference.attr); + }, this); + delete deletedItem["backupRefs_" + this._reverseRefMap]; + } + } - // 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, + for(identity in this._pending._newItems){ + var newItem = this._pending._newItems[identity]; + newItem[this._storeRefPropName] = null; + // null out the new item, but don't change the array index so + // so we can keep using _arrayOfAllItems.length. + this._arrayOfAllItems[newItem[this._itemNumPropName]] = null; + if(newItem[this._rootItemPropName]){ + this._removeArrayElement(this._arrayOfTopLevelItems, newItem); + } + if(this._itemsByIdentity){ + delete this._itemsByIdentity[identity]; + } + } - baseClass: "dijitContentPane", + this._pending = { + _newItems:{}, + _modifiedItems:{}, + _deletedItems:{} + }; + return true; // boolean + }, - // ioArgs: Object - // Parameters to pass to xhrGet() request, for example: - // | <div dojoType="dijit.layout.ContentPane" href="./bar" ioArgs="{timeout: 500}"> - ioArgs: {}, + isDirty: function(/* item? */ item){ + // summary: See dojo.data.api.Write.isDirty() + if(item){ + // return true if the item is dirty + var identity = this.getIdentity(item); + return new Boolean(this._pending._newItems[identity] || + this._pending._modifiedItems[identity] || + this._pending._deletedItems[identity]).valueOf(); // boolean + }else{ + // return true if the store is dirty -- which means return true + // if there are any new items, dirty items, or modified items + return !this._isEmpty(this._pending._newItems) || + !this._isEmpty(this._pending._modifiedItems) || + !this._isEmpty(this._pending._deletedItems); // boolean + } + }, - // onLoadDeferred: [readonly] dojo.Deferred - // This is the `dojo.Deferred` returned by set('href', ...) and refresh(). - // Calling onLoadDeferred.addCallback() or addErrback() 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, +/* dojo.data.api.Notification */ - // Override _Widget's attributeMap 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. - attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, { - title: [] - }), + onSet: function(/* item */ item, + /*attribute-name-string*/ attribute, + /*object|array*/ oldValue, + /*object|array*/ newValue){ + // summary: See dojo.data.api.Notification.onSet() - // Flag to parser that I'll parse my contents, so it shouldn't. - stopParser: true, + // No need to do anything. This method is here just so that the + // client code can connect observers to it. + }, - // 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, + onNew: function(/* item */ newItem, /*object?*/ parentInfo){ + // summary: See dojo.data.api.Notification.onNew() - 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)){ - var df = dojo.doc.createDocumentFragment(); - srcNodeRef = dojo.byId(srcNodeRef) - while(srcNodeRef.firstChild){ - df.appendChild(srcNodeRef.firstChild); - } - params = dojo.delegate(params, {content: df}); - } - this.inherited(arguments, [params, srcNodeRef]); + // No need to do anything. This method is here just so that the + // client code can connect observers to it. }, - postMixInProperties: function(){ - this.inherited(arguments); - var messages = dojo.i18n.getLocalization("dijit", "loading", this.lang); - this.loadingMessage = dojo.string.substitute(this.loadingMessage, messages); - this.errorMessage = dojo.string.substitute(this.errorMessage, messages); + onDelete: function(/* item */ deletedItem){ + // summary: See dojo.data.api.Notification.onDelete() + + // No need to do anything. This method is here just so that the + // client code can connect observers to it. }, - buildRendering: function(){ - this.inherited(arguments); + close: function(/* object? */ request){ + // summary: + // Over-ride of base close function of ItemFileReadStore to add in check for store state. + // description: + // Over-ride of base close function of ItemFileReadStore to add in check for store state. + // If the store is still dirty (unsaved changes), then an error will be thrown instead of + // clearing the internal state for reload from the url. - // 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; - } + //Clear if not dirty ... or throw an error + if(this.clearOnClose){ + if(!this.isDirty()){ + this.inherited(arguments); + }else{ + //Only throw an error if the store was dirty and we were loading from a url (cannot reload from url until state is saved). + throw new Error("dojo.data.ItemFileWriteStore: There are unsaved changes present in the store. Please save or revert the changes before invoking close."); + } + } + } +}); - // 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(!dojo.attr(this.domNode,"role")){ - dijit.setWaiRole(this.domNode, "group"); - } - }, +}, +'dijit/form/_RadioButtonMixin':function(){ +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 + "dojo/_base/window", // win.doc + "../registry" // registry.getEnclosingWidget +], function(array, declare, domAttr, event, lang, query, win, registry){ + + // module: + // dijit/form/_RadioButtonMixin + // summary: + // Mixin to provide widget functionality for an HTML radio button - _startChildren: function(){ + return declare("dijit.form._RadioButtonMixin", null, { // summary: - // Call startup() on all children including non _Widget ones like dojo.dnd.Source objects + // Mixin to provide widget functionality for an HTML radio button - // This starts all the widgets - this.inherited(arguments); + // type: [private] String + // type attribute on <input> node. + // Users should not change this value. + type: "radio", - // And this catches stuff like dojo.dnd.Source - if(this._contentSetter){ - dojo.forEach(this._contentSetter.parseResults, function(obj){ - if(!obj._started && !obj._destroyed && dojo.isFunction(obj.startup)){ - obj.startup(); - obj._started = true; - } - }, this); - } - }, - - setHref: function(/*String|Uri*/ href){ - // summary: - // Deprecated. Use set('href', ...) instead. - dojo.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 + _getRelatedWidgets: function(){ + // Private function needed to help iterate over all radio buttons in a group. + var ary = []; + query("input[type=radio]", this.focusNode.form || win.doc).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; + }, - // Cancel any in-flight requests (a set('href', ...) will cancel any in-flight set('href', ...)) - this.cancel(); + _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); + } + })); + } + }, - this.onLoadDeferred = new dojo.Deferred(dojo.hitch(this, "cancel")); - this.onLoadDeferred.addCallback(dojo.hitch(this, "onLoad")); + _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); + } + }); +}); - this._set("href", href); +}, +'url:dijit/templates/TreeNode.html':"<div class=\"dijitTreeNode\" role=\"presentation\"\n\t><div data-dojo-attach-point=\"rowNode\" class=\"dijitTreeRow\" role=\"presentation\" data-dojo-attach-event=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\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\" data-dojo-attach-event=\"onfocus:_onLabelFocus\"></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", +'dojo/dnd/TimedMoveable':function(){ +define("dojo/dnd/TimedMoveable", ["../main", "./Moveable"], function(dojo) { + // module: + // dojo/dnd/TimedMoveable + // summary: + // TODOC - // _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; - } + /*===== + dojo.declare("dojo.dnd.__TimedMoveableArgs", [dojo.dnd.__MoveableArgs], { + // timeout: Number + // delay move by this number of ms, + // accumulating position changes during the timeout + timeout: 0 + }); + =====*/ - return this.onLoadDeferred; // dojo.Deferred - }, + // precalculate long expressions + var oldOnMove = dojo.dnd.Moveable.prototype.onMove; - setContent: function(/*String|DomNode|Nodelist*/data){ - // summary: - // Deprecated. Use set('content', ...) instead. - dojo.deprecated("dijit.layout.ContentPane.setContent() is deprecated. Use set('content', ...) instead.", "", "2.0"); - this.set("content", data); - }, - _setContentAttr: function(/*String|DomNode|Nodelist*/data){ + dojo.declare("dojo.dnd.TimedMoveable", dojo.dnd.Moveable, { // 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 + // A specialized version of Moveable to support an FPS throttling. + // This class puts an upper restriction on FPS, which may reduce + // the CPU load. The additional parameter "timeout" regulates + // the delay before actually moving the moveable object. - // clear href so we can't run refresh and clear content - // refresh should only work if we downloaded the content - this._set("href", ""); + // object attributes (for markup) + timeout: 40, // in ms, 40ms corresponds to 25 fps - // Cancel any in-flight requests (a set('content', ...) will cancel any in-flight set('href', ...)) - this.cancel(); + constructor: function(node, params){ + // summary: + // an object that makes a node moveable with a timer + // node: Node||String + // a node (or node's id) to be moved + // params: dojo.dnd.__TimedMoveableArgs + // object with additional parameters. - // 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 dojo.Deferred(dojo.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 dojoType=ContentPane>...</div>) - // or as initialization parameter (ie: new ContentPane({content: ...}) - this.onLoadDeferred.addCallback(dojo.hitch(this, "onLoad")); - } + // sanitize parameters + if(!params){ params = {}; } + if(params.timeout && typeof params.timeout == "number" && params.timeout >= 0){ + this.timeout = params.timeout; + } + }, - this._setContent(data || ""); + onMoveStop: function(/* dojo.dnd.Mover */ mover){ + if(mover._timer){ + // stop timer + clearTimeout(mover._timer); + // reflect the last received position + oldOnMove.call(this, mover, mover._leftTop) + } + dojo.dnd.Moveable.prototype.onMoveStop.apply(this, arguments); + }, + onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){ + mover._leftTop = leftTop; + if(!mover._timer){ + var _t = this; // to avoid using dojo.hitch() + mover._timer = setTimeout(function(){ + // we don't have any pending requests + mover._timer = null; + // reflect the last received position + oldOnMove.call(_t, mover, mover._leftTop); + }, this.timeout); + } + } + }); - this._isDownloaded = false; // mark that content is from a set('content') not a set('href') + return dojo.dnd.TimedMoveable; + +}); - return this.onLoadDeferred; // dojo.Deferred - }, - _getContentAttr: function(){ - // summary: - // Hook to make get("content") work - return this.containerNode.innerHTML; - }, +}, +'dojo/NodeList-fx':function(){ +define("dojo/NodeList-fx", ["dojo/_base/NodeList", "./_base/lang", "./_base/connect", "./_base/fx", "./fx"], + function(NodeList, lang, connectLib, baseFx, coreFx) { + // module: + // dojo/NodeList-fx + // summary: + // TODOC - 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 +/*===== +dojo["NodeList-fx"] = { + // summary: Adds dojo.fx animation support to dojo.query() by extending the NodeList class + // with additional FX functions. NodeList is the array-like object used to hold query results. +}; - this.onLoadDeferred = null; - }, +// doc alias helpers: +NodeList = dojo.NodeList; +=====*/ - uninitialize: function(){ - if(this._beingDestroyed){ - this.cancel(); - } - this.inherited(arguments); +lang.extend(NodeList, { + _anim: function(obj, method, args){ + args = args||{}; + var a = coreFx.combine( + this.map(function(item){ + var tmpArgs = { node: item }; + lang.mixin(tmpArgs, args); + return obj[method](tmpArgs); + }) + ); + return args.auto ? a.play() && this : a; // dojo.Animation|dojo.NodeList }, - destroyRecursive: function(/*Boolean*/ preserveDom){ + wipeIn: function(args){ // 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); + // wipe in all elements of this NodeList via `dojo.fx.wipeIn` + // + // args: Object? + // Additional dojo.Animation arguments to mix into this set with the addition of + // an `auto` parameter. + // + // returns: dojo.Animation|dojo.NodeList + // A special args member `auto` can be passed to automatically play the animation. + // If args.auto is present, the original dojo.NodeList will be returned for further + // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed + // + // example: + // Fade in all tables with class "blah": + // | dojo.query("table.blah").wipeIn().play(); + // + // example: + // Utilizing `auto` to get the NodeList back: + // | dojo.query(".titles").wipeIn({ auto:true }).onclick(someFunction); + // + return this._anim(coreFx, "wipeIn", args); // dojo.Animation|dojo.NodeList }, - _onShow: function(){ + wipeOut: function(args){ // 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. + // wipe out all elements of this NodeList via `dojo.fx.wipeOut` // - // 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 - } - } + // args: Object? + // Additional dojo.Animation arguments to mix into this set with the addition of + // an `auto` parameter. + // + // returns: dojo.Animation|dojo.NodeList + // A special args member `auto` can be passed to automatically play the animation. + // If args.auto is present, the original dojo.NodeList will be returned for further + // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed + // + // example: + // Wipe out all tables with class "blah": + // | dojo.query("table.blah").wipeOut().play(); + return this._anim(coreFx, "wipeOut", args); // dojo.Animation|dojo.NodeList }, - refresh: function(){ + slideTo: function(args){ // 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 + // slide all elements of the node list to the specified place via `dojo.fx.slideTo` + // + // args: Object? + // Additional dojo.Animation arguments to mix into this set with the addition of + // an `auto` parameter. + // + // returns: dojo.Animation|dojo.NodeList + // A special args member `auto` can be passed to automatically play the animation. + // If args.auto is present, the original dojo.NodeList will be returned for further + // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed + // + // example: + // | Move all tables with class "blah" to 300/300: + // | dojo.query("table.blah").slideTo({ + // | left: 40, + // | top: 50 + // | }).play(); + return this._anim(coreFx, "slideTo", args); // dojo.Animation|dojo.NodeList + }, - // Cancel possible prior in-flight request - this.cancel(); - this.onLoadDeferred = new dojo.Deferred(dojo.hitch(this, "cancel")); - this.onLoadDeferred.addCallback(dojo.hitch(this, "onLoad")); - this._load(); - return this.onLoadDeferred; // If child has an href, promise that fires when refresh is complete + fadeIn: function(args){ + // summary: + // fade in all elements of this NodeList via `dojo.fadeIn` + // + // args: Object? + // Additional dojo.Animation arguments to mix into this set with the addition of + // an `auto` parameter. + // + // returns: dojo.Animation|dojo.NodeList + // A special args member `auto` can be passed to automatically play the animation. + // If args.auto is present, the original dojo.NodeList will be returned for further + // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed + // + // example: + // Fade in all tables with class "blah": + // | dojo.query("table.blah").fadeIn().play(); + return this._anim(baseFx, "fadeIn", args); // dojo.Animation|dojo.NodeList }, - _load: function(){ + fadeOut: function(args){ // summary: - // Load/reload the href specified in this.href + // fade out all elements of this NodeList via `dojo.fadeOut` + // + // args: Object? + // Additional dojo.Animation arguments to mix into this set with the addition of + // an `auto` parameter. + // + // returns: dojo.Animation|dojo.NodeList + // A special args member `auto` can be passed to automatically play the animation. + // If args.auto is present, the original dojo.NodeList will be returned for further + // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed + // + // example: + // Fade out all elements with class "zork": + // | dojo.query(".zork").fadeOut().play(); + // example: + // Fade them on a delay and do something at the end: + // | var fo = dojo.query(".zork").fadeOut(); + // | dojo.connect(fo, "onEnd", function(){ /*...*/ }); + // | fo.play(); + // example: + // Using `auto`: + // | dojo.query("li").fadeOut({ auto:true }).filter(filterFn).forEach(doit); + // + return this._anim(baseFx, "fadeOut", args); // dojo.Animation|dojo.NodeList + }, - // display loading message - this._setContent(this.onDownloadStart(), true); + animateProperty: function(args){ + // summary: + // Animate all elements of this NodeList across the properties specified. + // syntax identical to `dojo.animateProperty` + // + // args: Object? + // Additional dojo.Animation arguments to mix into this set with the addition of + // an `auto` parameter. + // + // returns: dojo.Animation|dojo.NodeList + // A special args member `auto` can be passed to automatically play the animation. + // If args.auto is present, the original dojo.NodeList will be returned for further + // chaining. Otherwise the dojo.Animation instance is returned and must be .play()'ed + // + // example: + // | dojo.query(".zork").animateProperty({ + // | duration: 500, + // | properties: { + // | color: { start: "black", end: "white" }, + // | left: { end: 300 } + // | } + // | }).play(); + // + // example: + // | dojo.query(".grue").animateProperty({ + // | auto:true, + // | properties: { + // | height:240 + // | } + // | }).onclick(handler); + return this._anim(baseFx, "animateProperty", args); // dojo.Animation|dojo.NodeList + }, - var self = this; - var getArgs = { - preventCache: (this.preventCache || this.refreshOnShow), - url: this.href, - handleAs: "text" - }; - if(dojo.isObject(this.ioArgs)){ - dojo.mixin(getArgs, this.ioArgs); + anim: function( /*Object*/ properties, + /*Integer?*/ duration, + /*Function?*/ easing, + /*Function?*/ onEnd, + /*Integer?*/ delay){ + // summary: + // Animate one or more CSS properties for all nodes in this list. + // The returned animation object will already be playing when it + // is returned. See the docs for `dojo.anim` for full details. + // properties: Object + // the properties to animate. does NOT support the `auto` parameter like other + // NodeList-fx methods. + // duration: Integer? + // Optional. The time to run the animations for + // easing: Function? + // Optional. The easing function to use. + // onEnd: Function? + // A function to be called when the animation ends + // delay: + // how long to delay playing the returned animation + // example: + // Another way to fade out: + // | dojo.query(".thinger").anim({ opacity: 0 }); + // example: + // animate all elements with the "thigner" class to a width of 500 + // pixels over half a second + // | dojo.query(".thinger").anim({ width: 500 }, 700); + var canim = coreFx.combine( + this.map(function(item){ + return baseFx.animateProperty({ + node: item, + properties: properties, + duration: duration||350, + easing: easing + }); + }) + ); + if(onEnd){ + connectLib.connect(canim, "onEnd", onEnd); } + return canim.play(delay||0); // dojo.Animation + } +}); - var hand = (this._xhrDfd = (this.ioMethod || dojo.xhrGet)(getArgs)); +return NodeList; +}); - hand.addCallback(function(html){ - try{ - self._isDownloaded = true; - self._setContent(html, false); - self.onDownloadEnd(); - }catch(err){ - self._onError('Content', err); // onContentError - } - delete self._xhrDfd; - return html; - }); +}, +'dijit/form/_ListMouseMixin':function(){ +define("dijit/form/_ListMouseMixin", [ + "dojo/_base/declare", // declare + "dojo/_base/event", // event.stop + "dojo/touch", + "./_ListBase" +], function(declare, event, touch, _ListBase){ - hand.addErrback(function(err){ - if(!hand.canceled){ - // show error message in the pane - self._onError('Download', err); // onDownloadError - } - delete self._xhrDfd; - return err; - }); +/*===== +var _ListBase = dijit.form._ListBase; +=====*/ - // Remove flag saying that a load is needed - delete this._hrefChanged; +// module: +// dijit/form/_ListMouseMixin +// summary: +// a mixin to handle mouse or touch events for a focus-less menu + +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.connect(this.domNode, touch.press, "_onMouseDown"); + this.connect(this.domNode, touch.release, "_onMouseUp"); + this.connect(this.domNode, "onmouseover", "_onMouseOver"); + this.connect(this.domNode, "onmouseout", "_onMouseOut"); }, - _onLoadHandler: function(data){ - // summary: - // This is called whenever new content is being loaded - this._set("isLoaded", true); - try{ - this.onLoadDeferred.callback(data); - }catch(e){ - console.error('Error '+this.widgetId+' running custom onLoad code: ' + e.message); + _onMouseDown: function(/*Event*/ evt){ + event.stop(evt); + if(this._hoveredNode){ + this.onUnhover(this._hoveredNode); + this._hoveredNode = null; } + this._isDragging = true; + this._setSelectedAttr(this._getTarget(evt)); }, - _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); + _onMouseUp: function(/*Event*/ evt){ + event.stop(evt); + this._isDragging = false; + var selectedNode = this._getSelectedAttr(); + var target = this._getTarget(evt); + 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); } }, - destroyDescendants: function(){ - // 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(); + _onMouseOut: function(/*Event*/ /*===== evt ====*/){ + if(this._hoveredNode){ + this.onUnhover(this._hoveredNode); + if(this._getSelectedAttr() == this._hoveredNode){ + this.onSelect(this._hoveredNode); + } + this._hoveredNode = null; } + if(this._isDragging){ + this._cancelDrag = (new Date()).getTime() + 1000; // cancel in 1 second if no _onMouseOver fires + } + }, - // 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; - dojo.forEach(this.getChildren(), function(widget){ - if(widget.destroyRecursive){ - widget.destroyRecursive(); + _onMouseOver: function(/*Event*/ evt){ + if(this._cancelDrag){ + var time = (new Date()).getTime(); + if(time > this._cancelDrag){ + this._isDragging = false; } - }); - 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 - dojo.forEach(setter.parseResults, function(widget){ - if(widget.destroyRecursive && widget.domNode && widget.domNode.parentNode == dojo.body()){ - widget.destroyRecursive(); + this._cancelDrag = null; + } + var node = this._getTarget(evt); + if(!node){ return; } + if(this._hoveredNode != node){ + if(this._hoveredNode){ + this._onMouseOut({ target: this._hoveredNode }); + } + if(node && node.parentNode == this.containerNode){ + if(this._isDragging){ + this._setSelectedAttr(node); + }else{ + this._hoveredNode = node; + this.onHover(node); } - }); - delete setter.parseResults; + } } + } +}); - // And then clear away all the DOM nodes - dojo.html._emptyNode(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 - - // first get rid of child widgets - this.destroyDescendants(); - - // dojo.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 dojo.html._ContentSetter)){ - setter = this._contentSetter = new dojo.html._ContentSetter({ - node: this.containerNode, - _onError: dojo.hitch(this, this._onError), - onContentError: dojo.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 = dojo.mixin({ - cleanContent: this.cleanContent, - extractContent: this.extractContent, - parseContent: this.parseOnLoad, - parserScope: this.parserScope, - startup: false, - dir: this.dir, - lang: this.lang - }, this._contentSetterParams || {}); +}, +'url:dijit/templates/Tree.html':"<div class=\"dijitTree dijitTreeContainer\" role=\"tree\"\n\tdata-dojo-attach-event=\"onkeypress:_onKeyPress\">\n\t<div class=\"dijitInline dijitTreeIndent\" style=\"position: absolute; top: -9999px\" data-dojo-attach-point=\"indentDetector\"></div>\n</div>\n", +'dojo/cookie':function(){ +define("dojo/cookie", ["./_base/kernel", "./regexp"], function(dojo, regexp) { + // module: + // dojo/cookie + // summary: + // TODOC - setter.set( (dojo.isObject(cont) && cont.domNode) ? cont.domNode : cont, setterParams ); - // setter params must be pulled afresh from the ContentPane each time - delete this._contentSetterParams; +/*===== +dojo.__cookieProps = function(){ + // expires: Date|String|Number? + // If a number, the number of days from today at which the cookie + // will expire. If a date, the date past which the cookie will expire. + // If expires is in the past, the cookie will be deleted. + // If expires is omitted or is 0, the cookie will expire when the browser closes. + // path: String? + // The path to use for the cookie. + // domain: String? + // The domain to use for the cookie. + // secure: Boolean? + // Whether to only send the cookie on secure connections + this.expires = expires; + this.path = path; + this.domain = domain; + this.secure = secure; +} +=====*/ - if(this.doLayout){ - this._checkIfSingleChild(); - } - if(!isFakeContent){ - if(this._started){ - // Startup each top level child widget (and they will start their children, recursively) - this._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 - this._scheduleLayout(); - } - - this._onLoadHandler(cont); +dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/props){ + // summary: + // Get or set a cookie. + // description: + // If one argument is passed, returns the value of the cookie + // For two or more arguments, acts as a setter. + // name: + // Name of the cookie + // value: + // Value for the cookie + // props: + // Properties for the cookie + // example: + // set a cookie with the JSON-serialized contents of an object which + // will expire 5 days from now: + // | dojo.cookie("configObj", dojo.toJson(config), { expires: 5 }); + // + // example: + // de-serialize a cookie back into a JavaScript object: + // | var config = dojo.fromJson(dojo.cookie("configObj")); + // + // example: + // delete a cookie: + // | dojo.cookie("configObj", null, {expires: -1}); + var c = document.cookie, ret; + if(arguments.length == 1){ + var matches = c.match(new RegExp("(?:^|; )" + regexp.escapeString(name) + "=([^;]*)")); + ret = matches ? decodeURIComponent(matches[1]) : undefined; + }else{ + props = props || {}; +// FIXME: expires=0 seems to disappear right away, not on close? (FF3) Change docs? + var exp = props.expires; + if(typeof exp == "number"){ + var d = new Date(); + d.setTime(d.getTime() + exp*24*60*60*1000); + exp = props.expires = d; } - }, - - _onError: function(type, err, consoleText){ - this.onLoadDeferred.errback(err); + if(exp && exp.toUTCString){ props.expires = exp.toUTCString(); } - // 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); + value = encodeURIComponent(value); + var updatedCookie = name + "=" + value, propName; + for(propName in props){ + updatedCookie += "; " + propName; + var propValue = props[propName]; + if(propValue !== true){ updatedCookie += "=" + propValue; } } - }, - - // EVENT's, should be overide-able - onLoad: function(data){ - // summary: - // Event hook, is called after everything is loaded and widgetified - // tags: - // callback - }, + document.cookie = updatedCookie; + } + return ret; // String|undefined +}; - onUnload: function(){ - // summary: - // Event hook, is called before old content is cleared - // tags: - // callback - }, +dojo.cookie.isSupported = function(){ + // summary: + // Use to determine if the current browser supports cookies or not. + // + // Returns true if user allows cookies. + // Returns false if user doesn't allow cookies. - 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; - }, + if(!("cookieEnabled" in navigator)){ + this("__djCookieTest__", "CookiesAllowed"); + navigator.cookieEnabled = this("__djCookieTest__") == "CookiesAllowed"; + if(navigator.cookieEnabled){ + this("__djCookieTest__", "", {expires: -1}); + } + } + return navigator.cookieEnabled; +}; - 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 - }, +return dojo.cookie; +}); - 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; - }, +}, +'dojo/cache':function(){ +define("dojo/cache", ["./_base/kernel", "./text"], function(dojo, text){ + // module: + // dojo/cache + // summary: + // The module defines dojo.cache by loading dojo/text. - onDownloadEnd: function(){ - // summary: - // Called when download is finished. - // tags: - // callback - } + //dojo.cache is defined in dojo/text + return dojo.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=\"presentation\"\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", +'dijit/ProgressBar':function(){ +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){ -if(!dojo._hasResource["dijit.TooltipDialog"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.TooltipDialog"] = true; -dojo.provide("dijit.TooltipDialog"); +/*===== + var _Widget = dijit._Widget; + var _TemplatedMixin = dijit._TemplatedMixin; +=====*/ +// module: +// dijit/ProgressBar +// summary: +// A progress indication widget, showing the amount completed +// (often the percentage completed) of a task. +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: "", -dojo.declare( - "dijit.TooltipDialog", - [dijit.layout.ContentPane, dijit._Templated, dijit.form._FormMixin, dijit._DialogMixin], - { - // summary: - // Pops up a dialog that appears like a Tooltip + // maximum: [const] Float + // Max sample number + maximum: 100, - // title: String - // Description of tooltip dialog (required for a11y) - title: "", + // places: [const] Number + // Number of places to show in values; 0 by default + places: 0, - // 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, + // 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, - // 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, + // label: String? + // Label on progress bar. Defaults to percentage for determinate progress bar and + // blank for indeterminate progress bar. + label:"", - // baseClass: [protected] String - // The root className to use for the various states of this widget - baseClass: "dijitTooltipDialog", + // 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: '', - // _firstFocusItem: [private] [readonly] DomNode - // The pointer to the first focusable node in the dialog. - // Set by `dijit._DialogMixin._getFocusItems`. - _firstFocusItem: null, + templateString: template, - // _lastFocusItem: [private] [readonly] DomNode - // The pointer to which node has focus prior to our dialog. - // Set by `dijit._DialogMixin._getFocusItems`. - _lastFocusItem: null, + // _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"), - templateString: dojo.cache("dijit", "templates/TooltipDialog.html", "<div role=\"presentation\" tabIndex=\"-1\">\n\t<div class=\"dijitTooltipContainer\" role=\"presentation\">\n\t\t<div class =\"dijitTooltipContents dijitTooltipFocusNode\" dojoAttachPoint=\"containerNode\" role=\"dialog\"></div>\n\t</div>\n\t<div class=\"dijitTooltipConnector\" role=\"presentation\"></div>\n</div>\n"), + postMixInProperties: function(){ + this.inherited(arguments); + if(!("value" in this.params)){ + this.value = this.indeterminate ? Infinity : this.progress; + } + }, - _setTitleAttr: function(/*String*/ title){ - this.containerNode.title = title; - this._set("title", title) - }, + buildRendering: function(){ + this.inherited(arguments); + this.indeterminateHighContrastImage.setAttribute("src", + this._indeterminateHighContrastImagePath.toString()); + this.update(); + }, - postCreate: function(){ - this.inherited(arguments); - this.connect(this.containerNode, "onkeypress", "_onKey"); - }, + 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 - orient: function(/*DomNode*/ node, /*String*/ aroundCorner, /*String*/ corner){ - // 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 - var newC = "dijitTooltipAB" + (corner.charAt(1) == 'L' ? "Left" : "Right") - + " dijitTooltip" - + (corner.charAt(0) == 'T' ? "Below" : "Above"); - - dojo.replaceClass(this.domNode, newC, this._currentOrientClass || ""); - this._currentOrientClass = newC; - }, + // TODO: deprecate this method and use set() instead - focus: function(){ - // summary: - // Focus on first field - this._getFocusItems(this.containerNode); - dijit.focus(this._firstFocusItem); - }, + lang.mixin(this, attributes || {}); + var tip = this.internalProgress, ap = this.domNode; + var percent = 1; + if(this.indeterminate){ + ap.removeAttribute("aria-valuenow"); + ap.removeAttribute("aria-valuemin"); + ap.removeAttribute("aria-valuemax"); + }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; + } - 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 + ap.setAttribute("aria-describedby", this.labelNode.id); + ap.setAttribute("aria-valuenow", this.progress); + ap.setAttribute("aria-valuemin", 0); + ap.setAttribute("aria-valuemax", this.maximum); + } + this.labelNode.innerHTML = this.report(percent); - this.orient(this.domNode,pos.aroundCorner, pos.corner); - this._onShow(); // lazy load trigger - }, + domClass.toggle(this.domNode, "dijitProgressBarIndeterminate", this.indeterminate); + tip.style.width = (percent * 100) + "%"; + this.onChange(); + }, - 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(); - }, + _setValueAttr: function(v){ + this._set("value", v); + if(v == Infinity){ + this.update({indeterminate:true}); + }else{ + this.update({indeterminate:false, progress:v}); + } + }, - _onKey: function(/*Event*/ evt){ - // summary: - // Handler for keyboard events - // description: - // Keep keyboard focus in dialog; close dialog on escape key - // tags: - // private + _setLabelAttr: function(label){ + this._set("label", label); + this.update(); + }, - var node = evt.target; - var dk = dojo.keys; - if(evt.charOrCode === dk.TAB){ - this._getFocusItems(this.containerNode); - } - var singleFocusItem = (this._firstFocusItem == this._lastFocusItem); - if(evt.charOrCode == dk.ESCAPE){ - // Use setTimeout to avoid crash on IE, see #10396. - setTimeout(dojo.hitch(this, "onCancel"), 0); - dojo.stopEvent(evt); - }else if(node == this._firstFocusItem && evt.shiftKey && evt.charOrCode === dk.TAB){ - if(!singleFocusItem){ - dijit.focus(this._lastFocusItem); // send focus to last item in dialog - } - dojo.stopEvent(evt); - }else if(node == this._lastFocusItem && evt.charOrCode === dk.TAB && !evt.shiftKey){ - if(!singleFocusItem){ - dijit.focus(this._firstFocusItem); // send focus to first item in dialog - } - dojo.stopEvent(evt); - }else if(evt.charOrCode === dk.TAB){ - // we want the browser's default tab handling to move focus - // but we don't want the tab to propagate upwards - evt.stopPropagation(); - } - } - } - ); + _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 -if(!dojo._hasResource["dijit.Dialog"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.Dialog"] = true; -dojo.provide("dijit.Dialog"); + 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 + } +}); +}); +}, +'dijit/_base/popup':function(){ +define("dijit/_base/popup", [ + "dojo/dom-class", // domClass.contains + "../popup", + "../BackgroundIframe" // just loading for back-compat, in case client code is referencing it +], function(domClass, popup){ + +// module: +// dijit/_base/popup +// summary: +// 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(){} + }; + } + return origCreateWrapper.call(this, widget); +}; +// Support old format of orient parameter +var origOpen = popup.open; +popup.open = function(/*dijit.popup.__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; +}); +}, +'dijit/ColorPalette':function(){ +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", + "./_TemplatedMixin", + "./_PaletteMixin", + "dojo/i18n", // i18n.getLocalization + "dojo/_base/Color", // dojo.Color dojo.Color.named + "dojo/_base/declare", // declare + "dojo/dom-class", // domClass.contains + "dojo/dom-construct", // domConstruct.place + "dojo/_base/window", // win.body + "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, i18n, Color, + declare, domClass, domConstruct, win, string){ +/*===== + var _Widget = dijit._Widget; + var _TemplatedMixin = dijit._TemplatedMixin; + var _PaletteMixin = dijit._PaletteMixin; +=====*/ +// module: +// dijit/ColorPalette +// summary: +// A keyboard accessible color-picking widget +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"]] + }, -// dijit/TooltipDialog required for back-compat. TODO: remove in 2.0 + // templateString: String + // The template of this widget. + templateString: template, -/*===== -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. -}; -=====*/ -dojo.declare( - "dijit._DialogBase", - [dijit._Templated, dijit.form._FormMixin, dijit._DialogMixin, dijit._CssStateMixin], - { - // 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 dojoType="dijit.Dialog" href="test.html"></div> - // - // example: - // | var foo = new dijit.Dialog({ title: "test dialog", content: "test content" }; - // | dojo.body().appendChild(foo.domNode); - // | foo.startup(); + baseClass: "dijitColorPalette", - templateString: dojo.cache("dijit", "templates/Dialog.html", "<div class=\"dijitDialog\" role=\"dialog\" aria-labelledby=\"${id}_title\">\n\t<div dojoAttachPoint=\"titleBar\" class=\"dijitDialogTitleBar\">\n\t<span dojoAttachPoint=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\"></span>\n\t<span dojoAttachPoint=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" dojoAttachEvent=\"ondijitclick: onCancel\" title=\"${buttonCancel}\" role=\"button\" tabIndex=\"-1\">\n\t\t<span dojoAttachPoint=\"closeText\" class=\"closeText\" title=\"${buttonCancel}\">x</span>\n\t</span>\n\t</div>\n\t\t<div dojoAttachPoint=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n"), - - baseClass: "dijitDialog", - - cssStateNodes: { - closeButtonNode: "dijitDialogCloseIcon" - }, + _dyeFactory: function(value, row, col){ + // Overrides _PaletteMixin._dyeFactory(). + return new this._dyeClass(value, row, col); + }, - attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, { - title: [ - { node: "titleNode", type: "innerHTML" }, - { node: "titleBar", type: "attribute" } - ], - "aria-describedby":"" - }), + buildRendering: function(){ + // Instantiate the template, which makes a skeleton into which we'll insert a bunch of + // <img> nodes + this.inherited(arguments); - // open: [readonly] Boolean - // True if Dialog is currently displayed on screen. - open: false, + // 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, { + hc: domClass.contains(win.body(), "dijit_a11y"), + palette: this.palette + }); - // duration: Integer - // The time in milliseconds it takes the dialog to fade in and out - duration: dijit.defaultDuration, + // Creates <img> nodes in each cell of the template. + this._preparePalette( + this._palettes[this.palette], + i18n.getLocalization("dojo", "colors", this.lang)); + } +}); - // 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, +ColorPalette._Color = declare("dijit._Color", Color, { + // summary: + // Object associated with each cell in a ColorPalette palette. + // Implements dijit.Dye. - // 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, + // 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}' class='dijitColorPaletteSwatch' style='background-color: ${color}'/>" + + "</span>", - // _firstFocusItem: [private readonly] DomNode - // The pointer to the first focusable node in the dialog. - // Set by `dijit._DialogMixin._getFocusItems`. - _firstFocusItem: null, + // 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}' style='position: absolute; left: ${left}px; top: ${top}px; ${size}'/>" + + "</span>", - // _lastFocusItem: [private readonly] DomNode - // The pointer to which node has focus prior to our dialog. - // Set by `dijit._DialogMixin._getFocusItems`. - _lastFocusItem: null, + // _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") + }, - // 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, + constructor: function(/*String*/alias, /*Number*/ row, /*Number*/ col){ + this._alias = alias; + this._row = row; + this._col = col; + this.setColor(Color.named[alias]); + }, - // 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, + getValue: function(){ + // summary: + // Note that although dijit._Color is initialized with a value like "white" getValue() always + // returns a hex value + return this.toHex(); + }, - //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 dojoType="dijit.Dialog" aria-describedby="intro" .....> - // <div id="intro">Introductory text</div> - // <div>rest of dialog contents</div> - // </div> - "aria-describedby":"", + fillCell: function(/*DOMNode*/ cell, /*String*/ blankGif){ + var html = string.substitute(this.hc ? this.hcTemplate : this.template, { + // substitution variables for normal mode + color: this.toHex(), + blankGif: blankGif, + alt: this._alias, - postMixInProperties: function(){ - var _nlsResources = dojo.i18n.getLocalization("dijit", "common"); - dojo.mixin(this, _nlsResources); - this.inherited(arguments); - }, + // 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" + }); - postCreate: function(){ - dojo.style(this.domNode, { - display: "none", - position:"absolute" - }); - dojo.body().appendChild(this.domNode); + domConstruct.place(html, cell); + } +}); - this.inherited(arguments); - this.connect(this, "onExecute", "hide"); - this.connect(this, "onCancel", "hide"); - this._modalconnects = []; - }, +return ColorPalette; +}); - 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 +}, +'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", +'dojo/_base/url':function(){ +define("dojo/_base/url", ["./kernel"], function(dojo) { + // module: + // dojo/url + // summary: + // This module contains dojo._Url + + var + ore = new RegExp("^(([^:/?#]+):)?(//([^/?#]*))?([^?#]*)(\\?([^#]*))?(#(.*))?$"), + ire = new RegExp("^((([^\\[:]+):)?([^@]+)@)?(\\[([^\\]]+)\\]|([^\\[:]*))(:([0-9]+))?$"), + _Url = function(){ + var n = null, + _a = arguments, + uri = [_a[0]]; + // resolve uri components relative to each other + for(var i = 1; i<_a.length; i++){ + if(!_a[i]){ continue; } + + // Safari doesn't support this.constructor so we have to be explicit + // FIXME: Tracked (and fixed) in Webkit bug 3537. + // http://bugs.webkit.org/show_bug.cgi?id=3537 + var relobj = new _Url(_a[i]+""), + uriobj = new _Url(uri[0]+""); + + if( + relobj.path == "" && + !relobj.scheme && + !relobj.authority && + !relobj.query + ){ + if(relobj.fragment != n){ + uriobj.fragment = relobj.fragment; + } + relobj = uriobj; + }else if(!relobj.scheme){ + relobj.scheme = uriobj.scheme; + + if(!relobj.authority){ + relobj.authority = uriobj.authority; + + if(relobj.path.charAt(0) != "/"){ + var path = uriobj.path.substring(0, + uriobj.path.lastIndexOf("/") + 1) + relobj.path; + + var segs = path.split("/"); + for(var j = 0; j < segs.length; j++){ + if(segs[j] == "."){ + // flatten "./" references + if(j == segs.length - 1){ + segs[j] = ""; + }else{ + segs.splice(j, 1); + j--; + } + }else if(j > 0 && !(j == 1 && segs[0] == "") && + segs[j] == ".." && segs[j-1] != ".."){ + // flatten "../" references + if(j == (segs.length - 1)){ + segs.splice(j, 1); + segs[j - 1] = ""; + }else{ + segs.splice(j - 1, 2); + j -= 2; + } + } + } + relobj.path = segs.join("/"); + } + } + } - // 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 && dijit._DialogLevelManager.isTop(this)){ - this._getFocusItems(this.domNode); - dijit.focus(this._firstFocusItem); + uri = []; + if(relobj.scheme){ + uri.push(relobj.scheme, ":"); + } + if(relobj.authority){ + uri.push("//", relobj.authority); + } + uri.push(relobj.path); + if(relobj.query){ + uri.push("?", relobj.query); + } + if(relobj.fragment){ + uri.push("#", relobj.fragment); + } } - this.inherited(arguments); - }, - _endDrag: function(e){ - // summary: - // Called after dragging the Dialog. Saves the position of the dialog in the viewport. - // tags: - // private - if(e && e.node && e.node === this.domNode){ - this._relativePosition = dojo.position(e.node); - } - }, + this.uri = uri.join(""); - _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 + // break the uri into its main components + var r = this.uri.match(ore); - var node = this.domNode; + this.scheme = r[2] || (r[1] ? "" : n); + this.authority = r[4] || (r[3] ? "" : n); + this.path = r[5]; // can never be undefined + this.query = r[7] || (r[6] ? "" : n); + this.fragment = r[9] || (r[8] ? "" : n); - if(this.titleBar && this.draggable){ - this._moveable = (dojo.isIE == 6) ? - new dojo.dnd.TimedMoveable(node, { handle: this.titleBar }) : // prevent overload, see #5285 - new dojo.dnd.Moveable(node, { handle: this.titleBar, timeout: 0 }); - this._dndListener = dojo.subscribe("/dnd/move/stop",this,"_endDrag"); - }else{ - dojo.addClass(node,"dijitDialogFixed"); + if(this.authority != n){ + // server based naming authority + r = this.authority.match(ire); + + this.user = r[3] || n; + this.password = r[4] || n; + this.host = r[6] || r[7]; // ipv6 || ipv4 + this.port = r[9] || n; } + }; + _Url.prototype.toString = function(){ return this.uri; }; - this.underlayAttrs = { - dialogId: this.id, - "class": dojo.map(this["class"].split(/\s/), function(s){ return s+"_underlay"; }).join(" ") - }; - }, + return dojo._Url = _Url; +}); - _size: function(){ - // summary: - // If necessary, shrink dialog contents so dialog fits in viewport - // tags: - // private +}, +'dojo/text':function(){ +define("dojo/text", ["./_base/kernel", "require", "./has", "./_base/xhr"], function(dojo, require, has, xhr){ + // module: + // dojo/text + // summary: + // This module implements the !dojo/text plugin and the dojo.cache API. + // description: + // We choose to include our own plugin to leverage functionality already contained in dojo + // and thereby reduce the size of the plugin compared to various foreign loader implementations. + // Also, this allows foreign AMD loaders to be used without their plugins. + // + // CAUTION: this module is designed to optionally function synchronously to support the dojo v1.x synchronous + // loader. This feature is outside the scope of the CommonJS plugins specification. - this._checkIfSingleChild(); + var getText; + if(1){ + getText= function(url, sync, load){ + xhr("GET", {url:url, sync:!!sync, load:load}); + }; + }else{ + // TODOC: only works for dojo AMD loader + if(require.getText){ + getText= require.getText; + }else{ + console.error("dojo/text plugin failed to load because loader does not support getText"); + } + } - // 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 dojo.marginBox(this.domNode) call below. - if(this._singleChild){ - if(this._singleChildOriginalStyle){ - this._singleChild.domNode.style.cssText = this._singleChildOriginalStyle; + var + theCache= {}, + + strip= function(text){ + //Strips <?xml ...?> declarations so that external SVG and XML + //documents can be added to a document without worry. Also, if the string + //is an HTML document, only the part inside the body tag is returned. + if(text){ + text= text.replace(/^\s*<\?xml(\s)+version=[\'\"](\d)*.(\d)*[\'\"](\s)*\?>/im, ""); + var matches= text.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im); + if(matches){ + text= matches[1]; } - delete this._singleChildOriginalStyle; }else{ - dojo.style(this.containerNode, { - width:"auto", - height:"auto" - }); + text = ""; } + return text; + }, - var mb = dojo._getMarginSize(this.domNode); - var viewport = dojo.window.getBox(); - if(mb.w >= viewport.w || mb.h >= viewport.h){ - // Reduce size of dialog contents so that dialog fits in viewport + notFound = {}, - var w = Math.min(mb.w, Math.floor(viewport.w * 0.75)), - h = Math.min(mb.h, Math.floor(viewport.h * 0.75)); + pending = {}, - if(this._singleChild && this._singleChild.resize){ - this._singleChildOriginalStyle = this._singleChild.domNode.style.cssText; - this._singleChild.resize({w: w, h: h}); + result= { + dynamic: + // the dojo/text caches it's own resources because of dojo.cache + true, + + normalize:function(id, toAbsMid){ + // id is something like (path may be relative): + // + // "path/to/text.html" + // "path/to/text.html!strip" + var parts= id.split("!"), + url= parts[0]; + return (/^\./.test(url) ? toAbsMid(url) : url) + (parts[1] ? "!" + parts[1] : ""); + }, + + load:function(id, require, load){ + // id is something like (path is always absolute): + // + // "path/to/text.html" + // "path/to/text.html!strip" + var + parts= id.split("!"), + stripFlag= parts.length>1, + absMid= parts[0], + url = require.toUrl(parts[0]), + text = notFound, + finish = function(text){ + load(stripFlag ? strip(text) : text); + }; + if(absMid in theCache){ + text = theCache[absMid]; + }else if(url in require.cache){ + text = require.cache[url]; + }else if(url in theCache){ + text = theCache[url]; + } + if(text===notFound){ + if(pending[url]){ + pending[url].push(finish); + }else{ + var pendingList = pending[url] = [finish]; + getText(url, !require.async, function(text){ + theCache[absMid]= theCache[url]= text; + for(var i = 0; i<pendingList.length;){ + pendingList[i++](text); + } + delete pending[url]; + }); + } }else{ - dojo.style(this.containerNode, { - width: w + "px", - height: h + "px", - overflow: "auto", - position: "relative" // workaround IE bug moving scrollbar or dragging dialog - }); + finish(text); } + } + }; + + dojo.cache= function(/*String||Object*/module, /*String*/url, /*String||Object?*/value){ + // * (string string [value]) => (module, url, value) + // * (object [value]) => (module, value), url defaults to "" + // + // * if module is an object, then it must be convertable to a string + // * (module, url) module + (url ? ("/" + url) : "") must be a legal argument to require.toUrl + // * value may be a string or an object; if an object then may have the properties "value" and/or "sanitize" + var key; + if(typeof module=="string"){ + if(/\//.test(module)){ + // module is a version 1.7+ resolved path + key = module; + value = url; }else{ - if(this._singleChild && this._singleChild.resize){ - this._singleChild.resize(); - } + // module is a version 1.6- argument to dojo.moduleUrl + key = require.toUrl(module.replace(/\./g, "/") + (url ? ("/" + url) : "")); } - }, + }else{ + key = module + ""; + value = url; + } + var + val = (value != undefined && typeof value != "string") ? value.value : value, + sanitize = value && value.sanitize; - _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. - // tags: - // private - if(!dojo.hasClass(dojo.body(),"dojoMove")){ - var node = this.domNode, - viewport = dojo.window.getBox(), - p = this._relativePosition, - bb = p ? null : dojo._getBorderBox(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)) - ; - dojo.style(node,{ - left: l + "px", - top: t + "px" + if(typeof val == "string"){ + //We have a string, set cache value + theCache[key] = val; + return sanitize ? strip(val) : val; + }else if(val === null){ + //Remove cached value + delete theCache[key]; + return null; + }else{ + //Allow cache values to be empty strings. If key property does + //not exist, fetch it. + if(!(key in theCache)){ + getText(key, true, function(text){ + theCache[key]= text; }); } - }, + return sanitize ? strip(theCache[key]) : theCache[key]; + } + }; - _onKey: function(/*Event*/ evt){ - // summary: - // Handles the keyboard events for accessibility reasons - // tags: - // private + return result; - if(evt.charOrCode){ - var dk = dojo.keys; - var node = evt.target; - if(evt.charOrCode === dk.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 === dk.TAB){ - if(!singleFocusItem){ - dijit.focus(this._lastFocusItem); // send focus to last item in dialog - } - dojo.stopEvent(evt); - }else if(node == this._lastFocusItem && evt.charOrCode === dk.TAB && !evt.shiftKey){ - if(!singleFocusItem){ - dijit.focus(this._firstFocusItem); // send focus to first item in dialog - } - dojo.stopEvent(evt); - }else{ - // see if the key is for the dialog - while(node){ - if(node == this.domNode || dojo.hasClass(node, "dijitPopup")){ - if(evt.charOrCode == dk.ESCAPE){ - this.onCancel(); - }else{ - return; // just let it go - } - } - node = node.parentNode; - } - // this key is for the disabled document window - if(evt.charOrCode !== dk.TAB){ // allow tabbing into the dialog for a11y - dojo.stopEvent(evt); - // opera won't tab to a div - }else if(!dojo.isOpera){ - try{ - this._firstFocusItem.focus(); - }catch(e){ /*squelch*/ } - } - } - } - }, +/*===== +dojo.cache = function(module, url, value){ + // summary: + // A getter and setter for storing the string content associated with the + // module and url arguments. + // description: + // If module is a string that contains slashes, then it is interpretted as a fully + // resolved path (typically a result returned by require.toUrl), and url should not be + // provided. This is the preferred signature. If module is a string that does not + // contain slashes, then url must also be provided and module and url are used to + // call `dojo.moduleUrl()` to generate a module URL. This signature is deprecated. + // If value is specified, the cache value for the moduleUrl will be set to + // that value. Otherwise, dojo.cache will fetch the moduleUrl and store it + // in its internal cache and return that cached value for the URL. To clear + // a cache value pass null for value. Since XMLHttpRequest (XHR) is used to fetch the + // the URL contents, only modules on the same domain of the page can use this capability. + // The build system can inline the cache values though, to allow for xdomain hosting. + // module: String||Object + // If a String with slashes, a fully resolved path; if a String without slashes, the + // module name to use for the base part of the URL, similar to module argument + // to `dojo.moduleUrl`. If an Object, something that has a .toString() method that + // generates a valid path for the cache item. For example, a dojo._Url object. + // url: String + // The rest of the path to append to the path derived from the module argument. If + // module is an object, then this second argument should be the "value" argument instead. + // value: String||Object? + // If a String, the value to use in the cache for the module/url combination. + // If an Object, it can have two properties: value and sanitize. The value property + // should be the value to use in the cache, and sanitize can be set to true or false, + // to indicate if XML declarations should be removed from the value and if the HTML + // inside a body tag in the value should be extracted as the real value. The value argument + // or the value property on the value argument are usually only used by the build system + // as it inlines cache content. + // example: + // To ask dojo.cache to fetch content and store it in the cache (the dojo["cache"] style + // of call is used to avoid an issue with the build system erroneously trying to intern + // this example. To get the build system to intern your dojo.cache calls, use the + // "dojo.cache" style of call): + // | //If template.html contains "<h1>Hello</h1>" that will be + // | //the value for the text variable. + // | var text = dojo["cache"]("my.module", "template.html"); + // example: + // To ask dojo.cache to fetch content and store it in the cache, and sanitize the input + // (the dojo["cache"] style of call is used to avoid an issue with the build system + // erroneously trying to intern this example. To get the build system to intern your + // dojo.cache calls, use the "dojo.cache" style of call): + // | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the + // | //text variable will contain just "<h1>Hello</h1>". + // | var text = dojo["cache"]("my.module", "template.html", {sanitize: true}); + // example: + // Same example as previous, but demostrates how an object can be passed in as + // the first argument, then the value argument can then be the second argument. + // | //If template.html contains "<html><body><h1>Hello</h1></body></html>", the + // | //text variable will contain just "<h1>Hello</h1>". + // | var text = dojo["cache"](new dojo._Url("my/module/template.html"), {sanitize: true}); + return val; //String +}; +=====*/ +}); - show: function(){ - // summary: - // Display the dialog - // returns: dojo.Deferred - // Deferred object that resolves when the display animation is complete - if(this.open){ return; } +}, +'url:dijit/templates/MenuItem.html':"<tr class=\"dijitReset dijitMenuItem\" data-dojo-attach-point=\"focusNode\" role=\"menuitem\" tabIndex=\"-1\"\n\t\tdata-dojo-attach-event=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\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", +'url:dijit/form/templates/CheckBox.html':"<div class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><input\n\t \t${!nameAttrSetting} type=\"${type}\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdata-dojo-attach-point=\"focusNode\"\n\t \tdata-dojo-attach-event=\"onclick:_onClick\"\n/></div>\n", +'dojo/uacss':function(){ +define("dojo/uacss", ["./dom-geometry", "./_base/lang", "./ready", "./_base/sniff", "./_base/window"], + function(geometry, lang, ready, has, baseWindow){ + // module: + // dojo/uacss + // summary: + // Applies pre-set CSS classes to the top-level HTML node, based on: + // - browser (ex: dj_ie) + // - browser version (ex: dj_ie6) + // - box model (ex: dj_contentBox) + // - text direction (ex: dijitRtl) + // + // In addition, browser, browser version, and box model are + // combined with an RTL flag when browser text is RTL. ex: dj_ie-rtl. - if(!this._started){ - this.startup(); - } + var + html = baseWindow.doc.documentElement, + ie = has("ie"), + opera = has("opera"), + maj = Math.floor, + ff = has("ff"), + boxModel = geometry.boxModel.replace(/-/,''), - // first time we show the dialog, there's some initialization stuff to do - if(!this._alreadyInitialized){ - this._setup(); - this._alreadyInitialized=true; - } + classes = { + "dj_ie": ie, + "dj_ie6": maj(ie) == 6, + "dj_ie7": maj(ie) == 7, + "dj_ie8": maj(ie) == 8, + "dj_ie9": maj(ie) == 9, + "dj_quirks": has("quirks"), + "dj_iequirks": ie && has("quirks"), - if(this._fadeOutDeferred){ - this._fadeOutDeferred.cancel(); - } + // NOTE: Opera not supported by dijit + "dj_opera": opera, - this._modalconnects.push(dojo.connect(window, "onscroll", this, "layout")); - this._modalconnects.push(dojo.connect(window, "onresize", this, function(){ - // IE gives spurious resize events and can actually get stuck - // in an infinite loop if we don't ignore them - var viewport = dojo.window.getBox(); - if(!this._oldViewport || - viewport.h != this._oldViewport.h || - viewport.w != this._oldViewport.w){ - this.layout(); - this._oldViewport = viewport; - } - })); - this._modalconnects.push(dojo.connect(this.domNode, "onkeypress", this, "_onKey")); + "dj_khtml": has("khtml"), - dojo.style(this.domNode, { - opacity:0, - display:"" - }); + "dj_webkit": has("webkit"), + "dj_safari": has("safari"), + "dj_chrome": has("chrome"), - this._set("open", true); - this._onShow(); // lazy load trigger + "dj_gecko": has("mozilla"), + "dj_ff3": maj(ff) == 3 + }; // no dojo unsupported browsers - this._size(); - this._position(); + classes["dj_" + boxModel] = true; - // fade-in Animation object, setup below - var fadeIn; + // apply browser, browser version, and box model class names + var classStr = ""; + for(var clz in classes){ + if(classes[clz]){ + classStr += clz + " "; + } + } + html.className = lang.trim(html.className + " " + classStr); - this._fadeInDeferred = new dojo.Deferred(dojo.hitch(this, function(){ - fadeIn.stop(); - delete this._fadeInDeferred; - })); + // If RTL mode, then add dj_rtl flag plus repeat existing classes with -rtl extension. + // We can't run the code below until the <body> tag has loaded (so we can check for dir=rtl). + // priority is 90 to run ahead of parser priority of 100 + ready(90, function(){ + if(!geometry.isBodyLtr()){ + var rtlClassStr = "dj_rtl dijitRtl " + classStr.replace(/ /g, "-rtl "); + html.className = lang.trim(html.className + " " + rtlClassStr + "dj_rtl dijitRtl " + classStr.replace(/ /g, "-rtl ")); + } + }); + return has; +}); - fadeIn = dojo.fadeIn({ - node: this.domNode, - duration: this.duration, - beforeBegin: dojo.hitch(this, function(){ - dijit._DialogLevelManager.show(this, this.underlayAttrs); - }), - onEnd: dojo.hitch(this, function(){ - if(this.autofocus && dijit._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); - dijit.focus(this._firstFocusItem); - } - this._fadeInDeferred.callback(true); - delete this._fadeInDeferred; - }) - }).play(); - - return this._fadeInDeferred; - }, +}, +'dijit/Tooltip':function(){ +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.getMarginBox domGeometry.position + "dojo/dom-style", // domStyle.set, domStyle.get + "dojo/_base/lang", // lang.hitch lang.isArrayLike + "dojo/_base/sniff", // has("ie") + "dojo/_base/window", // win.body + "./_base/manager", // manager.defaultDuration + "./place", + "./_Widget", + "./_TemplatedMixin", + "./BackgroundIframe", + "dojo/text!./templates/Tooltip.html", + "." // sets dijit.showTooltip etc. for back-compat +], function(array, declare, fx, dom, domClass, domGeometry, domStyle, lang, has, win, + manager, place, _Widget, _TemplatedMixin, BackgroundIframe, template, dijit){ - hide: function(){ - // summary: - // Hide the dialog - // returns: dojo.Deferred - // Deferred object that resolves when the hide animation is complete +/*===== + var _Widget = dijit._Widget; + var BackgroundIframe = dijit.BackgroundIframe; + var _TemplatedMixin = dijit._TemplatedMixin; +=====*/ - // if we haven't been initialized yet then we aren't showing and we can just return - if(!this._alreadyInitialized){ - return; - } - if(this._fadeInDeferred){ - this._fadeInDeferred.cancel(); - } + // module: + // dijit/Tooltip + // summary: + // Defines dijit.Tooltip widget (to display a tooltip), showTooltip()/hideTooltip(), and _MasterTooltip - // fade-in Animation object, setup below - var fadeOut; - this._fadeOutDeferred = new dojo.Deferred(dojo.hitch(this, function(){ - fadeOut.stop(); - delete this._fadeOutDeferred; - })); + 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 - fadeOut = dojo.fadeOut({ - node: this.domNode, - duration: this.duration, - onEnd: dojo.hitch(this, function(){ - this.domNode.style.display = "none"; - dijit._DialogLevelManager.hide(this); - this.onHide(); - this._fadeOutDeferred.callback(true); - delete this._fadeOutDeferred; - }) - }).play(); + // duration: Integer + // Milliseconds to fade in/fade out + duration: manager.defaultDuration, - if(this._scrollConnected){ - this._scrollConnected = false; - } - dojo.forEach(this._modalconnects, dojo.disconnect); - this._modalconnects = []; + templateString: template, - if(this._relativePosition){ - delete this._relativePosition; - } - this._set("open", false); + postCreate: function(){ + win.body().appendChild(this.domNode); - return this._fadeOutDeferred; + 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") }); }, - layout: function(){ + show: function(innerHTML, aroundNode, position, rtl, textDir){ // summary: - // Position the Dialog and the underlay - // tags: - // private - if(this.domNode.style.display != "none"){ - if(dijit._underlay){ // avoid race condition during show() - dijit._underlay.layout(); - } - this._position(); - } - }, - - destroy: function(){ - if(this._fadeInDeferred){ - this._fadeInDeferred.cancel(); - } - if(this._fadeOutDeferred){ - this._fadeOutDeferred.cancel(); - } - if(this._moveable){ - this._moveable.destroy(); - } - if(this._dndListener){ - dojo.unsubscribe(this._dndListener); + // 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.__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; } - dojo.forEach(this._modalconnects, dojo.disconnect); - dijit._DialogLevelManager.hide(this); + // reset width; it may have been set by orient() on a previous tooltip show() + this.domNode.width = "auto"; - this.inherited(arguments); - } - } -); + 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; + + this.set("textDir", textDir); + this.containerNode.align = rtl? "right" : "left"; //fix the text alignment -dojo.declare( - "dijit.Dialog", - [dijit.layout.ContentPane, dijit._DialogBase], - {} -); + var pos = place.around(this.domNode, aroundNode, + position && position.length ? position : Tooltip.defaultPosition, !rtl, lang.hitch(this, "orient")); -dijit._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. + // 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"; + } - show: function(/*dijit._Widget*/ 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. + // show it + domStyle.set(this.domNode, "opacity", 0); + this.fadeIn.play(); + this.isShowingNow = true; + this.aroundNode = aroundNode; + }, - var ds = dijit._dialogStack; + 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 - // Save current focus - ds[ds.length-1].focus = dijit.getFocus(dialog); + //Adjust the spaceAvailable width, without changing the spaceAvailable object + var tooltipSpaceAvaliableWidth = spaceAvailable.w - this.connectorNode.offsetWidth; - // Display the underlay, or if already displayed then adjust for this new dialog - var underlay = dijit._underlay; - if(!underlay || underlay._destroyed){ - underlay = dijit._underlay = new dijit.DialogUnderlay(underlayAttrs); - }else{ - underlay.set(dialog.underlayAttrs); - } + 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]; - // Set z-index a bit above previous dialog - var zIndex = ds[ds.length-1].dialog ? ds[ds.length-1].zIndex + 2 : 950; - if(ds.length == 1){ // first dialog - underlay.show(); - } - dojo.style(dijit._underlay.domNode, 'zIndex', zIndex - 1); + // reduce tooltip's width to the amount of width available, so that it doesn't overflow screen + this.domNode.style.width = "auto"; + var size = domGeometry.getContentBox(this.domNode); - // Dialog - dojo.style(dialog.domNode, 'zIndex', zIndex); + var width = Math.min((Math.max(tooltipSpaceAvaliableWidth,1)), size.w); + var widthWasReduced = width < size.w; - ds.push({dialog: dialog, underlayAttrs: underlayAttrs, zIndex: zIndex}); - }, + this.domNode.style.width = width+"px"; - hide: function(/*dijit._Widget*/ 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. + //Adjust width for tooltips that have a really long word or a nowrap setting + if(widthWasReduced){ + this.containerNode.style.overflow = "auto"; //temp change to overflow to detect if our tooltip needs to be wider to support the content + var scrollWidth = this.containerNode.scrollWidth; + this.containerNode.style.overflow = "visible"; //change it back + if(scrollWidth > width){ + scrollWidth = scrollWidth + domStyle.get(this.domNode,"paddingLeft") + domStyle.get(this.domNode,"paddingRight"); + this.domNode.style.width = scrollWidth + "px"; + } + } - var ds = dijit._dialogStack; + // Reposition the tooltip connector. + if(tooltipCorner.charAt(0) == 'B' && aroundCorner.charAt(0) == 'B'){ + var mb = domGeometry.getMarginBox(node); + var tooltipConnectorHeight = this.connectorNode.offsetHeight; + if(mb.h > spaceAvailable.h){ + // The tooltip starts at the top of the page and will extend past the aroundNode + var aroundNodePlacement = spaceAvailable.h - ((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), + mb.h - tooltipConnectorHeight) + "px"; + this.connectorNode.style.top = ""; + } + }else{ + // reset the tooltip back to the defaults + this.connectorNode.style.top = ""; + this.connectorNode.style.bottom = ""; + } - if(ds[ds.length-1].dialog == dialog){ - // Removing the top (or only) dialog in the stack, return focus - // to previous dialog + return Math.max(0, size.w - tooltipSpaceAvaliableWidth); + }, - ds.pop(); + _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=""; + } + }, - var pd = ds[ds.length-1]; // the new active dialog (or the base page itself) + hide: function(aroundNode){ + // summary: + // Hide the tooltip - // Adjust underlay - if(ds.length == 1){ - // Returning to original page. - // Hide the underlay, unless the underlay widget has already been destroyed - // because we are being called during page unload (when all widgets are destroyed) - if(!dijit._underlay._destroyed){ - dijit._underlay.hide(); - } + 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{ - // Popping back to previous dialog, adjust underlay - dojo.style(dijit._underlay.domNode, 'zIndex', pd.zIndex - 1); - dijit._underlay.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(!focus || (pd.dialog && !dojo.isDescendant(focus.node, pd.dialog.domNode))){ - pd.dialog._getFocusItems(pd.dialog.domNode); - focus = pd.dialog._firstFocusItem; - } - - try{ - dijit.focus(focus); - }catch(e){ - /* focus() will fail if user opened the dialog by clicking a non-focusable element */ - } - } - }else{ - // Removing a dialog out of order (#9944, #10705). - // Don't need to mess with underlay or z-index or anything. - var idx = dojo.indexOf(dojo.map(ds, function(elem){return elem.dialog}), dialog); - if(idx != -1){ - ds.splice(idx, 1); + // just ignore the call, it's for a tooltip that has already been erased } - } - }, - - isTop: function(/*dijit._Widget*/ dialog){ - // summary: - // Returns true if specified Dialog is the top in the task - var ds = dijit._dialogStack; - 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) -// } -dijit._dialogStack = [ - {dialog: null, focus: null, underlayAttrs: null} // entry for stuff at z-index: 0 -]; + _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 -if(!dojo._hasResource["dijit._HasDropDown"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._HasDropDown"] = true; -dojo.provide("dijit._HasDropDown"); + 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", typeof textDir != 'undefined'? 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: dijit.__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 they used to, so for back-compat convert them to after-centered, before-centered + 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); + }; -dojo.declare("dijit._HasDropDown", - null, - { + dijit.hideTooltip = function(aroundNode){ // 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 dojoAttachPoint assignment. - // If missing, then either focusNode or domNode (if focusNode is also missing) will be used. - _buttonNode: null, + // Static method to hide the tooltip displayed via showTooltip() + return Tooltip._masterTT && Tooltip._masterTT.hide(aroundNode); + }; - // _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 dojoAttachPoint assignment. - // If missing, then _buttonNode will be used. - _arrowWrapperNode: null, + var Tooltip = declare("dijit.Tooltip", _Widget, { + // summary: + // Pops up a tooltip (a help message) when you hover over a node. - // _popupStateNode: [protected] DomNode - // The node to set the popupActive class on. - // Can be set via a dojoAttachPoint assignment. - // If missing, then focusNode or _buttonNode (if focusNode is missing) will be used. - _popupStateNode: null, + // label: String + // Text to display in the tooltip. + // Specified as innerHTML when creating the widget from markup. + label: "", - // _aroundNode: [protected] DomNode - // The node to display the popup around. - // Can be set via a dojoAttachPoint assignment. - // If missing, then domNode will be used. - _aroundNode: null, + // showDelay: Integer + // Number of milliseconds to wait after hovering over/focusing on the object, before + // the tooltip is displayed. + showDelay: 400, - // dropDown: [protected] Widget - // The widget to display as a popup. This widget *must* be - // defined before the startup function is called. - dropDown: null, + // connectId: String|String[] + // Id of domNode(s) to attach the tooltip to. + // When user hovers over specified dom node, the tooltip will appear. + connectId: [], - // 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, + // position: String[] + // See description of `dijit.Tooltip.defaultPosition` for details on position parameter. + position: [], - // forceWidth: [protected] Boolean - // Set to true to make the drop down exactly as wide as this - // widget. Overrides autoWidth. - forceWidth: false, + _setConnectIdAttr: function(/*String|String[]*/ newId){ + // summary: + // Connect to specified node(s) - // 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, + // Remove connections to old nodes (if there are any) + array.forEach(this._connections || [], function(nested){ + array.forEach(nested, lang.hitch(this, "disconnect")); + }, this); - // 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"], + // 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); }); + + // Make connections + this._connections = array.map(this._connectIds, function(id){ + var node = dom.byId(id); + return [ + this.connect(node, "onmouseenter", "_onHover"), + this.connect(node, "onmouseleave", "_onUnHover"), + this.connect(node, "onfocus", "_onHover"), + this.connect(node, "onblur", "_onUnHover") + ]; + }, this); - // _stopClickEvents: Boolean - // When set to false, the click events will not be stopped, in - // case you want to use them in your subwidget - _stopClickEvents: true, + this._set("connectId", newId); + }, - _onDropDownMouseDown: function(/*Event*/ e){ + addTarget: function(/*DOMNODE || String*/ node){ // summary: - // Callback when the user mousedown's on the arrow icon + // Attach tooltip to specified node if it's not already connected - if(this.disabled || this.readOnly){ return; } - - dojo.stopEvent(e); - - this._docHandler = this.connect(dojo.doc, "onmouseup", "_onDropDownMouseUp"); + // TODO: remove in 2.0 and just use set("connectId", ...) interface - this.toggleDropDown(); + var id = node.id || node; + if(array.indexOf(this._connectIds, id) == -1){ + this.set("connectId", this._connectIds.concat(id)); + } }, - _onDropDownMouseUp: function(/*Event?*/ e){ + removeTarget: function(/*DomNode || String*/ node){ // summary: - // Callback when the user lifts their mouse after mouse down on the arrow icon. - // If the drop is a simple menu and the mouse is over the menu, we execute it, otherwise, we focus our - // dropDown node. 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; + // Detach tooltip from specified node - 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 = dojo.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(dojo.hasClass(t, "dijitPopup")){ - overMenu = true; - }else{ - t = t.parentNode; - } - } - if(overMenu){ - t = e.target; - if(dropDown.onItemClick){ - var menuItem; - while(t && !(menuItem = dijit.byNode(t))){ - t = t.parentNode; - } - if(menuItem && menuItem.onClick && menuItem.getParent){ - menuItem.getParent().onItemClick(menuItem, e); - } - } - return; - } - } - } - if(this._opened && dropDown.focus && dropDown.autoFocus !== false){ - // Focus the dropdown widget - do it on a delay so that we - // don't steal our own focus. - window.setTimeout(dojo.hitch(dropDown, "focus"), 1); - } - }, + // TODO: remove in 2.0 and just use set("connectId", ...) interface - _onDropDownClick: function(/*Event*/ e){ - // the drop down was already opened on mousedown/keydown; just need to call stopEvent() - if(this._stopClickEvents){ - dojo.stopEvent(e); + 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); - - 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"; - dojo.addClass(this._arrowWrapperNode || this._buttonNode, "dijit" + defaultPos + "ArrowButton"); + domClass.add(this.domNode,"dijitTooltipData"); }, - postCreate: function(){ - // summary: - // set up nodes and connect our mouse and keypress events - + startup: function(){ this.inherited(arguments); - this.connect(this._buttonNode, "onmousedown", "_onDropDownMouseDown"); - this.connect(this._buttonNode, "onclick", "_onDropDownClick"); - this.connect(this.focusNode, "onkeypress", "_onKey"); - this.connect(this.focusNode, "onkeyup", "_onKeyUp"); + // 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); }, - 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; + _onHover: function(/*Event*/ e){ + // 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){ + var target = e.target; + this._showTimer = setTimeout(lang.hitch(this, function(){this.open(target)}), this.showDelay); } - this.inherited(arguments); }, - _onKey: function(/*Event*/ e){ + _onUnHover: function(/*Event*/ /*===== e =====*/){ // summary: - // Callback when the user presses a key while focused on the button node - - if(this.disabled || this.readOnly){ return; } + // Despite the name of this method, it actually handles both mouseleave and blur + // events on the target node, hiding the tooltip. + // tags: + // private - 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 */ - dojo.stopEvent(e); - return; - } - } - if(d && this._opened && e.charOrCode == dojo.keys.ESCAPE){ - this.closeDropDown(); - dojo.stopEvent(e); - }else if(!this._opened && - (e.charOrCode == dojo.keys.DOWN_ARROW || - ( (e.charOrCode == dojo.keys.ENTER || e.charOrCode == " ") && - //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; - dojo.stopEvent(e); - } - }, + // keep a tooltip open if the associated element still has focus (even though the + // mouse moved away) + if(this._focus){ return; } - _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){ - setTimeout(dojo.hitch(d, "focus"), 1); - } + if(this._showTimer){ + clearTimeout(this._showTimer); + delete this._showTimer; } + this.close(); }, - _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 = dijit._curFocus && this.dropDown && dojo.isDescendant(dijit._curFocus, this.dropDown.domNode); + open: function(/*DomNode*/ target){ + // summary: + // Display the tooltip; usually not called directly. + // tags: + // private - this.closeDropDown(focusMe); + if(this._showTimer){ + clearTimeout(this._showTimer); + delete this._showTimer; + } + Tooltip.show(this.label || this.domNode.innerHTML, target, this.position, !this.isLeftToRight(), this.textDir); - this.inherited(arguments); + this._connectNode = target; + this.onShow(target, this.position); }, - isLoaded: function(){ + close: function(){ // summary: - // Returns whether or not the dropdown is loaded. This can - // be overridden in order to force a call to loadDropDown(). + // Hide the tooltip or cancel timer for show of tooltip // tags: - // protected + // private - return true; + 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) + clearTimeout(this._showTimer); + delete this._showTimer; + } }, - loadDropDown: function(/* Function */ loadCallback){ + onShow: function(/*===== target, position =====*/){ // summary: - // Loads the data for the dropdown, and at some point, calls - // the given callback. This is basically a callback when the - // user presses the down arrow button to open the drop down. + // Called when the tooltip is shown // tags: - // protected - - loadCallback(); + // callback }, - toggleDropDown: function(){ + onHide: 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 + // Called when the tooltip is hidden // tags: - // protected - - if(this.disabled || this.readOnly){ return; } - if(!this._opened){ - // If we aren't loaded, load it first so there isn't a flicker - if(!this.isLoaded()){ - this.loadDropDown(dojo.hitch(this, "openDropDown")); - return; - }else{ - this.openDropDown(); - } - }else{ - this.closeDropDown(); - } + // callback }, - 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 + uninitialize: function(){ + this.close(); + this.inherited(arguments); + } + }); - var dropDown = this.dropDown, - ddNode = dropDown.domNode, - aroundNode = this._aroundNode || this.domNode, - self = this; + 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 - // Prepare our popup's height and honor maxHeight if it exists. + // dijit.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. + Tooltip.defaultPosition = ["after-centered", "before-centered"]; - // 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; - } - } + return Tooltip; +}); - // 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 = ""; - } - dojo.style(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 = dojo.window.getBox(), - position = dojo.position(aroundNode, false); - maxHeight = Math.floor(Math.max(position.y, viewport.h - (position.y + position.h))); - } +}, +'dojo/string':function(){ +define("dojo/string", ["./_base/kernel", "./_base/lang"], function(dojo, lang) { + // module: + // dojo/string + // summary: + // TODOC - // Attach dropDown to DOM and make make visibility:hidden rather than display:none - // so we call startup() and also get the size - if(dropDown.startup && !dropDown._started){ - dropDown.startup(); - } +lang.getObject("string", true, dojo); - dijit.popup.moveOffScreen(dropDown); - // Get size of drop down, and determine if vertical scroll bar needed - var mb = dojo._getMarginSize(ddNode); - var overHeight = (maxHeight && mb.h > maxHeight); - dojo.style(ddNode, { - overflowX: "hidden", - overflowY: overHeight ? "auto" : "hidden" - }); - if(overHeight){ - mb.h = maxHeight; - if("w" in mb){ - mb.w += 16; // room for vertical scrollbar - } - }else{ - delete mb.h; - } +/*===== +dojo.string = { + // summary: String utilities for Dojo +}; +=====*/ - // 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(dojo.isFunction(dropDown.resize)){ - dropDown.resize(mb); - }else{ - dojo.marginBox(ddNode, mb); - } - } +dojo.string.rep = function(/*String*/str, /*Integer*/num){ + // summary: + // Efficiently replicate a string `n` times. + // str: + // the string to replicate + // num: + // number of times to replicate the string - var retVal = dijit.popup.open({ - parent: this, - popup: dropDown, - around: aroundNode, - orient: dijit.getPopupAroundAlignment((this.dropDownPosition && this.dropDownPosition.length) ? this.dropDownPosition : ["below"],this.isLeftToRight()), - onExecute: function(){ - self.closeDropDown(true); - }, - onCancel: function(){ - self.closeDropDown(true); - }, - onClose: function(){ - dojo.attr(self._popupStateNode, "popupActive", false); - dojo.removeClass(self._popupStateNode, "dijitHasDropDownOpen"); - self._opened = false; - } - }); - dojo.attr(this._popupStateNode, "popupActive", "true"); - dojo.addClass(self._popupStateNode, "dijitHasDropDownOpen"); - this._opened=true; + if(num <= 0 || !str){ return ""; } - // TODO: set this.checked and call setStateClass(), to affect button look while drop down is shown - return retVal; - }, + var buf = []; + for(;;){ + if(num & 1){ + buf.push(str); + } + if(!(num >>= 1)){ break; } + str += str; + } + return buf.join(""); // String +}; - closeDropDown: function(/*Boolean*/ focus){ - // summary: - // Closes the drop down on this widget - // focus: - // If true, refocuses the button widget - // tags: - // protected +dojo.string.pad = function(/*String*/text, /*Integer*/size, /*String?*/ch, /*Boolean?*/end){ + // summary: + // Pad a string to guarantee that it is at least `size` length by + // filling with the character `ch` at either the start or end of the + // string. Pads at the start, by default. + // text: + // the string to pad + // size: + // length to provide padding + // ch: + // character to pad, defaults to '0' + // end: + // adds padding at the end if true, otherwise pads at start + // example: + // | // Fill the string to length 10 with "+" characters on the right. Yields "Dojo++++++". + // | dojo.string.pad("Dojo", 10, "+", true); - if(this._opened){ - if(focus){ this.focus(); } - dijit.popup.close(this.dropDown); - this._opened = false; + if(!ch){ + ch = '0'; + } + var out = String(text), + pad = dojo.string.rep(ch, Math.ceil((size - out.length) / ch.length)); + return end ? out + pad : pad + out; // String +}; + +dojo.string.substitute = function( /*String*/ template, + /*Object|Array*/map, + /*Function?*/ transform, + /*Object?*/ thisObject){ + // summary: + // Performs parameterized substitutions on a string. Throws an + // exception if any parameter is unmatched. + // template: + // a string with expressions in the form `${key}` to be replaced or + // `${key:format}` which specifies a format function. keys are case-sensitive. + // map: + // hash to search for substitutions + // transform: + // a function to process all parameters before substitution takes + // place, e.g. mylib.encodeXML + // thisObject: + // where to look for optional format function; default to the global + // namespace + // example: + // Substitutes two expressions in a string from an Array or Object + // | // returns "File 'foo.html' is not found in directory '/temp'." + // | // by providing substitution data in an Array + // | dojo.string.substitute( + // | "File '${0}' is not found in directory '${1}'.", + // | ["foo.html","/temp"] + // | ); + // | + // | // also returns "File 'foo.html' is not found in directory '/temp'." + // | // but provides substitution data in an Object structure. Dotted + // | // notation may be used to traverse the structure. + // | dojo.string.substitute( + // | "File '${name}' is not found in directory '${info.dir}'.", + // | { name: "foo.html", info: { dir: "/temp" } } + // | ); + // example: + // Use a transform function to modify the values: + // | // returns "file 'foo.html' is not found in directory '/temp'." + // | dojo.string.substitute( + // | "${0} is not found in ${1}.", + // | ["foo.html","/temp"], + // | function(str){ + // | // try to figure out the type + // | var prefix = (str.charAt(0) == "/") ? "directory": "file"; + // | return prefix + " '" + str + "'"; + // | } + // | ); + // example: + // Use a formatter + // | // returns "thinger -- howdy" + // | dojo.string.substitute( + // | "${0:postfix}", ["thinger"], null, { + // | postfix: function(value, key){ + // | return value + " -- howdy"; + // | } + // | } + // | ); + + thisObject = thisObject || dojo.global; + transform = transform ? + lang.hitch(thisObject, transform) : function(v){ return v; }; + + return template.replace(/\$\{([^\s\:\}]+)(?:\:([^\s\:\}]+))?\}/g, + function(match, key, format){ + var value = lang.getObject(key, false, map); + if(format){ + value = lang.getObject(format, false, thisObject).call(thisObject, value, key); + } + return transform(value, key).toString(); + }); // String +}; + +/*===== +dojo.string.trim = function(str){ + // summary: + // Trims whitespace from both sides of the string + // str: String + // String to be trimmed + // returns: String + // Returns the trimmed string + // description: + // This version of trim() was taken from [Steven Levithan's blog](http://blog.stevenlevithan.com/archives/faster-trim-javascript). + // The short yet performant version of this function is dojo.trim(), + // which is part of Dojo base. Uses String.prototype.trim instead, if available. + return ""; // String +} +=====*/ + +dojo.string.trim = String.prototype.trim ? + lang.trim : // aliasing to the native function + function(str){ + str = str.replace(/^\s+/, ''); + for(var i = str.length - 1; i >= 0; i--){ + if(/\S/.test(str.charAt(i))){ + str = str.substring(0, i + 1); + break; } } + return str; + }; - } -); +return dojo.string; +}); -} +}, +'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>", +'dijit/dijit':function(){ +define("dijit/dijit", [ + ".", + "./_base", + "dojo/parser", + "./_Widget", + "./_TemplatedMixin", + "./_Container", + "./layout/_LayoutWidget", + "./form/_FormWidget", + "./form/_FormValueWidget" +], function(dijit){ + + // module: + // dijit/dijit + // 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 -if(!dojo._hasResource["dijit.form.Button"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.Button"] = true; -dojo.provide("dijit.form.Button"); + return dijit; +}); +}, +'dijit/form/DropDownButton':function(){ +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\"\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){ +/*===== + Button = dijit.form.Button; + _Container = dijit._Container; + _HasDropDown = dijit._HasDropDown; +=====*/ +// module: +// dijit/form/DropDownButton +// summary: +// A button with a drop down -dojo.declare("dijit.form.Button", - dijit.form._FormWidget, - { +return declare("dijit.form.DropDownButton", [Button, _Container, _HasDropDown], { // 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. + // A button with a drop down + // // example: - // | <button dojoType="dijit.form.Button" onClick="...">Hello world</button> + // | <button data-dojo-type="dijit.form.DropDownButton"> + // | Hello world + // | <div data-dojo-type="dijit.Menu">...</div> + // | </button> // // example: - // | var button1 = new dijit.form.Button({label: "hello world", onClick: foo}); - // | dojo.body().appendChild(button1.domNode); - - // label: HTML String - // Text to display in button. - // If the label is hidden (showLabel=false) then and no title has - // been specified, then label is also set as title attribute of icon. - label: "", - - // 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. + // | var button1 = new dijit.form.DropDownButton({ label: "hi", dropDown: new dijit.Menu(...) }); + // | win.body().appendChild(button1); // - // 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: "", - // type: String - // Defines the type of button. "button", "submit", or "reset". - type: "button", + baseClass : "dijitDropDownButton", - baseClass: "dijitButton", + templateString: template, - templateString: dojo.cache("dijit.form", "templates/Button.html", "<span class=\"dijit dijitReset dijitInline\"\n\t><span class=\"dijitReset dijitInline dijitButtonNode\"\n\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdojoAttachPoint=\"titleNode,focusNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><span class=\"dijitReset dijitInline dijitIcon\" dojoAttachPoint=\"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\tdojoAttachPoint=\"containerNode\"\n\t\t\t></span\n\t\t></span\n\t></span\n\t><input ${!nameAttrSetting} type=\"${type}\" value=\"${value}\" class=\"dijitOffScreen\" tabIndex=\"-1\"\n\t\tdojoAttachPoint=\"valueNode\"\n/></span>\n"), + _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. - attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, { - value: "valueNode" - }), + 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]]); - _onClick: function(/*Event*/ e){ - // summary: - // Internal function to handle click actions - if(this.disabled){ - return false; - } - this._clicked(); // widget click actions - return this.onClick(e); // user click actions - }, - - _onButtonClick: function(/*Event*/ e){ - // summary: - // Handler when the user activates the button portion. - if(this._onClick(e) === false){ // returning nothing is same as true - e.preventDefault(); // needed for checkbox - }else if(this.type == "submit" && !(this.valueNode||this.focusNode).form){ // see if a nonform widget needs to be signalled - for(var node=this.domNode; node.parentNode/*#5935*/; node=node.parentNode){ - var widget=dijit.byNode(node); - if(widget && typeof widget._onSubmit == "function"){ - widget._onSubmit(e); - break; - } - } - }else if(this.valueNode){ - this.valueNode.click(); - e.preventDefault(); // cancel BUTTON click and continue with hidden INPUT click - } - }, - - buildRendering: function(){ - this.inherited(arguments); - dojo.setSelectable(this.focusNode, false); - }, - - _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))){ - this.set('label', source.innerHTML); - } - }, - - _setShowLabelAttr: function(val){ - if(this.containerNode){ - dojo.toggleClass(this.containerNode, "dijitDisplayNone", !val); - } - this._set("showLabel", val); - }, - - 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 - }, - - _clicked: function(/*Event*/ e){ - // summary: - // Internal overridable function for when the button is clicked - }, - - setLabel: function(/*String*/ content){ - // summary: - // Deprecated. Use set('label', ...) instead. - dojo.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. - this._set("label", content); - this.containerNode.innerHTML = content; - if(this.showLabel == false && !this.params.title){ - this.titleNode.title = dojo.trim(this.containerNode.innerText || this.containerNode.textContent || ''); - } - }, - - _setIconClassAttr: function(/*String*/ val){ - // Custom method so that icon node is hidden when not in use, to avoid excess padding/margin - // appearing around it (even if it's a 0x0 sized <img> node) - - var oldVal = this.iconClass || "dijitNoIcon", - newVal = val || "dijitNoIcon"; - dojo.replaceClass(this.iconNode, newVal, oldVal); - this._set("iconClass", val); - } -}); - - -dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container, dijit._HasDropDown], { - // summary: - // A button with a drop down - // - // example: - // | <button dojoType="dijit.form.DropDownButton" label="Hello world"> - // | <div dojotype="dijit.Menu">...</div> - // | </button> - // - // example: - // | var button1 = new dijit.form.DropDownButton({ label: "hi", dropDown: new dijit.Menu(...) }); - // | dojo.body().appendChild(button1); - // - - baseClass : "dijitDropDownButton", - - templateString: dojo.cache("dijit.form", "templates/DropDownButton.html", "<span class=\"dijit dijitReset dijitInline\"\n\t><span class='dijitReset dijitInline dijitButtonNode'\n\t\tdojoAttachEvent=\"ondijitclick:_onButtonClick\" dojoAttachPoint=\"_buttonNode\"\n\t\t><span class=\"dijitReset dijitStretch dijitButtonContents\"\n\t\t\tdojoAttachPoint=\"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\tdojoAttachPoint=\"iconNode\"\n\t\t\t></span\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\"\n\t\t\t\tdojoAttachPoint=\"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\tdojoAttachPoint=\"valueNode\"\n/></span>\n"), - - _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 = dojo.query("*", this.srcNodeRef); - dijit.form.DropDownButton.superclass._fillContent.call(this, nodes[0]); - - // save pointer to srcNode so we can grab the drop down widget after it's instantiated - this.dropDownContainer = this.srcNodeRef; + // save pointer to srcNode so we can grab the drop down widget after it's instantiated + this.dropDownContainer = this.srcNodeRef; } }, @@ -11947,12 +13104,12 @@ dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container, // 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 = dojo.query("[widgetId]", this.dropDownContainer)[0]; - this.dropDown = dijit.byNode(dropDownNode); + var dropDownNode = query("[widgetId]", this.dropDownContainer)[0]; + this.dropDown = registry.byNode(dropDownNode); delete this.dropDownContainer; } if(this.dropDown){ - dijit.popup.hide(this.dropDown); + popup.hide(this.dropDown); } this.inherited(arguments); @@ -11965,19 +13122,16 @@ dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container, return (!!dropDown && (!dropDown.href || dropDown.isLoaded)); }, - loadDropDown: function(){ - // Loads our dropdown + 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; - if(!dropDown){ return; } - if(!this.isLoaded()){ - var handler = dojo.connect(dropDown, "onLoad", this, function(){ - dojo.disconnect(handler); - this.openDropDown(); - }); - dropDown.refresh(); - }else{ - this.openDropDown(); - } + var handler = dropDown.on("load", lang.hitch(this, function(){ + handler.remove(); + callback(); + })); + dropDown.refresh(); // tell it to load }, isFocusable: function(){ @@ -11987,15828 +13141,19107 @@ dojo.declare("dijit.form.DropDownButton", [dijit.form.Button, dijit._Container, } }); -dojo.declare("dijit.form.ComboButton", dijit.form.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 dojoType="dijit.form.ComboButton" onClick="..."> - // | <span>Hello world</span> - // | <div dojoType="dijit.Menu">...</div> - // | </button> - // - // example: - // | var button1 = new dijit.form.ComboButton({label: "hello world", onClick: foo, dropDown: "myMenu"}); - // | dojo.body().appendChild(button1.domNode); - // - - templateString: dojo.cache("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\" dojoAttachPoint=\"buttonNode\" dojoAttachEvent=\"ondijitclick:_onButtonClick,onkeypress:_onButtonKeyPress\"\n\t\t><div id=\"${id}_button\" class=\"dijitReset dijitButtonContents\"\n\t\t\tdojoAttachPoint=\"titleNode\"\n\t\t\trole=\"button\" aria-labelledby=\"${id}_label\"\n\t\t\t><div class=\"dijitReset dijitInline dijitIcon\" dojoAttachPoint=\"iconNode\" role=\"presentation\"></div\n\t\t\t><div class=\"dijitReset dijitInline dijitButtonText\" id=\"${id}_label\" dojoAttachPoint=\"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\tdojoAttachPoint=\"_popupStateNode,focusNode,_buttonNode\"\n\t\t\tdojoAttachEvent=\"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}\" dojoAttachPoint=\"valueNode\"\n\t\t/></td></tr></tbody\n></table>\n"), - - attributeMap: dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap), { - id: "", - tabIndex: ["focusNode", "titleNode"], - title: "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 == dojo.keys[this.isLeftToRight() ? "RIGHT_ARROW" : "LEFT_ARROW"]){ - dijit.focus(this._popupStateNode); - dojo.stopEvent(evt); - } - }, - - _onArrowKeyPress: function(/*Event*/ evt){ - // summary: - // Handler for left arrow key when focus is on right part of button - if(evt.charOrCode == dojo.keys[this.isLeftToRight() ? "LEFT_ARROW" : "RIGHT_ARROW"]){ - dijit.focus(this.titleNode); - dojo.stopEvent(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){ - dijit.focus(position == "start" ? this.titleNode : this._popupStateNode); - } - } -}); - -dojo.declare("dijit.form.ToggleButton", dijit.form.Button, { - // summary: - // A button that can be in two states (checked or not). - // Can be base class for things like tabs or checkbox or radio buttons - - baseClass: "dijitToggleButton", - - // 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, - - attributeMap: dojo.mixin(dojo.clone(dijit.form.Button.prototype.attributeMap), { - checked:"focusNode" - }), - - _clicked: function(/*Event*/ evt){ - this.set('checked', !this.checked); - }, - - _setCheckedAttr: function(/*Boolean*/ value, /*Boolean?*/ priorityChange){ - this._set("checked", value); - dojo.attr(this.focusNode || this.domNode, "checked", value); - dijit.setWaiState(this.focusNode || this.domNode, "pressed", value); - this._handleOnChange(value, priorityChange); - }, - - setChecked: function(/*Boolean*/ checked){ - // summary: - // Deprecated. Use set('checked', true/false) instead. - dojo.deprecated("setChecked("+checked+") is deprecated. Use set('checked',"+checked+") instead.", "", "2.0"); - this.set('checked', checked); - }, - - 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); - } }); -} - -if(!dojo._hasResource["dijit.form.ToggleButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.ToggleButton"] = true; -dojo.provide("dijit.form.ToggleButton"); - - - - -} - -if(!dojo._hasResource["dijit.form.CheckBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.CheckBox"] = true; -dojo.provide("dijit.form.CheckBox"); +}, +'dijit/form/_FormValueMixin':function(){ +define("dijit/form/_FormValueMixin", [ + "dojo/_base/declare", // declare + "dojo/dom-attr", // domAttr.set + "dojo/keys", // keys.ESCAPE + "dojo/_base/sniff", // has("ie"), has("quirks") + "./_FormWidgetMixin" +], function(declare, domAttr, keys, has, _FormWidgetMixin){ +/*===== + var _FormWidgetMixin = dijit.form._FormWidgetMixin; +=====*/ + // module: + // dijit/form/_FormValueMixin + // summary: + // Mixin for widgets corresponding to native HTML elements such as <input> or <select> that have user changeable values. -dojo.declare( - "dijit.form.CheckBox", - dijit.form.ToggleButton, - { + return declare("dijit.form._FormValueMixin", _FormWidgetMixin, { // summary: - // Same as an HTML checkbox, but with fancy styling. - // + // Mixin for widgets corresponding to native HTML elements such as <input> or <select> that have user changeable values. // 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: dojo.cache("dijit.form", "templates/CheckBox.html", "<div class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><input\n\t \t${!nameAttrSetting} type=\"${type}\" ${checkedAttrSetting}\n\t\tclass=\"dijitReset dijitCheckBoxInput\"\n\t\tdojoAttachPoint=\"focusNode\"\n\t \tdojoAttachEvent=\"onclick:_onClick\"\n/></div>\n"), - - baseClass: "dijitCheckBox", - - // 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). - // - // However, get('value') will return either the string or false depending on - // whether or not the checkbox is checked. - // - // set('value', string) will check the checkbox and change the value to the - // specified string - // - // set('value', boolean) will change the checked state. - value: "on", + // 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, - - // the attributeMap should inherit from dijit.form._FormWidget.prototype.attributeMap - // instead of ToggleButton as the icon mapping has no meaning for a CheckBox - attributeMap: dojo.delegate(dijit.form._FormWidget.prototype.attributeMap, { - readOnly: "focusNode" - }), _setReadOnlyAttr: function(/*Boolean*/ value){ + domAttr.set(this.focusNode, 'readOnly', value); + this.focusNode.setAttribute("aria-readonly", value); this._set("readOnly", value); - dojo.attr(this.focusNode, 'readOnly', value); - dijit.setWaiState(this.focusNode, "readonly", value); }, - _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 - // dojoType="dijit.CheckBox" value="chicken">) - if(typeof newValue == "string"){ - this._set("value", newValue); - dojo.attr(this.focusNode, 'value', newValue); - newValue = true; + 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); } - if(this._created){ - this.set('checked', newValue, priorityChange); + // 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; } }, - _getValueAttr: function(){ + + _setValueAttr: function(/*anything*/ newValue, /*Boolean?*/ priorityChange){ // summary: - // Hook so get('value') works. + // Hook so set('value', value) works. // description: - // If the CheckBox is checked, returns the value attribute. - // Otherwise returns false. - return (this.checked ? this.value : false); + // 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); }, - // 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, - - postMixInProperties: function(){ - if(this.value == ""){ - this.value = "on"; - } - - // Need to set initial checked state as part of template, so that form submit works. - // dojo.attr(node, "checked", bool) doesn't work on IEuntil node has been attached - // to <body>, see #8666 - this.checkedAttrSetting = this.checked ? "checked" : ""; - + _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); }, - _fillContent: function(/*DomNode*/ source){ - // Override Button::_fillContent() since it doesn't make sense for CheckBox, - // since CheckBox doesn't even have a container + undo: function(){ + // summary: + // Restore the value to the last value passed to onChange + this._setValueAttr(this._lastValueReported, false); }, reset: function(){ - // Override ToggleButton.reset() - + // 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)){ + var te; + if(has("ie") < 9 || (has("ie") && has("quirks"))){ + e.preventDefault(); // default behavior needs to be stopped here since keypress is too late + te = document.createEventObject(); + te.keyCode = keys.ESCAPE; + te.shiftKey = e.shiftKey; + e.srcElement.fireEvent('onkeypress', te); + } + } + } + }); +}); - this.set('checked', this.params.checked || false); +}, +'dijit/form/_FormWidgetMixin':function(){ +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/_base/sniff", // has("webkit") + "dojo/_base/window", // win.body + "dojo/window", // winUtils.scrollIntoView + "../a11y" // a11y.hasDefaultTabStop +], function(array, declare, domAttr, domStyle, lang, mouse, has, win, winUtils, a11y){ + +// module: +// dijit/form/_FormWidgetMixin +// 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. - // Handle unlikely event that the <input type=checkbox> value attribute has changed - this._set("value", this.params.value || "on"); - dojo.attr(this.focusNode, 'value', this.value); - }, +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._Widget.attr`. + // + // They also share some common methods. - _onFocus: function(){ - if(this.id){ - dojo.query("label[for='"+this.id+"']").addClass("dijitFocusedLabel"); - } - this.inherited(arguments); - }, + // name: [const] String + // Name used when submitting form; same as "name" attribute or plain HTML elements + name: "", - _onBlur: function(){ - if(this.id){ - dojo.query("label[for='"+this.id+"']").removeClass("dijitFocusedLabel"); - } - this.inherited(arguments); - }, + // alt: String + // Corresponds to the native HTML <input> element's attribute. + alt: "", - _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){ - dojo.stopEvent(e); - return false; - } - return this.inherited(arguments); - } - } -); + // value: String + // Corresponds to the native HTML <input> element's attribute. + value: "", -dojo.declare( - "dijit.form.RadioButton", - dijit.form.CheckBox, - { - // summary: - // Same as an HTML radio, but with fancy styling. + // type: [const] String + // Corresponds to the native HTML <input> element's attribute. + type: "text", - type: "radio", - baseClass: "dijitRadio", + // tabIndex: Integer + // 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> - _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){ - var _this = this; - // search for radio buttons with the same name that need to be unchecked - dojo.query("INPUT[type=radio]", this.focusNode.form || dojo.doc).forEach( // can't use name= since dojo.query doesn't support [] in the name - function(inputNode){ - if(inputNode.name == _this.name && inputNode != _this.focusNode && inputNode.form == _this.focusNode.form){ - var widget = dijit.getEnclosingWidget(inputNode); - if(widget && widget.checked){ - widget.set('checked', false); - } - } - } - ); - } - }, + // disabled: Boolean + // Should this widget respond to user input? + // In markup, this is specified as "disabled='disabled'", or just "disabled". + disabled: false, - _clicked: function(/*Event*/ e){ - if(!this.checked){ - this.set('checked', true); - } - } - } -); + // 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, -if(!dojo._hasResource["dijit.form.DropDownButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.DropDownButton"] = true; -dojo.provide("dijit.form.DropDownButton"); + // 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(win.body(), "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); + }, -if(!dojo._hasResource["dojo.regexp"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.regexp"] = true; -dojo.provide("dojo.regexp"); + 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"); + }, -dojo.getObject("regexp", true, dojo); + 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*/ + } + }, -/*===== -dojo.regexp = { - // summary: Regular expressions and Builder resources -}; -=====*/ + 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; + } + }, -dojo.regexp.escapeString = function(/*String*/str, /*String?*/except){ - // summary: - // Adds escape sequences for special characters in regular expressions - // except: - // a String with special characters to be left unescaped + onChange: function(/*===== newValue =====*/){ + // summary: + // Callback when this widget's value is changed. + // tags: + // callback + }, - return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, function(ch){ - if(except && except.indexOf(ch) != -1){ - return ch; + // _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; } - return "\\" + ch; - }); // String -}; + 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 + } + } + }, -dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boolean?*/nonCapture){ - // summary: - // Builds a regular expression that groups subexpressions - // description: - // A utility function used by some of the RE generators. The - // subexpressions are constructed by the function, re, in the second - // parameter. re builds one subexpression for each elem in the array - // a, in the first parameter. Returns a string for a regular - // expression that groups all the subexpressions. - // arr: - // A single value or an array of values. - // re: - // A function. Takes one parameter and converts it to a regular - // expression. - // nonCapture: - // If true, uses non-capturing match, otherwise matches are retained - // by regular expression. Defaults to false + create: function(){ + // Overrides _Widget.create() + this.inherited(arguments); + this._onChangeActive = true; + }, - // case 1: a is a single value. - if(!(arr instanceof Array)){ - return re(arr); // String + destroy: function(){ + if(this._onChangeHandle){ // destroy called before last onChange has fired + this._onChangeHandle.remove(); + this.onChange(this._lastValueReported); + } + this.inherited(arguments); } +}); - // case 2: a is an array - var b = []; - for(var i = 0; i < arr.length; i++){ - // convert each elem to a RE - b.push(re(arr[i])); - } +}); - // join the REs as alternatives in a RE group. - return dojo.regexp.group(b.join("|"), nonCapture); // String -}; +}, +'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", +'dijit/layout/_ContentPaneResizeMixin':function(){ +define("dijit/layout/_ContentPaneResizeMixin", [ + "dojo/_base/array", // array.filter array.forEach + "dojo/_base/declare", // declare + "dojo/dom-attr", // domAttr.has + "dojo/dom-class", // domClass.contains domClass.toggle + "dojo/dom-geometry",// domGeometry.contentBox domGeometry.marginBox + "dojo/_base/lang", // lang.mixin + "dojo/query", // query + "dojo/_base/sniff", // has("ie") + "dojo/_base/window", // win.global + "../registry", // registry.byId + "./utils", // marginBox2contextBox + "../_Contained" +], function(array, declare, domAttr, domClass, domGeometry, lang, query, has, win, + registry, layoutUtils, _Contained){ -dojo.regexp.group = function(/*String*/expression, /*Boolean?*/nonCapture){ - // summary: - // adds group match to expression - // nonCapture: - // If true, uses non-capturing match, otherwise matches are retained - // by regular expression. - return "(" + (nonCapture ? "?:":"") + expression + ")"; // String -}; +/*===== +var _Contained = dijit._Contained; +=====*/ -} +// module: +// dijit/layout/_ContentPaneResizeMixin +// 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. -if(!dojo._hasResource["dojo.data.util.sorter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.data.util.sorter"] = true; -dojo.provide("dojo.data.util.sorter"); -dojo.getObject("data.util.sorter", true, dojo); +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 -dojo.data.util.sorter.basicComparator = function( /*anything*/ a, - /*anything*/ b){ - // summary: - // Basic comparision function that compares if an item is greater or less than another item - // description: - // returns 1 if a > b, -1 if a < b, 0 if equal. - // 'null' values (null, undefined) are treated as larger values so that they're pushed to the end of the list. - // And compared to each other, null is equivalent to undefined. - - //null is a problematic compare, so if null, we set to undefined. - //Makes the check logic simple, compact, and consistent - //And (null == undefined) === true, so the check later against null - //works for undefined and is less bytes. - var r = -1; - if(a === null){ - a = undefined; - } - if(b === null){ - b = undefined; - } - if(a == b){ - r = 0; - }else if(a > b || a == null){ - r = 1; - } - return r; //int {-1,0,1} -}; + // 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, -dojo.data.util.sorter.createSortFunction = function( /* attributes array */sortSpec, - /*dojo.data.core.Read*/ store){ - // summary: - // Helper function to generate the sorting function based off the list of sort attributes. - // description: - // The sort function creation will look for a property on the store called 'comparatorMap'. If it exists - // it will look in the mapping for comparisons function for the attributes. If one is found, it will - // use it instead of the basic comparator, which is typically used for strings, ints, booleans, and dates. - // Returns the sorting function for this particular list of attributes and sorting directions. - // - // sortSpec: array - // A JS object that array that defines out what attribute names to sort on and whether it should be descenting or asending. - // The objects should be formatted as follows: - // { - // attribute: "attributeName-string" || attribute, - // descending: true|false; // Default is false. - // } - // store: object - // The datastore object to look up item values from. - // - var sortFunctions=[]; + // isLayoutContainer: [protected] Boolean + // Indicates that this widget will call resize() on it's child widgets + // when they become visible. + isLayoutContainer: true, - function createSortFunction(attr, dir, comp, s){ - //Passing in comp and s (comparator and store), makes this - //function much faster. - return function(itemA, itemB){ - var a = s.getValue(itemA, attr); - var b = s.getValue(itemB, attr); - return dir * comp(a,b); //int - }; - } - var sortAttribute; - var map = store.comparatorMap; - var bc = dojo.data.util.sorter.basicComparator; - for(var i = 0; i < sortSpec.length; i++){ - sortAttribute = sortSpec[i]; - var attr = sortAttribute.attribute; - if(attr){ - var dir = (sortAttribute.descending) ? -1 : 1; - var comp = bc; - if(map){ - if(typeof attr !== "string" && ("toString" in attr)){ - attr = attr.toString(); - } - comp = map[attr] || bc; - } - sortFunctions.push(createSortFunction(attr, - dir, comp, store)); - } - } - return function(rowA, rowB){ - var i=0; - while(i < sortFunctions.length){ - var ret = sortFunctions[i++](rowA, rowB); - if(ret !== 0){ - return ret;//int - } - } - return 0; //int - }; // Function -}; + 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; } -if(!dojo._hasResource["dojo.data.util.simpleFetch"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.data.util.simpleFetch"] = true; -dojo.provide("dojo.data.util.simpleFetch"); + 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; -dojo.getObject("data.util.simpleFetch", true, dojo); + this.inherited(arguments); -dojo.data.util.simpleFetch.fetch = function(/* Object? */ request){ - // summary: - // The simpleFetch mixin is designed to serve as a set of function(s) that can - // be mixed into other datastore implementations to accelerate their development. - // The simpleFetch mixin should work well for any datastore that can respond to a _fetchItems() - // call by returning an array of all the found items that matched the query. The simpleFetch mixin - // is not designed to work for datastores that respond to a fetch() call by incrementally - // loading items, or sequentially loading partial batches of the result - // set. For datastores that mixin simpleFetch, simpleFetch - // implements a fetch method that automatically handles eight of the fetch() - // arguments -- onBegin, onItem, onComplete, onError, start, count, sort and scope - // The class mixing in simpleFetch should not implement fetch(), - // but should instead implement a _fetchItems() method. The _fetchItems() - // method takes three arguments, the keywordArgs object that was passed - // to fetch(), a callback function to be called when the result array is - // available, and an error callback to be called if something goes wrong. - // The _fetchItems() method should ignore any keywordArgs parameters for - // start, count, onBegin, onItem, onComplete, onError, sort, and scope. - // The _fetchItems() method needs to correctly handle any other keywordArgs - // parameters, including the query parameter and any optional parameters - // (such as includeChildren). The _fetchItems() method should create an array of - // result items and pass it to the fetchHandler along with the original request object - // -- or, the _fetchItems() method may, if it wants to, create an new request object - // with other specifics about the request that are specific to the datastore and pass - // that as the request object to the handler. - // - // For more information on this specific function, see dojo.data.api.Read.fetch() - request = request || {}; - if(!request.store){ - request.store = this; - } - var self = this; + if(this._isShown()){ + this._onShow(); + } - var _errorHandler = function(errorData, requestObject){ - if(requestObject.onError){ - var scope = requestObject.scope || dojo.global; - requestObject.onError.call(scope, errorData, requestObject); + if(!this._childOfLayoutWidget){ + // If my parent isn't a layout container, since my style *may be* width=height=100% + // or something similar (either set directly or via a CSS class), + // monitor when my size changes so that I can re-layout. + // For browsers where I can't directly monitor when my size changes, + // monitor when the viewport changes size, which *may* indicate a size change for me. + this.connect(has("ie") ? this.domNode : win.global, 'onresize', function(){ + // Using function(){} closure to ensure no arguments to resize. + this._needLayout = !this._childOfLayoutWidget; + this.resize(); + }); } - }; + }, - var _fetchHandler = function(items, requestObject){ - var oldAbortFunction = requestObject.abort || null; - var aborted = false; + _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 startIndex = requestObject.start?requestObject.start:0; - var endIndex = (requestObject.count && (requestObject.count !== Infinity))?(startIndex + requestObject.count):items.length; + var childNodes = query("> *", this.containerNode).filter(function(node){ + return node.tagName !== "SCRIPT"; // or a regexp for hidden elements like script|area|map|etc.. + }), + childWidgetNodes = childNodes.filter(function(node){ + return domAttr.has(node, "data-dojo-type") || domAttr.has(node, "dojoType") || domAttr.has(node, "widgetId"); + }), + candidateWidgets = array.filter(childWidgetNodes.map(registry.byNode), function(widget){ + return widget && widget.domNode && widget.resize; + }); - requestObject.abort = function(){ - aborted = true; - if(oldAbortFunction){ - oldAbortFunction.call(requestObject); - } - }; + if( + // all child nodes are widgets + childNodes.length == childWidgetNodes.length && - var scope = requestObject.scope || dojo.global; - if(!requestObject.store){ - requestObject.store = self; + // all but one are invisible (like dojo.data) + candidateWidgets.length == 1 + ){ + this._singleChild = candidateWidgets[0]; + }else{ + delete this._singleChild; } - if(requestObject.onBegin){ - requestObject.onBegin.call(scope, items.length, requestObject); + + // 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. + + // For the TabContainer --> BorderContainer --> ContentPane case, _onShow() is + // never called, 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(); } - if(requestObject.sort){ - items.sort(dojo.data.util.sorter.createSortFunction(requestObject.sort, self)); + + 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; } - if(requestObject.onItem){ - for(var i = startIndex; (i < items.length) && (i < endIndex); ++i){ - var item = items[i]; - if(!aborted){ - requestObject.onItem.call(scope, item, requestObject); - } - } + }, + + _layout: function(changeSize, resultSize){ + // summary: + // Resize myself according to optional changeSize/resultSize parameters, like a layout widget. + // Also, since I am a Container widget, each of my children expects me to + // call resize() or layout() on them. + // + // 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 + + // Set margin box size, unless it wasn't specified, in which case use current size. + if(changeSize){ + domGeometry.setMarginBox(this.domNode, changeSize); } - if(requestObject.onComplete && !aborted){ - var subset = null; - if(!requestObject.onItem){ - subset = items.slice(startIndex, endIndex); + + // 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 } - requestObject.onComplete.call(scope, subset, requestObject); + this._contentBox = layoutUtils.marginBox2contentBox(cn, mb); + }else{ + this._contentBox = domGeometry.getContentBox(cn); } - }; - this._fetchItems(request, _fetchHandler, _errorHandler); - return request; // Object -}; - -} -if(!dojo._hasResource["dojo.data.util.filter"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.data.util.filter"] = true; -dojo.provide("dojo.data.util.filter"); + this._layoutChildren(); -dojo.getObject("data.util.filter", true, dojo); - -dojo.data.util.filter.patternToRegExp = function(/*String*/pattern, /*boolean?*/ ignoreCase){ - // summary: - // Helper function to convert a simple pattern to a regular expression for matching. - // description: - // Returns a regular expression object that conforms to the defined conversion rules. - // For example: - // ca* -> /^ca.*$/ - // *ca* -> /^.*ca.*$/ - // *c\*a* -> /^.*c\*a.*$/ - // *c\*a?* -> /^.*c\*a..*$/ - // and so on. - // - // pattern: string - // A simple matching pattern to convert that follows basic rules: - // * Means match anything, so ca* means match anything starting with ca - // ? Means match single character. So, b?b will match to bob and bab, and so on. - // \ is an escape character. So for example, \* means do not treat * as a match, but literal character *. - // To use a \ as a character in the string, it must be escaped. So in the pattern it should be - // represented by \\ to be treated as an ordinary \ character instead of an escape. - // - // ignoreCase: - // An optional flag to indicate if the pattern matching should be treated as case-sensitive or not when comparing - // By default, it is assumed case sensitive. + delete this._needLayout; + }, - var rxp = "^"; - var c = null; - for(var i = 0; i < pattern.length; i++){ - c = pattern.charAt(i); - switch(c){ - case '\\': - rxp += c; - i++; - rxp += pattern.charAt(i); - break; - case '*': - rxp += ".*"; break; - case '?': - rxp += "."; break; - case '$': - case '^': - case '/': - case '+': - case '.': - case '|': - case '(': - case ')': - case '{': - case '}': - case '[': - case ']': - rxp += "\\"; //fallthrough - default: - rxp += c; + _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(); } - } - rxp += "$"; - if(ignoreCase){ - return new RegExp(rxp,"mi"); //RegExp - }else{ - return new RegExp(rxp,"m"); //RegExp - } - -}; - -} - -if(!dojo._hasResource["dijit.form.TextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.TextBox"] = true; -dojo.provide("dijit.form.TextBox"); + 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(); + } + }); + } + }, -dojo.declare( - "dijit.form.TextBox", - dijit.form._FormValueWidget, - { + _isShown: function(){ // summary: - // A base class for textbox form inputs - - // trim: Boolean - // Removes leading and trailing whitespace if true. Default is false. - trim: false, + // 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 - // uppercase: Boolean - // Converts all characters to uppercase if true. Default is false. - uppercase: false, + 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'); + } + }, - // lowercase: Boolean - // Converts all characters to lowercase if true. Default is false. - lowercase: false, + _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) - // propercase: Boolean - // Converts the first character of each word to uppercase if true. - propercase: false, + if(this._needLayout){ + // If a layout has been scheduled for when we become visible, do it now + this._layout(this._changeSize, this._resultSize); + } - // maxLength: String - // HTML INPUT tag maxLength declaration. - maxLength: "", + this.inherited(arguments); - // selectOnClick: [const] Boolean - // If true, all text will be selected when focused with mouse - selectOnClick: false, + // Need to keep track of whether ContentPane has been shown (which is different than + // whether or not it's currently visible). + this._wasShown = true; + } +}); - // 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: "", - - templateString: dojo.cache("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\" dojoAttachPoint='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"), - _singleNodeTemplate: '<input class="dijit dijitReset dijitLeft dijitInputField" dojoAttachPoint="textbox,focusNode" autocomplete="off" type="${type}" ${!nameAttrSetting} />', +}); - _buttonInputDisabled: dojo.isIE ? "disabled" : "", // allows IE to disallow focus, but Firefox cannot be disabled for mousedown events +}, +'dijit/WidgetSet':function(){ +define("dijit/WidgetSet", [ + "dojo/_base/array", // array.forEach array.map + "dojo/_base/declare", // declare + "dojo/_base/window", // win.global + "./registry" // to add functions to dijit.registry +], function(array, declare, win, registry){ + + // module: + // dijit/WidgetSet + // summary: + // Legacy registry code. New modules should just use registry. + // Will be removed in 2.0. - baseClass: "dijitTextBox", + var WidgetSet = declare("dijit.WidgetSet", null, { + // summary: + // A set of widgets indexed by id. A default instance of this class is + // available as `dijit.registry` + // + // example: + // Create a small list of widgets: + // | var ws = new dijit.WidgetSet(); + // | ws.add(dijit.byId("one")); + // | ws.add(dijit.byId("two")); + // | // destroy both: + // | ws.forEach(function(w){ w.destroy(); }); + // + // example: + // Using dijit.registry: + // | dijit.registry.forEach(function(w){ /* do something */ }); - attributeMap: dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap, { - maxLength: "focusNode" - }), - - postMixInProperties: function(){ - var type = this.type.toLowerCase(); - if(this.templateString && this.templateString.toLowerCase() == "input" || ((type == "hidden" || type == "file") && this.templateString == dijit.form.TextBox.prototype.templateString)){ - this.templateString = this._singleNodeTemplate; - } - this.inherited(arguments); + constructor: function(){ + this._hash = {}; + this.length = 0; }, - _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 = dojo.create('span',{className:'dijitPlaceHolder dijitInputField'},this.textbox,'after'); - } - this._phspan.innerHTML=""; - this._phspan.appendChild(document.createTextNode(v)); - - this._updatePlaceHolder(); - }, - - _updatePlaceHolder: function(){ - if(this._phspan){ - this._phspan.style.display=(this.placeHolder&&!this._focused&&!this.textbox.value)?"":"none"; + add: function(/*dijit._Widget*/ widget){ + // summary: + // Add a widget to this list. If a duplicate ID is detected, a error is thrown. + // + // widget: dijit._Widget + // Any dijit._Widget 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++; }, - _getValueAttr: function(){ + remove: function(/*String*/ id){ // 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); + // 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--; + } }, - _setValueAttr: function(value, /*Boolean?*/ priorityChange, /*String?*/ formattedValue){ + forEach: function(/*Function*/ func, /* Object? */thisObj){ // summary: - // Hook so set('value', ...) works. + // Call specified function for each widget in this set. // - // description: - // Sets the value of the widget to "value" which can be of - // any type as determined by the widget. + // 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`. // - // value: - // The visual element value is also set to a corresponding, - // but not necessarily the same, value. + // thisObj: + // An optional scope parameter // - // formattedValue: - // If specified, used to set the visual element value, - // otherwise a computed visual value is used. + // example: + // Using the default `dijit.registry` instance: + // | dijit.registry.forEach(function(widget){ + // | console.log(widget.declaredClass); + // | }); // - // priorityChange: - // If true, an onChange event is fired immediately instead of - // waiting for the next blur event. + // returns: + // Returns self, in order to allow for further chaining. - 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 = ''; } - } + thisObj = thisObj || win.global; + var i = 0, id; + for(id in this._hash){ + func.call(thisObj, this._hash[id], i++, this._hash); } - if(formattedValue != null && formattedValue != undefined && ((typeof formattedValue) != "number" || !isNaN(formattedValue)) && this.textbox.value != formattedValue){ - this.textbox.value = formattedValue; - this._set("displayedValue", this.get("displayedValue")); - } - - this._updatePlaceHolder(); - - this.inherited(arguments, [filteredValue, priorityChange]); + return this; // dijit.WidgetSet }, - // 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: "", - - getDisplayedValue: function(){ + filter: function(/*Function*/ filter, /* Object? */thisObj){ // summary: - // Deprecated. Use get('displayedValue') instead. - // tags: - // deprecated - dojo.deprecated(this.declaredClass+"::getDisplayedValue() is deprecated. Use set('displayedValue') instead.", "", "2.0"); - return this.get('displayedValue'); + // 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 + // | dijit.registry.filter(function(w, i){ + // | return i % 2 == 0; + // | }).forEach(function(w){ /* odd ones */ }); + + thisObj = thisObj || win.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 }, - _getDisplayedValueAttr: function(){ + byId: function(/*String*/ id){ // 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) + // Find a widget in this list by it's id. + // example: + // Test if an id is in a particular WidgetSet + // | var ws = new dijit.WidgetSet(); + // | ws.add(dijit.byId("bar")); + // | var t = ws.byId("bar") // returns a widget + // | var x = ws.byId("foo"); // returns undefined - // 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); + return this._hash[id]; // dijit._Widget }, - setDisplayedValue: function(/*String*/ value){ + byClass: function(/*String*/ cls){ // summary: - // Deprecated. Use set('displayedValue', ...) instead. - // tags: - // deprecated - dojo.deprecated(this.declaredClass+"::setDisplayedValue() is deprecated. Use set('displayedValue', ...) instead.", "", "2.0"); - this.set('displayedValue', value); + // 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: + // | dijit.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 }, - _setDisplayedValueAttr: function(/*String*/ value){ + toArray: function(){ // 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 || value === 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); + // Convert this WidgetSet into a true Array + // + // example: + // Work with the widget .domNodes in a real Array + // | array.map(dijit.registry.toArray(), function(w){ return w.domNode; }); - this._set("displayedValue", this.get('displayedValue')); + var ar = []; + for(var id in this._hash){ + ar.push(this._hash[id]); + } + return ar; // dijit._Widget[] }, - format: function(/*String*/ value, /*Object*/ constraints){ + map: function(/* Function */func, /* Object? */thisObj){ // summary: - // Replacable function to convert a value to a properly formatted string. - // tags: - // protected extension - return ((value == null || value == undefined) ? "" : (value.toString ? value.toString() : value)); + // Create a new Array from this WidgetSet, following the same rules as `array.map` + // example: + // | var nodes = dijit.registry.map(function(w){ return w.domNode; }); + // + // returns: + // A new array of the returned values. + return array.map(this.toArray(), func, thisObj); // Array }, - parse: function(/*String*/ value, /*Object*/ constraints){ + every: function(func, thisObj){ // summary: - // Replacable function to convert a formatted string to a value - // tags: - // protected extension - - return value; // String + // 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 || win.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 }, - _refreshState: function(){ + some: function(func, thisObj){ // 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 - }, + // 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 - _onInput: function(e){ - if(e && e.type && /key/i.test(e.type) && e.keyCode){ - switch(e.keyCode){ - case dojo.keys.SHIFT: - case dojo.keys.ALT: - case dojo.keys.CTRL: - case dojo.keys.TAB: - return; + thisObj = thisObj || win.global; + var x = 0, i; + for(i in this._hash){ + if(func.call(thisObj, this._hash[i], x++, this._hash)){ + return true; // Boolean } } - if(this.intermediateChanges){ - var _this = this; - // the setTimeout allows the key to post to the widget input box - setTimeout(function(){ _this._handleOnChange(_this.get('value'), false); }, 0); - } - this._refreshState(); + return false; // Boolean + } - // In case someone is watch()'ing for changes to displayedValue - this._set("displayedValue", this.get("displayedValue")); - }, + }); - postCreate: function(){ - if(dojo.isIE){ // IE INPUT tag fontFamily has to be set directly using STYLE - // the setTimeout gives IE a chance to render the TextBox and to deal with font inheritance - setTimeout(dojo.hitch(this, function(){ - var s = dojo.getComputedStyle(this.domNode); - 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; - } - } - } - } - }), 0); - } + // 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]; + }); - // 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); + return WidgetSet; +}); - if(dojo.isMoz || dojo.isOpera){ - this.connect(this.textbox, "oninput", "_onInput"); - }else{ - this.connect(this.textbox, "onkeydown", "_onInput"); - this.connect(this.textbox, "onkeyup", "_onInput"); - this.connect(this.textbox, "onpaste", "_onInput"); - this.connect(this.textbox, "oncut", "_onInput"); - } - }, +}, +'dojo/dnd/Moveable':function(){ +define("dojo/dnd/Moveable", ["../main", "../Evented", "../touch", "./Mover"], function(dojo, Evented, touch) { + // module: + // dojo/dnd/Moveable + // summary: + // TODOC - _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 = dojo.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); +/*===== +dojo.declare("dojo.dnd.__MoveableArgs", [], { + // handle: Node||String + // A node (or node's id), which is used as a mouse handle. + // If omitted, the node itself is used as a handle. + handle: null, - if(this._selectOnClickHandle){ - this.disconnect(this._selectOnClickHandle); - } - if(this.selectOnClick && dojo.isMoz){ - this.textbox.selectionStart = this.textbox.selectionEnd = undefined; // clear selection so that the next mouse click doesn't reselect - } - - this._updatePlaceHolder(); - }, + // delay: Number + // delay move by this number of pixels + delay: 0, - _onFocus: function(/*String*/ by){ - if(this.disabled || this.readOnly){ return; } + // skip: Boolean + // skip move of form elements + skip: false, - // 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); - - // Check if the user selected some text manually (mouse-down, mouse-move, mouse-up) - // and if not, then select all the text - var textIsNotSelected; - if(dojo.isIE){ - var range = dojo.doc.selection.createRange(); - var parent = range.parentElement(); - textIsNotSelected = parent == this.textbox && range.text.length == 0; - }else{ - textIsNotSelected = this.textbox.selectionStart == this.textbox.selectionEnd; - } - if(textIsNotSelected){ - dijit.selectInputText(this.textbox); - } - }); - } + // mover: Object + // a constructor of custom Mover + mover: dojo.dnd.Mover +}); +=====*/ - this._updatePlaceHolder(); - - // 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); +dojo.declare("dojo.dnd.Moveable", [Evented], { + // object attributes (for markup) + handle: "", + delay: 0, + skip: false, - this._refreshState(); - }, + constructor: function(node, params){ + // summary: + // an object, which makes a node moveable + // node: Node + // a node (or node's id) to be moved + // params: dojo.dnd.__MoveableArgs? + // optional parameters + this.node = dojo.byId(node); + if(!params){ params = {}; } + this.handle = params.handle ? dojo.byId(params.handle) : null; + if(!this.handle){ this.handle = this.node; } + this.delay = params.delay > 0 ? params.delay : 0; + this.skip = params.skip; + this.mover = params.mover ? params.mover : dojo.dnd.Mover; + this.events = [ + dojo.connect(this.handle, touch.press, this, "onMouseDown"), + // cancel text selection and text dragging + dojo.connect(this.handle, "ondragstart", this, "onSelectStart"), + dojo.connect(this.handle, "onselectstart", this, "onSelectStart") + ]; + }, - reset: function(){ - // Overrides dijit._FormWidget.reset(). - // Additionally resets the displayed textbox value to '' - this.textbox.value = ''; - this.inherited(arguments); - } - } -); + // markup methods + markupFactory: function(params, node, ctor){ + return new ctor(node, params); + }, -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). + // methods + destroy: function(){ + // summary: + // stops watching for possible move, deletes all references, so the object can be garbage-collected + dojo.forEach(this.events, dojo.disconnect); + this.events = this.node = this.handle = null; + }, - // TODO: use functions in _editor/selection.js? - var _window = dojo.global; - var _document = dojo.doc; - element = dojo.byId(element); - if(isNaN(start)){ start = 0; } - if(isNaN(stop)){ stop = element.value ? element.value.length : 0; } - dijit.focus(element); - if(_document["selection"] && dojo.body()["createTextRange"]){ // IE - 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(); - } - }else if(_window["getSelection"]){ - if(element.setSelectionRange){ - element.setSelectionRange(start, stop); + // mouse event processors + onMouseDown: function(e){ + // summary: + // event processor for onmousedown/ontouchstart, creates a Mover for the node + // e: Event + // mouse/touch event + if(this.skip && dojo.dnd.isFormElement(e)){ return; } + if(this.delay){ + this.events.push( + dojo.connect(this.handle, touch.move, this, "onMouseMove"), + dojo.connect(this.handle, touch.release, this, "onMouseUp") + ); + this._lastX = e.pageX; + this._lastY = e.pageY; + }else{ + this.onDragDetected(e); } - } -}; - -} - -if(!dojo._hasResource["dijit.Tooltip"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.Tooltip"] = true; -dojo.provide("dijit.Tooltip"); - + dojo.stopEvent(e); + }, + onMouseMove: function(e){ + // summary: + // event processor for onmousemove/ontouchmove, used only for delayed drags + // e: Event + // mouse/touch event + if(Math.abs(e.pageX - this._lastX) > this.delay || Math.abs(e.pageY - this._lastY) > this.delay){ + this.onMouseUp(e); + this.onDragDetected(e); + } + dojo.stopEvent(e); + }, + onMouseUp: function(e){ + // summary: + // event processor for onmouseup, used only for delayed drags + // e: Event + // mouse event + for(var i = 0; i < 2; ++i){ + dojo.disconnect(this.events.pop()); + } + dojo.stopEvent(e); + }, + onSelectStart: function(e){ + // summary: + // event processor for onselectevent and ondragevent + // e: Event + // mouse event + if(!this.skip || !dojo.dnd.isFormElement(e)){ + dojo.stopEvent(e); + } + }, + // local events + onDragDetected: function(/* Event */ e){ + // summary: + // called when the drag is detected; + // responsible for creation of the mover + new this.mover(this.node, e, this); + }, + onMoveStart: function(/* dojo.dnd.Mover */ mover){ + // summary: + // called before every move operation + dojo.publish("/dnd/move/start", [mover]); + dojo.addClass(dojo.body(), "dojoMove"); + dojo.addClass(this.node, "dojoMoveItem"); + }, + onMoveStop: function(/* dojo.dnd.Mover */ mover){ + // summary: + // called after every move operation + dojo.publish("/dnd/move/stop", [mover]); + dojo.removeClass(dojo.body(), "dojoMove"); + dojo.removeClass(this.node, "dojoMoveItem"); + }, + onFirstMove: function(/* dojo.dnd.Mover */ mover, /* Event */ e){ + // summary: + // called during the very first move notification; + // can be used to initialize coordinates, can be overwritten. + // default implementation does nothing + }, + onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop, /* Event */ e){ + // summary: + // called during every move notification; + // should actually move the node; can be overwritten. + this.onMoving(mover, leftTop); + var s = mover.node.style; + s.left = leftTop.l + "px"; + s.top = leftTop.t + "px"; + this.onMoved(mover, leftTop); + }, + onMoving: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){ + // summary: + // called before every incremental move; can be overwritten. -dojo.declare( - "dijit._MasterTooltip", - [dijit._Widget, dijit._Templated], - { + // default implementation does nothing + }, + onMoved: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){ // 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 + // called after every incremental move; can be overwritten. - // duration: Integer - // Milliseconds to fade in/fade out - duration: dijit.defaultDuration, + // default implementation does nothing + } +}); - templateString: dojo.cache("dijit", "templates/Tooltip.html", "<div class=\"dijitTooltip dijitTooltipLeft\" id=\"dojoTooltip\"\n\t><div class=\"dijitTooltipContainer dijitTooltipContents\" dojoAttachPoint=\"containerNode\" role='alert'></div\n\t><div class=\"dijitTooltipConnector\" dojoAttachPoint=\"connectorNode\"></div\n></div>\n"), +return dojo.dnd.Moveable; +}); - postCreate: function(){ - dojo.body().appendChild(this.domNode); +}, +'dojo/store/util/SimpleQueryEngine':function(){ +define("dojo/store/util/SimpleQueryEngine", ["../../_base/array"], function(arrayUtil) { + // module: + // dojo/store/util/SimpleQueryEngine + // summary: + // The module defines a simple filtering query engine for object stores. + +return function(query, options){ + // summary: + // Simple query engine that matches using filter functions, named filter + // functions or objects by name-value on a query object hash + // + // description: + // The SimpleQueryEngine provides a way of getting a QueryResults through + // the use of a simple object hash as a filter. The hash will be used to + // match properties on data objects with the corresponding value given. In + // other words, only exact matches will be returned. + // + // This function can be used as a template for more complex query engines; + // for example, an engine can be created that accepts an object hash that + // contains filtering functions, or a string that gets evaluated, etc. + // + // When creating a new dojo.store, simply set the store's queryEngine + // field as a reference to this function. + // + // query: Object + // An object hash with fields that may match fields of items in the store. + // Values in the hash will be compared by normal == operator, but regular expressions + // or any object that provides a test() method are also supported and can be + // used to match strings by more complex expressions + // (and then the regex's or object's test() method will be used to match values). + // + // options: dojo.store.util.SimpleQueryEngine.__queryOptions? + // An object that contains optional information such as sort, start, and count. + // + // returns: Function + // A function that caches the passed query under the field "matches". See any + // of the "query" methods on dojo.stores. + // + // example: + // Define a store with a reference to this engine, and set up a query method. + // + // | var myStore = function(options){ + // | // ...more properties here + // | this.queryEngine = dojo.store.util.SimpleQueryEngine; + // | // define our query method + // | this.query = function(query, options){ + // | return dojo.store.util.QueryResults(this.queryEngine(query, options)(this.data)); + // | }; + // | }; + + // create our matching query function + switch(typeof query){ + default: + throw new Error("Can not query with a " + typeof query); + case "object": case "undefined": + var queryObject = query; + query = function(object){ + for(var key in queryObject){ + var required = queryObject[key]; + if(required && required.test){ + if(!required.test(object[key])){ + return false; + } + }else if(required != object[key]){ + return false; + } + } + return true; + }; + break; + case "string": + // named query + if(!this[query]){ + throw new Error("No filter function " + query + " was found in store"); + } + query = this[query]; + // fall through + case "function": + // fall through + } + function execute(array){ + // execute the whole query, first we filter + var results = arrayUtil.filter(array, query); + // next we sort + if(options && options.sort){ + results.sort(function(a, b){ + for(var sort, i=0; sort = options.sort[i]; i++){ + var aValue = a[sort.attribute]; + var bValue = b[sort.attribute]; + if (aValue != bValue) { + return !!sort.descending == aValue > bValue ? -1 : 1; + } + } + return 0; + }); + } + // now we paginate + if(options && (options.start || options.count)){ + var total = results.length; + results = results.slice(options.start || 0, (options.start || 0) + (options.count || Infinity)); + results.total = total; + } + return results; + } + execute.matches = query; + return execute; +}; +}); - this.bgIframe = new dijit.BackgroundIframe(this.domNode); +}, +'dijit/typematic':function(){ +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/_base/sniff", // has("ie") + "." // setting dijit.typematic global +], function(array, connect, event, kernel, lang, on, has, dijit){ + +// module: +// 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. - // Setup fade-in and fade-out functions. - this.fadeIn = dojo.fadeIn({ node: this.domNode, duration: this.duration, onEnd: dojo.hitch(this, "_onShow") }); - this.fadeOut = dojo.fadeOut({ node: this.domNode, duration: this.duration, onEnd: dojo.hitch(this, "_onHide") }); - }, +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. - show: function(/*String*/ innerHTML, /*DomNode*/ aroundNode, /*String[]?*/ position, /*Boolean*/ rtl){ - // 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) + _fireEventAndReload: function(){ + this._timer = null; + this._callback(++this._count, this._node, this._evt); - if(this.aroundNode && this.aroundNode === aroundNode){ - return; - } + // 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); + }, - // reset width; it may have been set by orient() on a previous tooltip show() - this.domNode.width = "auto"; - - 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; - - var pos = dijit.placeOnScreenAroundElement(this.domNode, aroundNode, dijit.getPopupAroundAlignment((position && position.length) ? position : dijit.Tooltip.defaultPosition, !rtl), dojo.hitch(this, "orient")); - - // show it - dojo.style(this.domNode, "opacity", 0); - this.fadeIn.play(); - this.isShowingNow = true; - this.aroundNode = aroundNode; - }, + 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 (optional): + // 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 (optional): + // the number of milliseconds until the 2nd event occurs, default=500ms + // minDelay (optional): + // 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._evt = evt; + this._node = node; + this._currentTimeout = -1; + this._count = -1; + this._callback = lang.hitch(_this, callback); + this._fireEventAndReload(); + this._evt = lang.mixin({faux: true}, evt); + } + }, - 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 - - //Adjust the spaceAvailable width, without changing the spaceAvailable object - var tooltipSpaceAvaliableWidth = spaceAvailable.w - this.connectorNode.offsetWidth; + 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; + } + }, - node.className = "dijitTooltip " + - { - "BL-TL": "dijitTooltipBelow dijitTooltipABLeft", - "TL-BL": "dijitTooltipAbove dijitTooltipABLeft", - "BR-TR": "dijitTooltipBelow dijitTooltipABRight", - "TR-BR": "dijitTooltipAbove dijitTooltipABRight", - "BR-BL": "dijitTooltipRight", - "BL-BR": "dijitTooltipLeft" - }[aroundCorner + "-" + tooltipCorner]; - - // reduce tooltip's width to the amount of width available, so that it doesn't overflow screen - this.domNode.style.width = "auto"; - var size = dojo.contentBox(this.domNode); - - var width = Math.min((Math.max(tooltipSpaceAvaliableWidth,1)), size.w); - var widthWasReduced = width < size.w; - - this.domNode.style.width = width+"px"; - - //Adjust width for tooltips that have a really long word or a nowrap setting - if(widthWasReduced){ - this.containerNode.style.overflow = "auto"; //temp change to overflow to detect if our tooltip needs to be wider to support the content - var scrollWidth = this.containerNode.scrollWidth; - this.containerNode.style.overflow = "visible"; //change it back - if(scrollWidth > width){ - scrollWidth = scrollWidth + dojo.style(this.domNode,"paddingLeft") + dojo.style(this.domNode,"paddingRight"); - this.domNode.style.width = scrollWidth + "px"; + 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(); } - } - - // Reposition the tooltip connector. - if(tooltipCorner.charAt(0) == 'B' && aroundCorner.charAt(0) == 'B'){ - var mb = dojo.marginBox(node); - var tooltipConnectorHeight = this.connectorNode.offsetHeight; - if(mb.h > spaceAvailable.h){ - // The tooltip starts at the top of the page and will extend past the aroundNode - var aroundNodePlacement = spaceAvailable.h - (aroundNodeCoords.h / 2) - (tooltipConnectorHeight / 2); - 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), - mb.h - tooltipConnectorHeight) + "px"; - this.connectorNode.style.top = ""; + })), + on(node, "keyup", lang.hitch(this, function(){ + if(typematic._obj == keyObject){ + typematic.stop(); } - }else{ - // reset the tooltip back to the defaults - this.connectorNode.style.top = ""; - this.connectorNode.style.bottom = ""; - } - - return Math.max(0, size.w - tooltipSpaceAvaliableWidth); - }, + })) + ]; + return { remove: function(){ array.forEach(handles, function(h){ h.remove(); }); } }; + }, - _onShow: function(){ - // summary: - // Called at end of fade-in operation - // tags: - // protected - if(dojo.isIE){ - // the arrow won't show up on a node w/an opacity filter - this.domNode.style.filter=""; - } - }, + 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){ + event.stop(evt); + typematic.trigger(evt, _this, node, callback, node, subsequentDelay, initialDelay, minDelay); + })), + on(node, "mouseup", lang.hitch(this, function(evt){ + if(this._obj){ + event.stop(evt); + } + typematic.stop(); + })), + on(node, "mouseout", lang.hitch(this, function(evt){ + event.stop(evt); + typematic.stop(); + })), + on(node, "mousemove", lang.hitch(this, function(evt){ + evt.preventDefault(); + })), + on(node, "dblclick", lang.hitch(this, function(evt){ + event.stop(evt); + if(has("ie")){ + 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(); }); } }; + }, - hide: function(aroundNode){ - // summary: - // Hide the tooltip + 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(); }); } }; + } +}); - 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 - } - }, +return typematic; - _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; - } - } +}, +'dijit/MenuItem':function(){ +require({cache:{ +'url:dijit/templates/MenuItem.html':"<tr class=\"dijitReset dijitMenuItem\" data-dojo-attach-point=\"focusNode\" role=\"menuitem\" tabIndex=\"-1\"\n\t\tdata-dojo-attach-event=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\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/event", // event.stop + "dojo/_base/kernel", // kernel.deprecated + "dojo/_base/sniff", // has("ie") + "./_Widget", + "./_TemplatedMixin", + "./_Contained", + "./_CssStateMixin", + "dojo/text!./templates/MenuItem.html" +], function(declare, dom, domAttr, domClass, event, kernel, has, + _Widget, _TemplatedMixin, _Contained, _CssStateMixin, template){ - } -); +/*===== + var _Widget = dijit._Widget; + var _TemplatedMixin = dijit._TemplatedMixin; + var _Contained = dijit._Contained; + var _CssStateMixin = dijit._CssStateMixin; +=====*/ -dijit.showTooltip = function(/*String*/ innerHTML, /*DomNode*/ aroundNode, /*String[]?*/ position, /*Boolean*/ rtl){ + // module: + // dijit/MenuItem // summary: - // 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. - if(!dijit._masterTT){ dijit._masterTT = new dijit._MasterTooltip(); } - return dijit._masterTT.show(innerHTML, aroundNode, position, rtl); -}; + // A line item in a Menu Widget -dijit.hideTooltip = function(aroundNode){ - // summary: - // Hide the tooltip - if(!dijit._masterTT){ dijit._masterTT = new dijit._MasterTooltip(); } - return dijit._masterTT.hide(aroundNode); -}; -dojo.declare( - "dijit.Tooltip", - dijit._Widget, - { + return declare("dijit.MenuItem", + [_Widget, _TemplatedMixin, _Contained, _CssStateMixin], + { // summary: - // Pops up a tooltip (a help message) when you hover over a node. + // A line item in a Menu Widget - // label: String - // Text to display in the tooltip. - // Specified as innerHTML when creating the widget from markup. - label: "", + // Make 3 columns + // icon, label, and expand arrow (BiDi-dependent) indicating sub-menu + templateString: template, - // showDelay: Integer - // Number of milliseconds to wait after hovering over/focusing on the object, before - // the tooltip is displayed. - showDelay: 400, + baseClass: "dijitMenuItem", - // connectId: String|String[] - // Id of domNode(s) to attach the tooltip to. - // When user hovers over specified dom node, the tooltip will appear. - connectId: [], + // label: String + // Menu text + label: '', + _setLabelAttr: { node: "containerNode", type: "innerHTML" }, - // position: String[] - // See description of `dijit.Tooltip.defaultPosition` for details on position parameter. - position: [], - - _setConnectIdAttr: function(/*String*/ newId){ - // summary: - // Connect to node(s) (specified by id) + // iconClass: String + // Class to apply to DOMNode to make it display an icon. + iconClass: "dijitNoIcon", + _setIconClassAttr: { node: "iconNode", type: "class" }, - // Remove connections to old nodes (if there are any) - dojo.forEach(this._connections || [], function(nested){ - dojo.forEach(nested, dojo.hitch(this, "disconnect")); - }, this); + // 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: "", - // Make connections to nodes in newIds. - var ary = dojo.isArrayLike(newId) ? newId : (newId ? [newId] : []); - this._connections = dojo.map(ary, function(id){ - var node = dojo.byId(id); - return node ? [ - this.connect(node, "onmouseenter", "_onTargetMouseEnter"), - this.connect(node, "onmouseleave", "_onTargetMouseLeave"), - this.connect(node, "onfocus", "_onTargetFocus"), - this.connect(node, "onblur", "_onTargetBlur") - ] : []; - }, this); - - this._set("connectId", newId); + // disabled: Boolean + // If true, the menu item is disabled. + // If false, the menu item is enabled. + disabled: false, - this._connectIds = ary; // save as array + _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); + } }, - addTarget: function(/*DOMNODE || 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(dojo.indexOf(this._connectIds, id) == -1){ - this.set("connectId", this._connectIds.concat(id)); + 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); }, - removeTarget: function(/*DOMNODE || String*/ node){ + _onHover: function(){ // 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 = dojo.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); - } + // Handler when mouse is moved onto menu item + // tags: + // protected + this.getParent().onItemHover(this); }, - buildRendering: function(){ - this.inherited(arguments); - dojo.addClass(this.domNode,"dijitTooltipData"); - }, + _onUnhover: function(){ + // summary: + // Handler when mouse is moved off of menu item, + // possibly to a child menu, or maybe to a sibling + // menuitem or somewhere else entirely. + // tags: + // protected - startup: function(){ - this.inherited(arguments); + // if we are unhovering the currently selected item + // then unselect it + this.getParent().onItemUnhover(this); - // 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; - dojo.forEach(dojo.isArrayLike(ids) ? ids : [ids], this.addTarget, this); + // When menu is hidden (collapsed) due to clicking a MenuItem and having it execute, + // FF and IE don't generate an onmouseout event for the MenuItem. + // So, help out _CssStateMixin in this case. + this._set("hovering", false); }, - _onTargetMouseEnter: function(/*Event*/ e){ + _onClick: function(evt){ // summary: - // Handler for mouseenter event on the target node + // Internal handler for click events on MenuItem. // tags: // private - this._onHover(e); + this.getParent().onItemClick(this, evt); + event.stop(evt); }, - _onTargetMouseLeave: function(/*Event*/ e){ + onClick: function(/*Event*/){ // summary: - // Handler for mouseleave event on the target node + // User defined function to handle clicks // tags: - // private - this._onUnHover(e); + // 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 + } }, - _onTargetFocus: function(/*Event*/ e){ + _onFocus: function(){ // summary: - // Handler for focus event on the target node + // This is called by the focus manager when focus + // goes to this MenuItem or a child menu. // tags: - // private + // protected + this._setSelected(true); + this.getParent()._onItemFocus(this); - this._focus = true; - this._onHover(e); + this.inherited(arguments); }, - _onTargetBlur: function(/*Event*/ e){ + _setSelected: function(selected){ // summary: - // Handler for blur event on the target node + // Indicate that this node is the currently selected one // tags: // private - this._focus = false; - this._onUnHover(e); + /*** + * 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); }, - _onHover: function(/*Event*/ e){ + setLabel: function(/*String*/ content){ // 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. + // Deprecated. Use set('label', ...) instead. // tags: - // private - if(!this._showTimer){ - var target = e.target; - this._showTimer = setTimeout(dojo.hitch(this, function(){this.open(target)}), this.showDelay); - } + // deprecated + kernel.deprecated("dijit.MenuItem.setLabel() is deprecated. Use set('label', ...) instead.", "", "2.0"); + this.set("label", content); }, - _onUnHover: function(/*Event*/ e){ + setDisabled: function(/*Boolean*/ disabled){ // summary: - // Despite the name of this method, it actually handles both mouseleave and blur - // events on the target node, hiding the tooltip. + // Deprecated. Use set('disabled', bool) instead. // tags: - // private + // 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. - // keep a tooltip open if the associated element still has focus (even though the - // mouse moved away) - if(this._focus){ return; } + 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. - if(this._showTimer){ - clearTimeout(this._showTimer); - delete this._showTimer; - } - this.close(); + 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); + } + }); +}); + +}, +'dijit/layout/TabController':function(){ +require({cache:{ +'url:dijit/layout/templates/_TabButton.html':"<div role=\"presentation\" data-dojo-attach-point=\"titleNode\" data-dojo-attach-event='onclick:onClick'>\n <div role=\"presentation\" class='dijitTabInnerDiv' data-dojo-attach-point='innerDiv'>\n <div role=\"presentation\" class='dijitTabContent' data-dojo-attach-point='tabContent'>\n \t<div role=\"presentation\" data-dojo-attach-point='focusNode'>\n\t\t <img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitTabButtonIcon\" data-dojo-attach-point='iconNode' />\n\t\t <span data-dojo-attach-point='containerNode' class='tabLabel'></span>\n\t\t <span class=\"dijitInline dijitTabCloseButton dijitTabCloseIcon\" data-dojo-attach-point='closeNode'\n\t\t \t\tdata-dojo-attach-event='onclick: onClickCloseButton' role=\"presentation\">\n\t\t <span data-dojo-attach-point='closeText' class='dijitTabCloseText'>[x]</span\n\t\t ></span>\n\t\t\t</div>\n </div>\n </div>\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", + "../Menu", + "../MenuItem", + "dojo/text!./templates/_TabButton.html", + "dojo/i18n!../nls/common" +], function(declare, dom, domAttr, domClass, i18n, lang, StackController, Menu, MenuItem, template){ + +/*===== + var StackController = dijit.layout.StackController; + var Menu = dijit.Menu; + var MenuItem = dijit.MenuItem; +=====*/ + + // module: + // dijit/layout/TabController + // 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`. + + 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" }, - open: function(/*DomNode*/ target){ - // summary: - // Display the tooltip; usually not called directly. - // tags: - // private + templateString: template, - if(this._showTimer){ - clearTimeout(this._showTimer); - delete this._showTimer; - } - dijit.showTooltip(this.label || this.domNode.innerHTML, target, this.position, !this.isLeftToRight()); + // Override _FormWidget.scrollOnFocus. + // Don't scroll the whole tab container into view when the button is focused. + scrollOnFocus: false, - this._connectNode = target; - this.onShow(target, this.position); + buildRendering: function(){ + this.inherited(arguments); + + dom.setSelectable(this.containerNode, false); }, - close: function(){ - // summary: - // Hide the tooltip or cancel timer for show of tooltip - // tags: - // private + startup: function(){ + this.inherited(arguments); + var n = this.domNode; - if(this._connectNode){ - // if tooltip is currently shown - dijit.hideTooltip(this._connectNode); - delete this._connectNode; - this.onHide(); - } - if(this._showTimer){ - // if tooltip is scheduled to be shown (after a brief delay) - clearTimeout(this._showTimer); - delete this._showTimer; - } + // Required to give IE6 a kick, as it initially hides the + // tabs until they are focused on. + setTimeout(function(){ + n.className = n.className; + }, 1); }, - onShow: function(target, position){ + _setCloseButtonAttr: function(/*Boolean*/ disp){ // summary: - // Called when the tooltip is shown - // tags: - // callback - }, + // Hide/show close button + this._set("closeButton", disp); + domClass.toggle(this.innerDiv, "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); + } + // add context menu onto title button + this._closeMenu = new Menu({ + id: this.id+"_Menu", + dir: this.dir, + lang: this.lang, + textDir: this.textDir, + targetNodeIds: [this.domNode] + }); - onHide: function(){ + this._closeMenu.addChild(new MenuItem({ + label: _nlsResources.itemClose, + dir: this.dir, + lang: this.lang, + textDir: this.textDir, + onClick: lang.hitch(this, "onClickCloseButton") + })); + }else{ + if(this._closeMenu){ + this._closeMenu.destroyRecursive(); + delete this._closeMenu; + } + } + }, + _setLabelAttr: function(/*String*/ content){ // summary: - // Called when the tooltip is hidden - // tags: - // callback + // 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 || ''); + } }, - uninitialize: function(){ - this.close(); + destroy: function(){ + if(this._closeMenu){ + this._closeMenu.destroyRecursive(); + delete this._closeMenu; + } this.inherited(arguments); } - } -); + }); -// dijit.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 following values: -// -// * before: places tooltip to the left of the target node/widget, or to the right in -// the case of RTL scripts like Hebrew and Arabic -// * after: places tooltip to the right of the target node/widget, or to the left in -// the case of RTL scripts like Hebrew and Arabic -// * above: tooltip goes above target node -// * below: tooltip goes below target 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" 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. -dijit.Tooltip.defaultPosition = ["after", "before"]; + 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", -if(!dojo._hasResource["dijit.form.ValidationTextBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.ValidationTextBox"] = true; -dojo.provide("dijit.form.ValidationTextBox"); + 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, + _rectifyRtlTabList: function(){ + // summary: + // For left/right TabContainer when page is RTL mode, rectify the width of all tabs to be equal, otherwise the tab widths are different in IE + + if(0 >= this.tabPosition.indexOf('-h')){ return; } + if(!this.pane2button){ return; } + + var maxWidth = 0; + for(var pane in this.pane2button){ + var ow = this.pane2button[pane].innerDiv.scrollWidth; + maxWidth = Math.max(maxWidth, ow); + } + //unify the length of all the tabs + for(pane in this.pane2button){ + this.pane2button[pane].innerDiv.style.width = maxWidth + 'px'; + } + } + }); + + TabController.TabButton = TabButton; // for monkey patching + return TabController; +}); +}, +'dijit/layout/_LayoutWidget':function(){ +define("dijit/layout/_LayoutWidget", [ + "dojo/_base/lang", // lang.mixin + "../_Widget", + "../_Container", + "../_Contained", + "dojo/_base/declare", // declare + "dojo/dom-class", // domClass.add domClass.remove + "dojo/dom-geometry", // domGeometry.marginBox + "dojo/dom-style", // domStyle.getComputedStyle + "dojo/_base/sniff", // has("ie") + "dojo/_base/window" // win.global +], function(lang, _Widget, _Container, _Contained, + declare, domClass, domGeometry, domStyle, has, win){ /*===== - dijit.form.ValidationTextBox.__Constraints = function(){ - // locale: String - // locale used for validation, picks up value from this widget's lang attribute - // _flags_: anything - // various flags passed to regExpGen function - this.locale = ""; - this._flags_ = ""; - } + var _Widget = dijit._Widget; + var _Container = dijit._Container; + var _Contained = dijit._Contained; =====*/ -dojo.declare( - "dijit.form.ValidationTextBox", - dijit.form.TextBox, - { + // module: + // dijit/layout/_LayoutWidget + // summary: + // _LayoutWidget 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. + + + return declare("dijit.layout._LayoutWidget", [_Widget, _Container, _Contained], { // summary: - // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. - // tags: - // protected + // 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. - templateString: dojo.cache("dijit.form", "templates/ValidationTextBox.html", "<div class=\"dijit dijitReset dijitInlineTable 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\" dojoAttachPoint='textbox,focusNode' autocomplete=\"off\"\n\t\t\t${!nameAttrSetting} type='${type}'\n\t/></div\n></div>\n"), - baseClass: "dijitTextBox dijitValidationTextBox", + // 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", - // required: Boolean - // User is required to enter data into this field. - required: false, + // 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, - // 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: "", + buildRendering: function(){ + this.inherited(arguments); + domClass.add(this.domNode, "dijitContainer"); + }, - // 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_$", + 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. - // 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_$", + if(this._started){ return; } - // message: String - // Currently error/prompt message. - // When using the default tooltip implementation, this will only be - // displayed when the field is focused. - message: "", + // Need to call inherited first - so that child widgets get started + // up correctly + this.inherited(arguments); - // constraints: dijit.form.ValidationTextBox.__Constraints - // user-defined object needed to pass parameters to the validator functions - constraints: {}, + // 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(); - // regExp: [extension protected] String - // regular expression string used to validate the input - // Do not specify both regExp and regExpGen - regExp: ".*", + // 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.connect(win.global, 'onresize', function(){ + // Using function(){} closure to ensure no arguments passed to resize(). + this.resize(); + }); + } + }, - regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ constraints){ + resize: function(changeSize, resultSize){ // summary: - // Overridable function used to generate regExp when dependent on constraints. - // Do not specify both regExp and regExpGen. - // tags: - // extension protected - return this.regExp; // String - }, + // 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 relayout 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 relayout 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} - // state: [readonly] String - // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error) - state: "", + var node = this.domNode; - // tooltipPosition: String[] - // See description of `dijit.Tooltip.defaultPosition` for details on this parameter. - tooltipPosition: [], + // set margin box size, unless it wasn't specified, in which case use current size + if(changeSize){ + domGeometry.setMarginBox(node, changeSize); + } - _setValueAttr: function(){ - // summary: - // Hook so set('value', ...) works. - this.inherited(arguments); - this.validate(this._focused); + // 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(); }, - validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){ + layout: function(){ // summary: - // Overridable function used to validate the text input against the regular expression. + // 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 - return (new RegExp("^(?:" + this.regExpGen(constraints) + ")"+(this.required?"":"?")+"$")).test(value) && - (!this.required || !this._isEmpty(value)) && - (this._isEmpty(value) || this.parse(value, constraints) !== undefined); // Boolean + // protected extension }, - _isValidSubset: function(){ + _setupChild: function(/*dijit._Widget*/child){ // 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; + // 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); }, - 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); + addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){ + // Overrides _Container.addChild() to call _setupChild() + this.inherited(arguments); + if(this._started){ + this._setupChild(child); + } }, - _isEmpty: function(value){ + removeChild: function(/*dijit._Widget*/ 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); + } + }); +}); + +}, +'dijit/popup':function(){ +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/_base/sniff", // has("ie") has("mozilla") + "dojo/_base/window", // win.body + "./place", + "./BackgroundIframe", + "." // dijit (defining dijit.popup to match API doc) +], function(array, aspect, connect, declare, dom, domAttr, domConstruct, domGeometry, domStyle, event, keys, lang, on, has, win, + place, BackgroundIframe, dijit){ + + // module: + // dijit/popup + // summary: + // Used to show drop downs (ex: the select list of a ComboBox) + // or popups (ex: right-click context menus) + + + /*===== + dijit.popup.__OpenArgs = function(){ + // 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: dijit.__Position + // adding a buffer around the opening position. This is only useful when around is not set. + this.popup = popup; + this.parent = parent; + this.around = around; + this.x = x; + this.y = y; + this.orient = orient; + this.onCancel = onCancel; + this.onClose = onClose; + this.onExecute = onExecute; + this.padding = padding; + } + =====*/ + + /*===== + dijit.popup = { + // summary: + // Used to show drop downs (ex: the select list of a ComboBox) + // or popups (ex: right-click context menus). + // + // Access via require(["dijit/popup"], function(popup){ ... }). + + moveOffScreen: function(widget){ // summary: - // Checks for whitespace - return (this.trim ? /^\s*$/ : /^$/).test(value); // Boolean + // 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. + // widget: dijit._WidgetBase + // The widget }, - getErrorMessage: function(/*Boolean*/ isFocused){ + hide: function(widget){ // summary: - // Return an error message to show if appropriate - // tags: - // protected - return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // String + // 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. + // widget: dijit._WidgetBase + // The widget }, - getPromptMessage: function(/*Boolean*/ isFocused){ + open: function(args){ // summary: - // Return a hint message to show when widget is first focused - // tags: - // protected - return this.promptMessage; // String + // 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. + // args: dijit.popup.__OpenArgs + // Parameters + return {}; // Object specifying which position was chosen }, - _maskValidSubsetError: true, - validate: function(/*Boolean*/ isFocused){ + close: function(popup){ // 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) ? "Incomplete" : "Error")); - dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true"); + // Close specified popup and any popups that it parented. + // If no popup is specified, closes all popups. + // widget: dijit._WidgetBase? + // The widget, optional + } + }; + =====*/ - 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); + var PopupManager = declare(null, { + // _stack: dijit._Widget[] + // Stack of currently popped up widgets. + // (someone opened _stack[0], and then it opened _stack[1], etc.) + _stack: [], - return isValid; - }, + // _beginZIndex: Number + // Z-index of the first popup. (If first popup opens other + // popups they get a higher z-index.) + _beginZIndex: 1000, - displayMessage: function(/*String*/ message){ + _idGen: 1, + + _createWrapper: function(/*Widget*/ widget){ // summary: - // Overridable method to display validation errors/hints. - // By default uses a tooltip. - // tags: - // extension - dijit.hideTooltip(this.domNode); - if(message && this._focused){ - dijit.showTooltip(message, this.domNode, this.tooltipPosition, !this.isLeftToRight()); + // 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" + }, win.body()); + wrapper.appendChild(node); + + var s = node.style; + s.display = ""; + s.visibility = ""; + s.position = ""; + s.top = "0px"; + + widget._popupWrapper = wrapper; + aspect.after(widget, "destroy", function(){ + domConstruct.destroy(wrapper); + delete widget._popupWrapper; + }); } + + return wrapper; }, - _refreshState: function(){ - // Overrides TextBox._refreshState() - this.validate(this._focused); - this.inherited(arguments); + 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: "" + }); }, - //////////// INITIALIZATION METHODS /////////////////////////////////////// + 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. - constructor: function(){ - this.constraints = {}; + // Create wrapper if not already there + var wrapper = this._createWrapper(widget); + + domStyle.set(wrapper, "display", "none"); }, - _setConstraintsAttr: function(/*Object*/ constraints){ - if(!constraints.locale && this.lang){ - constraints.locale = this.lang; + 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 */ } - this._set("constraints", constraints); - this._computePartialRE(); + return stack[pi]; }, - _computePartialRE: function(){ - var p = this.regExpGen(this.constraints); - this.regExp = p; - var partialre = ""; - // 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 != ".*"){ this.regExp.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; + open: function(/*dijit.popup.__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(), + 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(); } } - );} - 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.regExp; - console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp); - } // should never be here unless the original RE is bad or the parsing is bad - this._partialre = "^(?:" + partialre + ")$"; - }, + }))); - postMixInProperties: function(){ - this.inherited(arguments); - this.messages = dojo.i18n.getLocalization("dijit.form", "validate", this.lang); - if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; } - if(!this.invalidMessage){ this.invalidMessage = this.promptMessage; } - if(this.missingMessage == "$_unset_$"){ this.missingMessage = this.messages.missingMessage; } - if(!this.missingMessage){ this.missingMessage = this.invalidMessage; } - this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints - }, + // 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)); + } - _setDisabledAttr: function(/*Boolean*/ value){ - this.inherited(arguments); // call FormValueWidget._setDisabledAttr() - this._refreshState(); - }, + 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 + }); - _setRequiredAttr: function(/*Boolean*/ value){ - this._set("required", value); - dijit.setWaiState(this.focusNode, "required", value); - this._refreshState(); - }, + if(widget.onOpen){ + // TODO: in 2.0 standardize onShow() (used by StackContainer) and onOpen() (used here) + widget.onOpen(best); + } - _setMessageAttr: function(/*String*/ message){ - this._set("message", message); - this.displayMessage(message); + return best; }, - reset:function(){ - // Overrides dijit.form.TextBox.reset() by also - // hiding errors about partial matches - this._maskValidSubsetError = true; - this.inherited(arguments); - }, + 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(); + } - _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(''); + var h; + while(h = top.handlers.pop()){ h.remove(); } - this.inherited(arguments); + // 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(); + } + } } - } -); + }); -dojo.declare( - "dijit.form.MappedTextBox", - dijit.form.ValidationTextBox, - { + return (dijit.popup = new PopupManager()); +}); + +}, +'dijit/_base/manager':function(){ +define("dijit/_base/manager", [ + "dojo/_base/array", + "dojo/_base/config", // defaultDuration + "../registry", + ".." // for setting exports to dijit namespace +], function(array, config, registry, dijit){ + + // module: + // dijit/_base/manager + // summary: + // Shim to methods on registry, plus a few other declarations. + // New code should access dijit/registry directly when possible. + + /*===== + dijit.byId = function(id){ // 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 + // Returns a widget by it's id, or if passed a widget, no-op (like dom.byId()) + // id: String|dijit._Widget + return registry.byId(id); // dijit._Widget + }; - postMixInProperties: function(){ - this.inherited(arguments); + dijit.getUniqueId = function(widgetType){ + // summary: + // Generates a unique id for a given widgetType + // widgetType: String + return registry.getUniqueId(widgetType); // String + }; - // we want the name attribute to go to the hidden <input>, not the displayed <input>, - // so override _FormWidget.postMixInProperties() setting of nameAttrSetting - this.nameAttrSetting = ""; - }, + dijit.findWidgets = function(root){ + // summary: + // Search subtree under root returning widgets found. + // Doesn't search for nested widgets (ie, widgets inside other widgets). + // root: DOMNode + return registry.findWidgets(root); + }; - serialize: function(/*anything*/ val, /*Object?*/ 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. - // tags: - // protected extension - return val.toString ? val.toString() : ""; // String - }, + dijit._destroyAll = function(){ + // summary: + // Code to destroy all widgets and do other cleanup on page unload - 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 - }, + return registry._destroyAll(); + }; - validate: function(){ - // Overrides `dijit.form.TextBox.validate` - this.valueNode.value = this.toString(); - return this.inherited(arguments); - }, + dijit.byNode = function(node){ + // summary: + // Returns the widget corresponding to the given DOMNode + // node: DOMNode + return registry.byNode(node); // dijit._Widget + }; - buildRendering: function(){ - // Overrides `dijit._Templated.buildRendering` + dijit.getEnclosingWidget = function(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 + // node: DOMNode + return registry.getEnclosingWidget(node); + }; + =====*/ + array.forEach(["byId", "getUniqueId", "findWidgets", "_destroyAll", "byNode", "getEnclosingWidget"], function(name){ + dijit[name] = registry[name]; + }); - this.inherited(arguments); + /*===== + dojo.mixin(dijit, { + // 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: 200 + }); + =====*/ + dijit.defaultDuration = config["defaultDuration"] || 200; - // 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 dojo.create() with an attrs argument - // to make dojo.query(input[name=...]) work on IE. (see #8660) - this.valueNode = dojo.place("<input type='hidden'" + (this.name ? " name='" + this.name.replace(/'/g, """) + "'" : "") + "/>", this.textbox, "after"); - }, + return dijit; +}); - reset: function(){ - // Overrides `dijit.form.ValidationTextBox.reset` to - // reset the hidden textbox value to '' - this.valueNode.value = ''; - this.inherited(arguments); - } - } -); +}, +'dijit/layout/StackController':function(){ +define("dijit/layout/StackController", [ + "dojo/_base/array", // array.forEach array.indexOf array.map + "dojo/_base/declare", // declare + "dojo/_base/event", // event.stop + "dojo/keys", // keys + "dojo/_base/lang", // lang.getObject + "dojo/_base/sniff", // has("ie") + "../focus", // focus.focus() + "../registry", // registry.byId + "../_Widget", + "../_TemplatedMixin", + "../_Container", + "../form/ToggleButton", + "dojo/i18n!../nls/common" +], function(array, declare, event, keys, lang, has, + focus, registry, _Widget, _TemplatedMixin, _Container, ToggleButton){ /*===== - dijit.form.RangeBoundTextBox.__Constraints = function(){ - // min: Number - // Minimum signed value. Default is -Infinity - // max: Number - // Maximum signed value. Default is +Infinity - this.min = min; - this.max = max; - } + var _Widget = dijit._Widget; + var _TemplatedMixin = dijit._TemplatedMixin; + var _Container = dijit._Container; + var ToggleButton = dijit.form.ToggleButton; =====*/ -dojo.declare( - "dijit.form.RangeBoundTextBox", - dijit.form.MappedTextBox, - { - // summary: - // Base class for textbox form widgets which defines a range of valid values. + // module: + // dijit/layout/StackController + // summary: + // Set of buttons to select a page in a `dijit.layout.StackContainer` - // rangeMessage: String - // The message to display if value is out-of-range - rangeMessage: "", + 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 - /*===== - // constraints: dijit.form.RangeBoundTextBox.__Constraints - constraints: {}, - ======*/ + // Override _FormWidget.tabIndex. + // StackContainer buttons are not in the tab order by default. + // Probably we should be calling this.startupKeyNavChildren() instead. + tabIndex: "-1", - 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 + // closeButton: Boolean + // When true, display close button for this tab + closeButton: false, + + _setCheckedAttr: function(/*Boolean*/ value, /*Boolean?*/ priorityChange){ + this.inherited(arguments); + this.focusNode.removeAttribute("aria-pressed"); }, - 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); + buildRendering: function(/*Event*/ evt){ + this.inherited(arguments); + (this.focusNode || this.domNode).setAttribute("role", "tab"); }, - _isDefinitelyOutOfRange: function(){ + onClick: function(/*Event*/ /*===== evt =====*/){ // 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'); - var isTooLittle = false; - var isTooMuch = false; - if("min" in this.constraints){ - var min = this.constraints.min; - min = this.compare(val, ((typeof min == "number") && min >= 0 && val !=0) ? 0 : min); - isTooLittle = (typeof min == "number") && min < 0; - } - if("max" in this.constraints){ - var max = this.constraints.max; - max = this.compare(val, ((typeof max != "number") || max > 0) ? max : 0); - isTooMuch = (typeof max == "number") && max > 0; - } - return isTooLittle || isTooMuch; + // This is for TabContainer where the tabs are <span> rather than button, + // so need to set focus explicitly (on some browsers) + // Note that you shouldn't override this method, but you can connect to it. + focus.focus(this.focusNode); + + // ... now let StackController catch the event and tell me what to do }, - _isValidSubset: function(){ + onClickCloseButton: function(/*Event*/ evt){ // 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 && v !== '' && v !== undefined && (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 = dojo.i18n.getLocalization("dijit.form", "validate", this.lang); - this.rangeMessage = this.messages.rangeMessage; - } - }, - - _setConstraintsAttr: function(/*Object*/ constraints){ - this.inherited(arguments); - if(this.focusNode){ // not set when called from postMixInProperties - if(this.constraints.min !== undefined){ - dijit.setWaiState(this.focusNode, "valuemin", this.constraints.min); - }else{ - dijit.removeWaiState(this.focusNode, "valuemin"); - } - if(this.constraints.max !== undefined){ - dijit.setWaiState(this.focusNode, "valuemax", this.constraints.max); - }else{ - dijit.removeWaiState(this.focusNode, "valuemax"); - } - } - }, - - _setValueAttr: function(/*Number*/ value, /*Boolean?*/ priorityChange){ - // summary: - // Hook so set('value', ...) works. - - dijit.setWaiState(this.focusNode, "valuenow", value); - this.inherited(arguments); - } - } -); - -} - -if(!dojo._hasResource["dijit.form.ComboBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.ComboBox"] = true; -dojo.provide("dijit.form.ComboBox"); - + // StackContainer connects to this function; if your widget contains a close button + // then clicking it should call this function. + // Note that you shouldn't override this method, but you can connect to it. + evt.stopPropagation(); + } + }); + 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, + constructor: function(){ + this.pane2button = {}; // mapping from pane id to buttons + this.pane2connects = {}; // mapping from pane id to this.connect() handles + this.pane2watches = {}; // mapping from pane id to watch() handles + }, + postCreate: function(){ + this.inherited(arguments); + // Listen to notifications from StackContainer + 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"); + }, -dojo.declare( - "dijit.form.ComboBoxMixin", - dijit._HasDropDown, - { - // summary: - // Implements the base functionality for `dijit.form.ComboBox`/`dijit.form.FilteringSelect` - // description: - // All widgets that mix in dijit.form.ComboBoxMixin must extend `dijit.form._FormValueWidget`. - // tags: - // protected + 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); + } + }, - // item: Object - // This is the item returned by the dojo.data.store implementation that - // provides the data for this ComboBox, it's the currently selected item. - item: null, + destroy: function(){ + for(var pane in this.pane2button){ + this.onRemoveChild(registry.byId(pane)); + } + this.inherited(arguments); + }, - // pageSize: Integer - // Argument to data provider. - // Specifies number of search results per page (before hitting "next" button) - pageSize: Infinity, + onAddChild: function(/*dijit._Widget*/ page, /*Integer?*/ insertIndex){ + // summary: + // Called whenever a page is added to the container. + // Create button corresponding to the page. + // tags: + // private - // store: [const] Object - // Reference to data provider object used by this ComboBox - store: null, + // 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, + label: page.title, + dir: page.dir, + lang: page.lang, + textDir: page.textDir, + showLabel: page.showTitle, + iconClass: page.iconClass, + closeButton: page.closable, + title: page.tooltip + }); + button.focusNode.setAttribute("aria-selected", "false"); - // fetchProperties: Object - // Mixin to the dojo.data 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, - // before doing further filtering based on `searchAttr` and the key. - // Any reference to the `searchAttr` is ignored. - query: {}, + // map from page attribute to corresponding tab button attribute + var pageAttrList = ["title", "showTitle", "iconClass", "closable", "tooltip"], + buttonAttrList = ["label", "showLabel", "iconClass", "closeButton", "title"]; - // 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, + // watch() so events like page title changes are reflected in tab button + this.pane2watches[page.id] = array.map(pageAttrList, function(pageAttr, idx){ + return page.watch(pageAttr, function(name, oldVal, newVal){ + button.set(buttonAttrList[idx], newVal); + }); + }); - // 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", + // connections so that clicking a tab button selects the corresponding page + this.pane2connects[page.id] = [ + this.connect(button, 'onClick', lang.hitch(this,"onButtonClick", page)), + this.connect(button, 'onClickCloseButton', lang.hitch(this,"onCloseButtonClick", page)) + ]; - // searchDelay: Integer - // Delay in milliseconds between when user types something and we start - // searching based on that value - searchDelay: 100, + 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){ // put the first child into the tab order + button.focusNode.setAttribute("tabIndex", "0"); + button.focusNode.setAttribute("aria-selected", "true"); + this._currentChild = page; + } + // make sure all tabs have the same length + if(!this.isLeftToRight() && has("ie") && this._rectifyRtlTabList){ + this._rectifyRtlTabList(); + } + }, - // searchAttr: String - // Search for items in the data store where this attribute (in the item) - // matches what the user typed - searchAttr: "name", + onRemoveChild: function(/*dijit._Widget*/ page){ + // summary: + // Called whenever a page is removed from the container. + // Remove the button corresponding to the page. + // tags: + // private - // 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: "", + if(this._currentChild === page){ this._currentChild = null; } - // labelType: String - // Specifies how to interpret the labelAttr in the data store items. - // Can be "html" or "text". - labelType: "text", + // disconnect/unwatch connections/watches related to page being removed + array.forEach(this.pane2connects[page.id], lang.hitch(this, "disconnect")); + delete this.pane2connects[page.id]; + array.forEach(this.pane2watches[page.id], function(w){ w.unwatch(); }); + delete this.pane2watches[page.id]; - // queryExpr: String - // This specifies what query ComboBox/FilteringSelect sends to the data store, - // based on what the user has typed. Changing this expression will modify - // whether the drop down shows only exact matches, a "starting with" match, - // etc. Use it in conjunction with highlightMatch. - // 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}*", + var button = this.pane2button[page.id]; + if(button){ + this.removeChild(button); + delete this.pane2button[page.id]; + button.destroy(); + } + delete page.controlButton; + }, - // ignoreCase: Boolean - // Set true if the ComboBox/FilteringSelect should ignore case when matching possible items - ignoreCase: true, + onSelectChild: function(/*dijit._Widget*/ page){ + // summary: + // Called when a page has been selected in the StackContainer, either by me or by another StackController + // tags: + // private - // hasDownArrow: Boolean - // Set this textbox to have a down arrow button, to display the drop down list. - // Defaults to true. - hasDownArrow: true, + if(!page){ return; } - templateString: dojo.cache("dijit.form", "templates/DropDownBox.html", "<div class=\"dijit dijitReset dijitInlineTable dijitLeft\"\n\tid=\"widget_${id}\"\n\trole=\"combobox\"\n\t><div class='dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton dijitArrowButtonContainer'\n\t\tdojoAttachPoint=\"_buttonNode, _popupStateNode\" role=\"presentation\"\n\t\t><input class=\"dijitReset dijitInputField dijitArrowButtonInner\" value=\"▼ \" type=\"text\" tabIndex=\"-1\" readonly=\"readonly\" role=\"presentation\"\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\tdojoAttachPoint=\"textbox,focusNode\" role=\"textbox\" aria-haspopup=\"true\"\n\t/></div\n></div>\n"), + if(this._currentChild){ + var oldButton=this.pane2button[this._currentChild.id]; + oldButton.set('checked', false); + oldButton.focusNode.setAttribute("aria-selected", "false"); + oldButton.focusNode.setAttribute("tabIndex", "-1"); + } - baseClass: "dijitTextBox dijitComboBox", + var newButton=this.pane2button[page.id]; + newButton.set('checked', true); + newButton.focusNode.setAttribute("aria-selected", "true"); + this._currentChild = page; + newButton.focusNode.setAttribute("tabIndex", "0"); + var container = registry.byId(this.containerId); + container.containerNode.setAttribute("aria-labelledby", newButton.id); + }, - // dropDownClass: [protected extension] String - // Name of the dropdown widget class used to select a date/time. - // Subclasses should specify this. - dropDownClass: "dijit.form._ComboBoxMenu", + onButtonClick: function(/*dijit._Widget*/ page){ + // summary: + // Called whenever one of my child buttons is pressed in an attempt to select a page + // tags: + // private - // Set classes like dijitDownArrowButtonHover depending on - // mouse action over button node - cssStateNodes: { - "_buttonNode": "dijitDownArrowButton" + if(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. + var button=this.pane2button[page.id]; + button.set('checked', true); + } + var container = registry.byId(this.containerId); + container.selectChild(page); }, - // 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, + onCloseButtonClick: function(/*dijit._Widget*/ page){ + // summary: + // Called whenever one of my child buttons [X] is pressed in an attempt to close a page + // tags: + // private - _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(dojo.isIE){ - // in the case of a mouse click in a popup being handled, - // then the dojo.doc.selection is not the textarea, but the popup - // var r = dojo.doc.selection.createRange(); - // hack to get IE 6 to play nice. What a POS browser. - var tr = dojo.doc.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. + 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); } } - return pos; }, - _setCaretPos: function(/*DomNode*/ element, /*Number*/ location){ - location = parseInt(location); - dijit.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); - dijit.setWaiState(this.domNode, "disabled", value); - }, + // 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 - _abortQuery: function(){ - // stop in-progress query - if(this.searchTimer){ - clearTimeout(this.searchTimer); - this.searchTimer = null; - } - if(this._fetchHandle){ - if(this._fetchHandle.abort){ this._fetchHandle.abort(); } - this._fetchHandle = null; - } + if(!this.isLeftToRight() && (!this.tabPosition || /top|bottom/.test(this.tabPosition))){ forward = !forward; } + // find currently focused button in children array + var children = this.getChildren(); + var current = array.indexOf(children, this.pane2button[this._currentChild.id]); + // pick next button to focus on + var offset = forward ? 1 : children.length - 1; + return children[ (current + offset) % children.length ]; // dijit._Widget }, - _onInput: function(/*Event*/ evt){ + onkeypress: function(/*Event*/ e){ // summary: - // Handles paste events - if(!this.searchTimer && (evt.type == 'paste'/*IE|WebKit*/ || evt.type == 'input'/*Firefox*/) && this._lastInput != this.textbox.value){ - this.searchTimer = setTimeout(dojo.hitch(this, function(){ - this._onKey({charOrCode: 229}); // fake IME key to cause a search - }), 100); // long delay that will probably be preempted by keyboard input + // 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: + case keys.END: + var children = this.getChildren(); + if(children && children.length){ + children[e.charOrCode == keys.HOME ? 0 : children.length-1].onClick(); + } + 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.adjacent(!e.shiftKey).onClick(); + 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.adjacent(forward).onClick(); + event.stop(e); + } } - this.inherited(arguments); }, - _onKey: function(/*Event*/ evt){ + onContainerKeyPress: function(/*Object*/ info){ // summary: - // Handles keyboard events + // Called when there was a keypress on the container + // tags: + // private + info.e._djpage = info.page; + this.onkeypress(info.e); + } + }); - var key = evt.charOrCode; + StackController.StackButton = StackButton; // for monkey patching - // except for cutting/pasting case - ctrl + x/v - if(evt.altKey || ((evt.ctrlKey || evt.metaKey) && (key != 'x' && key != 'v')) || key == dojo.keys.SHIFT){ - return; // throw out weird key combinations and spurious events - } - - var doSearch = false; - var pw = this.dropDown; - var dk = dojo.keys; - var highlighted = null; - this._prev_key_backspace = false; - this._abortQuery(); + return StackController; +}); - // _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); +}, +'dojo/dnd/Mover':function(){ +define("dojo/dnd/Mover", ["../main", "../Evented", "../touch", "./common", "./autoscroll"], function(dojo, Evented, touch) { + // module: + // dojo/dnd/Mover + // summary: + // TODOC - if(this._opened){ - highlighted = pw.getHighlightedOption(); - } - switch(key){ - case dk.PAGE_DOWN: - case dk.DOWN_ARROW: - case dk.PAGE_UP: - case dk.UP_ARROW: - // Keystroke caused ComboBox_menu to move to a different item. - // Copy new item to <input> box. - if(this._opened){ - this._announceOption(highlighted); - } - dojo.stopEvent(evt); - break; - case dk.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); - dojo.stopEvent(evt); - break; - }else if(highlighted == pw.previousButton){ - this._nextSearch(-1); - dojo.stopEvent(evt); - break; - } - }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 - } - // default case: - // if enter pressed while drop down is open, or for FilteringSelect, - // if we are in the middle of a query to convert a directly typed in value to an item, - // prevent submit, but allow event to bubble - if(this._opened || this._fetchHandle){ - evt.preventDefault(); - } - // fall through +dojo.declare("dojo.dnd.Mover", [Evented], { + constructor: function(node, e, host){ + // summary: + // an object which makes a node follow the mouse, or touch-drag on touch devices. + // Used as a default mover, and as a base class for custom movers. + // node: Node + // a node (or node's id) to be moved + // e: Event + // a mouse event, which started the move; + // only pageX and pageY properties are used + // host: Object? + // object which implements the functionality of the move, + // and defines proper events (onMoveStart and onMoveStop) + this.node = dojo.byId(node); + this.marginBox = {l: e.pageX, t: e.pageY}; + this.mouseButton = e.button; + var h = (this.host = host), d = node.ownerDocument; + this.events = [ + // At the start of a drag, onFirstMove is called, and then the following two + // connects are disconnected + dojo.connect(d, touch.move, this, "onFirstMove"), - case dk.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(); - } - if(this._opened){ - this._lastQuery = null; // in case results come back later - this.closeDropDown(); - } - break; + // These are called continually during the drag + dojo.connect(d, touch.move, this, "onMouseMove"), - case ' ': - if(highlighted){ - // user is effectively clicking a choice in the drop down menu - dojo.stopEvent(evt); - this._selectOption(); - this.closeDropDown(); - }else{ - // user typed a space into the input box, treat as normal character - doSearch = true; - } - break; + // And these are called at the end of the drag + dojo.connect(d, touch.release, this, "onMouseUp"), - case dk.DELETE: - case dk.BACKSPACE: - this._prev_key_backspace = true; - doSearch = true; - break; + // cancel text selection and text dragging + dojo.connect(d, "ondragstart", dojo.stopEvent), + dojo.connect(d.body, "onselectstart", dojo.stopEvent) + ]; + // notify that the move has started + if(h && h.onMoveStart){ + h.onMoveStart(this); + } + }, + // mouse event processors + onMouseMove: function(e){ + // summary: + // event processor for onmousemove/ontouchmove + // e: Event + // mouse/touch event + dojo.dnd.autoScroll(e); + var m = this.marginBox; + this.host.onMove(this, {l: m.l + e.pageX, t: m.t + e.pageY}, e); + dojo.stopEvent(e); + }, + onMouseUp: function(e){ + if(dojo.isWebKit && dojo.isMac && this.mouseButton == 2 ? + e.button == 0 : this.mouseButton == e.button){ // TODO Should condition be met for touch devices, too? + this.destroy(); + } + dojo.stopEvent(e); + }, + // utilities + onFirstMove: function(e){ + // summary: + // makes the node absolute; it is meant to be called only once. + // relative and absolutely positioned nodes are assumed to use pixel units + var s = this.node.style, l, t, h = this.host; + switch(s.position){ + case "relative": + case "absolute": + // assume that left and top values are in pixels already + l = Math.round(parseFloat(s.left)) || 0; + t = Math.round(parseFloat(s.top)) || 0; + break; + default: + s.position = "absolute"; // enforcing the absolute mode + var m = dojo.marginBox(this.node); + // event.pageX/pageY (which we used to generate the initial + // margin box) includes padding and margin set on the body. + // However, setting the node's position to absolute and then + // doing dojo.marginBox on it *doesn't* take that additional + // space into account - so we need to subtract the combined + // padding and margin. We use getComputedStyle and + // _getMarginBox/_getContentBox to avoid the extra lookup of + // the computed style. + var b = dojo.doc.body; + var bs = dojo.getComputedStyle(b); + var bm = dojo._getMarginBox(b, bs); + var bc = dojo._getContentBox(b, bs); + l = m.l - (bc.l - bm.l); + t = m.t - (bc.t - bm.t); + break; + } + this.marginBox.l = l - this.marginBox.l; + this.marginBox.t = t - this.marginBox.t; + if(h && h.onFirstMove){ + h.onFirstMove(this, e); + } - default: - // Non char keys (F1-F12 etc..) shouldn't open list. - // 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 - this.item = undefined; // undefined means item needs to be set - this.searchTimer = setTimeout(dojo.hitch(this, "_startSearchFromInput"),1); - } - }, + // Disconnect onmousemove and ontouchmove events that call this function + dojo.disconnect(this.events.shift()); + }, + destroy: function(){ + // summary: + // stops the move, deletes all references, so the object can be garbage-collected + dojo.forEach(this.events, dojo.disconnect); + // undo global settings + var h = this.host; + if(h && h.onMoveStop){ + h.onMoveStop(this); + } + // destroy objects + this.events = this.node = this.host = null; + } +}); - _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. +return dojo.dnd.Mover; +}); - var fn = this.focusNode; +}, +'dijit/layout/TabContainer':function(){ +define("dijit/layout/TabContainer", [ + "dojo/_base/lang", // lang.getObject + "dojo/_base/declare", // declare + "./_TabContainerBase", + "./TabController", + "./ScrollingTabController" +], function(lang, declare, _TabContainerBase, TabController, ScrollingTabController){ - // IE7: clear selection so next highlight works all the time - dijit.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._getCaretPos(fn); - // 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 - dijit.selectInputText(fn, cpos); - } - }else{ - // text does not autoComplete; replace the whole value and highlight - fn.value = text; - dijit.selectInputText(fn); - } - }, +/*===== + var _TabContainerBase = dijit.layout._TabContainerBase; + var TabController = dijit.layout.TabController; + var ScrollingTabController = dijit.layout.ScrollingTabController; +=====*/ - _openResultList: function(/*Object*/ results, /*Object*/ dataObject){ - // 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 - this._fetchHandle = null; - if( this.disabled || - this.readOnly || - (dataObject.query[this.searchAttr] != this._lastQuery) - ){ - return; - } - var wasSelected = this.dropDown._highlighted_option && dojo.hasClass(this.dropDown._highlighted_option, "dijitMenuItemSelected"); - this.dropDown.clearResultList(); - if(!results.length && !this._maxOptions){ // if no results and not just the previous choices button - this.closeDropDown(); - return; - } + // module: + // dijit/layout/TabContainer + // summary: + // A Container with tabs to select each child (only one of which is displayed at a time). - // 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. - dataObject._maxOptions = this._maxOptions; - var nodes = this.dropDown.createOptions( - results, - dataObject, - dojo.hitch(this, "_getMenuLabelFromItem") - ); + 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. - // show our list (only if we have content, else nothing) - this._showResultList(); + // 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, - // #4091: - // tell the screen reader that the paging callback finished by - // shouting the next choice - if(dataObject.direction){ - if(1 == dataObject.direction){ - this.dropDown.highlightFirstOption(); - }else if(-1 == dataObject.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(dataObject.query[this.searchAttr])){ - this._announceOption(nodes[1]); // 1st real item - } - }, + // 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, - _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); - - // hide the tooltip - this.displayMessage(""); - - this.openDropDown(); + // controllerWidget: String + // An optional parameter to override the widget used to display the tab labels + controllerWidget: "", - dijit.setWaiState(this.domNode, "expanded", "true"); - }, + _makeController: function(/*DomNode*/ srcNode){ + // summary: + // Instantiate tablist controller widget and return reference to it. + // Callback from _TabContainerBase.postCreate(). + // tags: + // protected extension - 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(); - }, + var cls = this.baseClass + "-tabs" + (this.doLayout ? "" : " dijitTabNoLayout"), + TabController = lang.getObject(this.controllerWidget); - isLoaded: function(){ - // signal to _HasDropDown that it needs to call loadDropDown() to load the - // drop down asynchronously before displaying it - return false; + return new TabController({ + id: this.id + "_tablist", + 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); }, - 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); - dijit.setWaiState(this.domNode, "expanded", "false"); - dijit.removeWaiState(this.focusNode,"activedescendant"); - } - }, + postMixInProperties: function(){ + this.inherited(arguments); - _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){ - dijit.form._FormValueWidget.prototype._setValueAttr.call(this, this.value, true); - } - this._refreshState(); + // Scrolling controller only works for horizontal non-nested tabs + if(!this.controllerWidget){ + this.controllerWidget = (this.tabPosition == "top" || this.tabPosition == "bottom") && !this.nested ? + "dijit.layout.ScrollingTabController" : "dijit.layout.TabController"; } - }, + } + }); +}); - _onBlur: function(){ - // summary: - // Called magically when focus has shifted away from this widget and it's drop down - this.closeDropDown(); - this.inherited(arguments); - }, +}, +'dijit/BackgroundIframe':function(){ +define("dijit/BackgroundIframe", [ + "require", // require.toUrl + ".", // 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/_base/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 + // summary: + // new dijit.BackgroundIframe(node) + // Makes a background iframe as a child of node, that fills + // area (and position) of node - _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 - if(!displayedValue){ - displayedValue = this.store.getValue(item, this.searchAttr); - } - var value = this._getValueField() != this.searchAttr? this.store.getIdentity(item) : displayedValue; - this._set("item", item); - dijit.form.ComboBox.superclass._setValueAttr.call(this, value, priorityChange, displayedValue); - }, + // 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 - _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. + var queue = []; - 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 = ''; + this.pop = function(){ + var iframe; + if(queue.length){ + iframe = queue.pop(); + iframe.style.display=""; }else{ - newValue = this.store.getValue(node.item, this.searchAttr).toString(); - this.set('item', node.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 - dijit.setWaiState(this.focusNode, "activedescendant", dojo.attr(node, "id")); - // autocomplete the rest of the option to announce change - this._autoCompleteText(newValue); - }, - - _selectOption: function(/*Event*/ evt){ - // summary: - // Menu callback function, called when an item in the menu is selected. - if(evt){ - this._announceOption(evt.target); + 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. } - this.closeDropDown(); - this._setCaretPos(this.focusNode, this.focusNode.value.length); - dijit.form._FormValueWidget.prototype._setValueAttr.call(this, this.value, true); // set this.value and fire onChange - }, - - _startSearchAll: function(){ - this._startSearch(''); - }, + return iframe; + }; - _startSearchFromInput: function(){ - this._startSearch(this.focusNode.value.replace(/([\\\*\?])/g, "\\$1")); - }, + this.push = function(iframe){ + iframe.style.display="none"; + queue.push(iframe); + } + }(); - _getQueryString: function(/*String*/ text){ - return dojo.string.substitute(this.queryExpr, [text]); - }, - _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 = dojo.getObject(this.dropDownClass, false); - this.dropDown = new dropDownConstructor({ - onChange: dojo.hitch(this, this._selectOption), - id: popupId, - dir: this.dir + 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%' }); - dijit.removeWaiState(this.focusNode,"activedescendant"); - dijit.setWaiState(this.textbox,"owns",popupId); // associate popup with textbox } - // create a new query to prevent accidentally querying for a hidden - // value from FilteringSelect's keyField - var query = dojo.clone(this.query); // #5970 - this._lastInput = key; // Store exactly what was entered by the user. - this._lastQuery = query[this.searchAttr] = this._getQueryString(key); - // #5970: 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.searchTimer=setTimeout(dojo.hitch(this, function(query, _this){ - this.searchTimer = null; - var fetch = { - queryOptions: { - ignoreCase: this.ignoreCase, - deep: true - }, - query: query, - onBegin: dojo.hitch(this, "_setMaxOptions"), - onComplete: dojo.hitch(this, "_openResultList"), - onError: function(errText){ - _this._fetchHandle = null; - console.error('dijit.form.ComboBox: ' + errText); - _this.closeDropDown(); - }, - start: 0, - count: this.pageSize - }; - dojo.mixin(fetch, _this.fetchProperties); - this._fetchHandle = _this.store.fetch(fetch); - - var nextSearch = function(dataObject, direction){ - dataObject.start += dataObject.count*direction; - // #4091: - // tell callback the direction of the paging so the screen - // reader knows which menu option to shout - dataObject.direction = direction; - this._fetchHandle = this.store.fetch(dataObject); - this.focus(); - }; - this._nextSearch = this.dropDown.onPage = dojo.hitch(this, nextSearch, this._fetchHandle); - }, query, this), this.searchDelay); - }, - - _setMaxOptions: function(size, request){ - this._maxOptions = size; - }, + } + }; - _getValueField: function(){ + lang.extend(dijit.BackgroundIframe, { + resize: function(node){ // 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 /////////////////////////////////////// - - constructor: function(){ - this.query={}; - this.fetchProperties={}; - }, - - postMixInProperties: function(){ - if(!this.store){ - var srcNodeRef = this.srcNodeRef; - - // if user didn't specify store, then assume there are option tags - this.store = new dijit.form._ComboBoxDataStore(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(); - this.value = this.store.getValue(item, valueField); - } - } + // 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' + }); } - - this.inherited(arguments); }, - - postCreate: function(){ + destroy: function(){ // summary: - // Subclasses must call this method from their postCreate() methods - // tags: - // protected + // destroy the iframe + if(this._conn){ + this._conn.remove(); + this._conn = null; + } + if(this.iframe){ + _frames.push(this.iframe); + delete this.iframe; + } + } + }); - // find any associated label element and add to ComboBox node. - var label=dojo.query('label[for="'+this.id+'"]'); - if(label.length){ - label[0].id = (this.id+"_label"); - dijit.setWaiState(this.domNode, "labelledby", label[0].id); + return dijit.BackgroundIframe; +}); - } - this.inherited(arguments); - }, +}, +'url:dijit/templates/Menu.html':"<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" role=\"menu\" tabIndex=\"${tabIndex}\" data-dojo-attach-event=\"onkeypress:_onKeyPress\" cellspacing=\"0\">\n\t<tbody class=\"dijitReset\" data-dojo-attach-point=\"containerNode\"></tbody>\n</table>\n", +'dojo/dnd/Avatar':function(){ +define("dojo/dnd/Avatar", ["../main", "./common"], function(dojo) { + // module: + // dojo/dnd/Avatar + // summary: + // TODOC - _setHasDownArrowAttr: function(val){ - this.hasDownArrow = val; - this._buttonNode.style.display = val ? "" : "none"; - }, - _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._escapeHtml(this._lastInput)); - labelType = "html"; - } - return {html: labelType == "html", label: label}; - }, +dojo.declare("dojo.dnd.Avatar", null, { + // summary: + // Object that represents transferred DnD items visually + // manager: Object + // a DnD manager object - 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 + constructor: function(manager){ + this.manager = manager; + this.construct(); + }, - 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 = dojo.regexp.escapeString(find); // escape regexp special chars - return this._escapeHtml(label).replace( - // prepend ^ when this.queryExpr == "${0}*" and append $ when this.queryExpr == "*${0}" - new RegExp((i == 0 ? "^" : "") + "("+ find +")" + (i == (this.queryExpr.length - 4) ? "$" : ""), modifiers), - '<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, """); - 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*/ item, /*dojo.data.store*/ store){ - // summary: - // Computes the label to display based on the dojo.data store item. - // 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) - return store.getValue(item, this.labelAttr || this.searchAttr).toString(); // String + // methods + construct: function(){ + // summary: + // constructor function; + // it is separate so it can be (dynamically) overwritten in case of need + this.isA11y = dojo.hasClass(dojo.body(),"dijit_a11y"); + var a = dojo.create("table", { + "class": "dojoDndAvatar", + style: { + position: "absolute", + zIndex: "1999", + margin: "0px" + } + }), + source = this.manager.source, node, + b = dojo.create("tbody", null, a), + tr = dojo.create("tr", null, b), + td = dojo.create("td", null, tr), + icon = this.isA11y ? dojo.create("span", { + id : "a11yIcon", + innerHTML : this.manager.copy ? '+' : "<" + }, td) : null, + span = dojo.create("span", { + innerHTML: source.generateText ? this._generateText() : "" + }, td), + k = Math.min(5, this.manager.nodes.length), i = 0; + // we have to set the opacity on IE only after the node is live + dojo.attr(tr, { + "class": "dojoDndAvatarHeader", + style: {opacity: 0.9} + }); + for(; i < k; ++i){ + if(source.creator){ + // create an avatar representation of the node + node = source._normalizedCreator(source.getItem(this.manager.nodes[i].id).data, "avatar").node; + }else{ + // or just clone the node and hope it works + node = this.manager.nodes[i].cloneNode(true); + if(node.tagName.toLowerCase() == "tr"){ + // insert extra table nodes + var table = dojo.create("table"), + tbody = dojo.create("tbody", null, table); + tbody.appendChild(node); + node = table; + } + } + node.id = ""; + tr = dojo.create("tr", null, b); + td = dojo.create("td", null, tr); + td.appendChild(node); + dojo.attr(tr, { + "class": "dojoDndAvatarItem", + style: {opacity: (9 - i) / 10} + }); } - } -); - -dojo.declare( - "dijit.form._ComboBoxMenu", - [dijit._Widget, dijit._Templated, dijit._CssStateMixin], - { + this.node = a; + }, + destroy: function(){ // summary: - // Focus-less menu for internal use in `dijit.form.ComboBox` - // tags: - // private + // destructor for the avatar; called to remove all references so it can be garbage-collected + dojo.destroy(this.node); + this.node = false; + }, + update: function(){ + // summary: + // updates the avatar to reflect the current DnD state + dojo[(this.manager.canDropFlag ? "add" : "remove") + "Class"](this.node, "dojoDndAvatarCanDrop"); + if (this.isA11y){ + var icon = dojo.byId("a11yIcon"); + var text = '+'; // assume canDrop && copy + if (this.manager.canDropFlag && !this.manager.copy) { + text = '< '; // canDrop && move + }else if (!this.manager.canDropFlag && !this.manager.copy) { + text = "o"; //!canDrop && move + }else if(!this.manager.canDropFlag){ + text = 'x'; // !canDrop && copy + } + icon.innerHTML=text; + } + // replace text + dojo.query(("tr.dojoDndAvatarHeader td span" +(this.isA11y ? " span" : "")), this.node).forEach( + function(node){ + node.innerHTML = this._generateText(); + }, this); + }, + _generateText: function(){ + // summary: generates a proper text to reflect copying or moving of items + return this.manager.nodes.length.toString(); + } +}); - templateString: "<ul class='dijitReset dijitMenu' dojoAttachEvent='onmousedown:_onMouseDown,onmouseup:_onMouseUp,onmouseover:_onMouseOver,onmouseout:_onMouseOut' style='overflow: \"auto\"; overflow-x: \"hidden\";'>" - +"<li class='dijitMenuItem dijitMenuPreviousButton' dojoAttachPoint='previousButton' role='option'></li>" - +"<li class='dijitMenuItem dijitMenuNextButton' dojoAttachPoint='nextButton' role='option'></li>" - +"</ul>", +return dojo.dnd.Avatar; +}); - // _messages: Object - // Holds "next" and "previous" text for paging buttons on drop down - _messages: null, - - baseClass: "dijitComboBoxMenu", +}, +'dijit/form/Button':function(){ +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/_base/kernel", // kernel.deprecated + "dojo/_base/lang", // lang.trim + "dojo/ready", + "./_FormWidget", + "./_ButtonMixin", + "dojo/text!./templates/Button.html" +], function(require, declare, domClass, kernel, lang, ready, _FormWidget, _ButtonMixin, template){ - postMixInProperties: function(){ - this.inherited(arguments); - this._messages = dojo.i18n.getLocalization("dijit.form", "ComboBox", this.lang); - }, +/*===== + var _FormWidget = dijit.form._FormWidget; + var _ButtonMixin = dijit.form._ButtonMixin; +=====*/ - buildRendering: function(){ - this.inherited(arguments); +// module: +// dijit/form/Button +// summary: +// Button widget - // fill in template with i18n messages - this.previousButton.innerHTML = this._messages["previousMessage"]; - this.nextButton.innerHTML = this._messages["nextMessage"]; - }, +// Back compat w/1.6, remove for 2.0 +if(!kernel.isAsync){ + 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 + }); +} - _setValueAttr: function(/*Object*/ value){ - this.value = value; - this.onChange(value); - }, +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 dijit.form.Button({label: "hello world", onClick: foo}); + // | dojo.body().appendChild(button1.domNode); - // stubs - onChange: function(/*Object*/ value){ - // summary: - // Notifies ComboBox/FilteringSelect that user clicked an option in the drop down menu. - // Probably should be called onSelect. - // tags: - // callback - }, - onPage: function(/*Number*/ direction){ - // summary: - // Notifies ComboBox/FilteringSelect that user clicked to advance to next/previous page. - // tags: - // callback - }, + // 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, - onClose: function(){ - // summary: - // Callback from dijit.popup code to this widget, notifying it that it closed - // tags: - // private - this._blurOptionNode(); - }, + // iconClass: String + // Class to apply to DOMNode in button to make it display an icon + iconClass: "dijitNoIcon", + _setIconClassAttr: { node: "iconNode", type: "class" }, - _createOption: function(/*Object*/ item, labelFunc){ - // summary: - // Creates an option to appear on the popup menu subclassed by - // `dijit.form.FilteringSelect`. + baseClass: "dijitButton", - var menuitem = dojo.create("li", { - "class": "dijitReset dijitMenuItem" +(this.isLeftToRight() ? "" : " dijitMenuItemRtl"), - role: "option" - }); - var labelObject = labelFunc(item); - if(labelObject.html){ - menuitem.innerHTML = labelObject.label; - }else{ - menuitem.appendChild( - dojo.doc.createTextNode(labelObject.label) - ); - } - // #3250: in blank options, assign a normal height - if(menuitem.innerHTML == ""){ - menuitem.innerHTML = " "; - } - menuitem.item=item; - return menuitem; - }, - - createOptions: function(results, dataObject, labelFunc){ - // summary: - // Fills in the items in the drop down list - // results: - // Array of dojo.data items - // dataObject: - // dojo.data store - // labelFunc: - // Function to produce a label in the drop down list from a dojo.data item - - //this._dataObject=dataObject; - //this._dataObject.onComplete=dojo.hitch(comboBox, comboBox._openResultList); - // display "Previous . . ." button - this.previousButton.style.display = (dataObject.start == 0) ? "none" : ""; - dojo.attr(this.previousButton, "id", this.id + "_prev"); - // create options using _createOption function defined by parent - // ComboBox (or FilteringSelect) class - // #2309: - // iterate over cache nondestructively - dojo.forEach(results, function(item, i){ - var menuitem = this._createOption(item, labelFunc); - dojo.attr(menuitem, "id", this.id + i); - this.domNode.insertBefore(menuitem, this.nextButton); - }, this); - // display "Next . . ." button - var displayMore = false; - //Try to determine if we should show 'more'... - if(dataObject._maxOptions && dataObject._maxOptions != -1){ - if((dataObject.start + dataObject.count) < dataObject._maxOptions){ - displayMore = true; - }else if((dataObject.start + dataObject.count) > dataObject._maxOptions && dataObject.count == results.length){ - //Weird return from a datastore, 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(dataObject.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; - } + templateString: template, - this.nextButton.style.display = displayMore ? "" : "none"; - dojo.attr(this.nextButton,"id", this.id + "_next"); - return this.domNode.childNodes; - }, + // Map widget attributes to DOMNode attributes. + _setValueAttr: "valueNode", - clearResultList: function(){ - // summary: - // Clears the entries in the drop down list, but of course keeps the previous and next buttons. - while(this.domNode.childNodes.length>2){ - this.domNode.removeChild(this.domNode.childNodes[this.domNode.childNodes.length-2]); + _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 + // leave ok = true so that subclasses can do what they need to do } - this._blurOptionNode(); - }, - - _onMouseDown: function(/*Event*/ evt){ - dojo.stopEvent(evt); - }, + } + return ok; + }, - _onMouseUp: function(/*Event*/ evt){ - if(evt.target === this.domNode || !this._highlighted_option){ - // !this._highlighted_option check to prevent immediate selection when menu appears on top - // of <input>, see #9898. Note that _HasDropDown also has code to prevent this. - return; - }else if(evt.target == this.previousButton){ - this._blurOptionNode(); - this.onPage(-1); - }else if(evt.target == this.nextButton){ - this._blurOptionNode(); - this.onPage(1); - }else{ - var tgt = evt.target; - // while the clicked node is inside the div - while(!tgt.item){ - // recurse to the top - tgt = tgt.parentNode; - } - this._setValueAttr({ target: tgt }, true); + _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 } - }, + } + }, - _onMouseOver: function(/*Event*/ evt){ - if(evt.target === this.domNode){ return; } - var tgt = evt.target; - if(!(tgt == this.previousButton || tgt == this.nextButton)){ - // while the clicked node is inside the div - while(!tgt.item){ - // recurse to the top - tgt = tgt.parentNode; - } - } - this._focusOptionNode(tgt); - }, + _setShowLabelAttr: function(val){ + if(this.containerNode){ + domClass.toggle(this.containerNode, "dijitDisplayNone", !val); + } + this._set("showLabel", val); + }, - _onMouseOut: function(/*Event*/ evt){ - if(evt.target === this.domNode){ return; } - this._blurOptionNode(); - }, + 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); + }, - _focusOptionNode: function(/*DomNode*/ node){ - // summary: - // Does the actual highlight. - if(this._highlighted_option != node){ - this._blurOptionNode(); - this._highlighted_option = node; - dojo.addClass(this._highlighted_option, "dijitMenuItemSelected"); - } - }, + _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 || ''); + } + } +}); - _blurOptionNode: function(){ - // summary: - // Removes highlight on highlighted option. - if(this._highlighted_option){ - dojo.removeClass(this._highlighted_option, "dijitMenuItemSelected"); - this._highlighted_option = null; - } - }, - _highlightNextOption: function(){ - // summary: - // Highlight the item just below the current selection. - // If nothing selected, highlight first option. +}); - // because each press of a button clears the menu, - // the highlighted option sometimes becomes detached from the menu! - // test to see if the option has a parent to see if this is the case. - if(!this.getHighlightedOption()){ - var fc = this.domNode.firstChild; - this._focusOptionNode(fc.style.display == "none" ? fc.nextSibling : fc); - }else{ - var ns = this._highlighted_option.nextSibling; - if(ns && ns.style.display != "none"){ - this._focusOptionNode(ns); - }else{ - this.highlightFirstOption(); - } - } - // scrollIntoView is called outside of _focusOptionNode because in IE putting it inside causes the menu to scroll up on mouseover - dojo.window.scrollIntoView(this._highlighted_option); - }, - highlightFirstOption: function(){ - // summary: - // Highlight the first real item in the list (not Previous Choices). - var first = this.domNode.firstChild; - var second = first.nextSibling; - this._focusOptionNode(second.style.display == "none" ? first : second); // remotely possible that Previous Choices is the only thing in the list - dojo.window.scrollIntoView(this._highlighted_option); - }, +}, +'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", +'dojo/dnd/move':function(){ +define("dojo/dnd/move", ["../main", "./Mover", "./Moveable"], function(dojo) { + // module: + // dojo/dnd/move + // summary: + // TODOC - highlightLastOption: function(){ - // summary: - // Highlight the last real item in the list (not More Choices). - this._focusOptionNode(this.domNode.lastChild.previousSibling); - dojo.window.scrollIntoView(this._highlighted_option); - }, - _highlightPrevOption: function(){ - // summary: - // Highlight the item just above the current selection. - // If nothing selected, highlight last option (if - // you select Previous and try to keep scrolling up the list). - if(!this.getHighlightedOption()){ - var lc = this.domNode.lastChild; - this._focusOptionNode(lc.style.display == "none" ? lc.previousSibling : lc); - }else{ - var ps = this._highlighted_option.previousSibling; - if(ps && ps.style.display != "none"){ - this._focusOptionNode(ps); - }else{ - this.highlightLastOption(); - } - } - dojo.window.scrollIntoView(this._highlighted_option); - }, - - _page: function(/*Boolean*/ up){ - // summary: - // Handles page-up and page-down keypresses - - var scrollamount = 0; - var oldscroll = this.domNode.scrollTop; - var height = dojo.style(this.domNode, "height"); - // if no item is highlighted, highlight the first option - if(!this.getHighlightedOption()){ - this._highlightNextOption(); - } - while(scrollamount<height){ - if(up){ - // stop at option 1 - if(!this.getHighlightedOption().previousSibling || - this._highlighted_option.previousSibling.style.display == "none"){ - break; - } - this._highlightPrevOption(); - }else{ - // stop at last option - if(!this.getHighlightedOption().nextSibling || - this._highlighted_option.nextSibling.style.display == "none"){ - break; - } - this._highlightNextOption(); - } - // going backwards - var newscroll=this.domNode.scrollTop; - scrollamount+=(newscroll-oldscroll)*(up ? -1:1); - oldscroll=newscroll; - } - }, - - pageUp: function(){ - // summary: - // Handles pageup keypress. - // TODO: just call _page directly from handleKey(). - // tags: - // private - this._page(true); - }, +/*===== +dojo.declare("dojo.dnd.move.__constrainedMoveableArgs", [dojo.dnd.__MoveableArgs], { + // constraints: Function + // Calculates a constraint box. + // It is called in a context of the moveable object. + constraints: function(){}, - pageDown: function(){ - // summary: - // Handles pagedown keypress. - // TODO: just call _page directly from handleKey(). - // tags: - // private - this._page(false); - }, + // within: Boolean + // restrict move within boundaries. + within: false +}); +=====*/ - getHighlightedOption: function(){ - // summary: - // Returns the highlighted option. - var ho = this._highlighted_option; - return (ho && ho.parentNode) ? ho : null; - }, +dojo.declare("dojo.dnd.move.constrainedMoveable", dojo.dnd.Moveable, { + // object attributes (for markup) + constraints: function(){}, + within: false, - 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.charOrCode){ - case dojo.keys.DOWN_ARROW: - this._highlightNextOption(); - return false; - case dojo.keys.PAGE_DOWN: - this.pageDown(); - return false; - case dojo.keys.UP_ARROW: - this._highlightPrevOption(); - return false; - case dojo.keys.PAGE_UP: - this.pageUp(); - return false; - default: - return true; - } + constructor: function(node, params){ + // summary: + // an object that makes a node moveable + // node: Node + // a node (or node's id) to be moved + // params: dojo.dnd.move.__constrainedMoveableArgs? + // an optional object with additional parameters; + // the rest is passed to the base class + if(!params){ params = {}; } + this.constraints = params.constraints; + this.within = params.within; + }, + onFirstMove: function(/* dojo.dnd.Mover */ mover){ + // summary: + // called during the very first move notification; + // can be used to initialize coordinates, can be overwritten. + var c = this.constraintBox = this.constraints.call(this, mover); + c.r = c.l + c.w; + c.b = c.t + c.h; + if(this.within){ + var mb = dojo._getMarginSize(mover.node); + c.r -= mb.w; + c.b -= mb.h; } + }, + onMove: function(/* dojo.dnd.Mover */ mover, /* Object */ leftTop){ + // summary: + // called during every move notification; + // should actually move the node; can be overwritten. + var c = this.constraintBox, s = mover.node.style; + this.onMoving(mover, leftTop); + leftTop.l = leftTop.l < c.l ? c.l : c.r < leftTop.l ? c.r : leftTop.l; + leftTop.t = leftTop.t < c.t ? c.t : c.b < leftTop.t ? c.b : leftTop.t; + s.left = leftTop.l + "px"; + s.top = leftTop.t + "px"; + this.onMoved(mover, leftTop); } -); +}); -dojo.declare( - "dijit.form.ComboBox", - [dijit.form.ValidationTextBox, dijit.form.ComboBoxMixin], - { - // summary: - // Auto-completing text box, and base class for dijit.form.FilteringSelect. - // - // 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. +/*===== +dojo.declare("dojo.dnd.move.__boxConstrainedMoveableArgs", [dojo.dnd.move.__constrainedMoveableArgs], { + // box: Object + // a constraint box + box: {} +}); +=====*/ - _setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){ - // summary: - // Hook so set('value', value) works. - // description: - // Sets the value of the select. - this._set("item", null); // value not looked up in store - if(!value){ value = ''; } // null translates to blank - dijit.form.ValidationTextBox.prototype._setValueAttr.call(this, value, priorityChange, displayedValue); - } +dojo.declare("dojo.dnd.move.boxConstrainedMoveable", dojo.dnd.move.constrainedMoveable, { + // box: + // object attributes (for markup) + box: {}, + + constructor: function(node, params){ + // summary: + // an object, which makes a node moveable + // node: Node + // a node (or node's id) to be moved + // params: dojo.dnd.move.__boxConstrainedMoveableArgs? + // an optional object with parameters + var box = params && params.box; + this.constraints = function(){ return box; }; } -); +}); -dojo.declare("dijit.form._ComboBoxDataStore", null, { - // summary: - // Inefficient but small data store specialized for inlined `dijit.form.ComboBox` data - // - // description: - // Provides a store for inlined data like: - // - // | <select> - // | <option value="AL">Alabama</option> - // | ... - // - // Actually. just implements the subset of dojo.data.Read/Notification - // needed for ComboBox and FilteringSelect to work. - // - // Note that an item is just a pointer to the <option> DomNode. - - constructor: function( /*DomNode*/ root){ - this.root = root; - if(root.tagName != "SELECT" && root.firstChild){ - root = dojo.query("select", root); - if(root.length > 0){ // SELECT is a child of srcNodeRef - root = root[0]; - }else{ // no select, so create 1 to parent the option tags to define selectedIndex - this.root.innerHTML = "<SELECT>"+this.root.innerHTML+"</SELECT>"; - root = this.root.firstChild; - } - this.root = root; - } - dojo.query("> option", root).forEach(function(node){ - // TODO: this was added in #3858 but unclear why/if it's needed; doesn't seem to be. - // If it is needed then can we just hide the select itself instead? - //node.style.display="none"; - node.innerHTML = dojo.trim(node.innerHTML); - }); +/*===== +dojo.declare("dojo.dnd.move.__parentConstrainedMoveableArgs", [dojo.dnd.move.__constrainedMoveableArgs], { + // area: String + // A parent's area to restrict the move. + // Can be "margin", "border", "padding", or "content". + area: "" +}); +=====*/ - }, +dojo.declare("dojo.dnd.move.parentConstrainedMoveable", dojo.dnd.move.constrainedMoveable, { + // area: + // object attributes (for markup) + area: "content", - getValue: function( /*item*/ item, - /*attribute-name-string*/ attribute, - /*value?*/ defaultValue){ - return (attribute == "value") ? item.value : (item.innerText || item.textContent || ''); - }, + constructor: function(node, params){ + // summary: + // an object, which makes a node moveable + // node: Node + // a node (or node's id) to be moved + // params: dojo.dnd.move.__parentConstrainedMoveableArgs? + // an optional object with parameters + var area = params && params.area; + this.constraints = function(){ + var n = this.node.parentNode, + s = dojo.getComputedStyle(n), + mb = dojo._getMarginBox(n, s); + if(area == "margin"){ + return mb; // Object + } + var t = dojo._getMarginExtents(n, s); + mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h; + if(area == "border"){ + return mb; // Object + } + t = dojo._getBorderExtents(n, s); + mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h; + if(area == "padding"){ + return mb; // Object + } + t = dojo._getPadExtents(n, s); + mb.l += t.l, mb.t += t.t, mb.w -= t.w, mb.h -= t.h; + return mb; // Object + }; + } +}); - isItemLoaded: function(/*anything*/ something){ - return true; - }, +// patching functions one level up for compatibility - getFeatures: function(){ - return {"dojo.data.api.Read": true, "dojo.data.api.Identity": true}; - }, +dojo.dnd.constrainedMover = dojo.dnd.move.constrainedMover; +dojo.dnd.boxConstrainedMover = dojo.dnd.move.boxConstrainedMover; +dojo.dnd.parentConstrainedMover = dojo.dnd.move.parentConstrainedMover; - _fetchItems: function( /*Object*/ args, - /*Function*/ findCallback, - /*Function*/ errorCallback){ - // summary: - // See dojo.data.util.simpleFetch.fetch() - if(!args.query){ args.query = {}; } - if(!args.query.name){ args.query.name = ""; } - if(!args.queryOptions){ args.queryOptions = {}; } - var matcher = dojo.data.util.filter.patternToRegExp(args.query.name, args.queryOptions.ignoreCase), - items = dojo.query("> option", this.root).filter(function(option){ - return (option.innerText || option.textContent || '').match(matcher); - } ); - if(args.sort){ - items.sort(dojo.data.util.sorter.createSortFunction(args.sort, this)); - } - findCallback(items, args); - }, +return dojo.dnd.move; +}); - close: function(/*dojo.data.api.Request || args || null*/ request){ - return; - }, +}, +'dijit/_WidgetBase':function(){ +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.create domConstruct.destroy domConstruct.place + "dojo/dom-geometry", // isBodyLtr + "dojo/dom-style", // domStyle.set, domStyle.get + "dojo/_base/kernel", + "dojo/_base/lang", // mixin(), isArray(), etc. + "dojo/on", + "dojo/ready", + "dojo/Stateful", // Stateful + "dojo/topic", + "dojo/_base/window", // win.doc.createTextNode + "./registry" // registry.getUniqueId(), registry.findWidgets() +], function(require, array, aspect, config, connect, declare, + dom, domAttr, domClass, domConstruct, domGeometry, domStyle, kernel, + lang, on, ready, Stateful, topic, win, registry){ - getLabel: function(/*item*/ item){ - return item.innerHTML; - }, +/*===== +var Stateful = dojo.Stateful; +=====*/ - getIdentity: function(/*item*/ item){ - return dojo.attr(item, "value"); - }, +// module: +// dijit/_WidgetBase +// summary: +// Future base class for all Dijit widgets. - fetchItemByIdentity: function(/*Object*/ args){ - // summary: - // Given the identity of an item, this method returns the item that has - // that identity through the onItem callback. - // Refer to dojo.data.api.Identity.fetchItemByIdentity() for more details. - // - // description: - // Given arguments like: - // - // | {identity: "CA", onItem: function(item){...} - // - // Call `onItem()` with the DOM node `<option value="CA">California</option>` - var item = dojo.query("> option[value='" + args.identity + "']", this.root)[0]; - args.onItem(item); - }, +// For back-compat, remove in 2.0. +if(!kernel.isAsync){ + ready(0, function(){ + var requires = ["dijit/_base/manager"]; + require(requires); // use indirection so modules not rolled into a build + }); +} - fetchSelectedItem: function(){ - // summary: - // Get the option marked as selected, like `<option selected>`. - // Not part of dojo.data API. - var root = this.root, - si = root.selectedIndex; - return typeof si == "number" - ? dojo.query("> option:nth-child(" + (si != -1 ? si+1 : 1) + ")", root)[0] - : null; // dojo.data.Item +// 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; } -}); -//Mix in the simple fetch implementation to this class. -dojo.extend(dijit.form._ComboBoxDataStore,dojo.data.util.simpleFetch); + 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); + }; } -if(!dojo._hasResource["dijit.form.FilteringSelect"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.FilteringSelect"] = true; -dojo.provide("dijit.form.FilteringSelect"); +return declare("dijit._WidgetBase", Stateful, { + // 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"), -dojo.declare( - "dijit.form.FilteringSelect", - [dijit.form.MappedTextBox, dijit.form.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, + // 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: "", - _lastDisplayedValue: "", + // class: String + // HTML class attribute + "class": "", + _setClassAttr: { node: "domNode", type: "class" }, - _isValidSubset: function(){ - return this._opened; - }, + // style: String||Object + // HTML style attributes as cssText string or name/value hash + style: "", - isValid: function(){ - // Overrides ValidationTextBox.isValid() - return this.item || (!this.required && this.get('displayedValue') == ""); // #5974 - }, + // 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: "", - _refreshState: function(){ - if(!this.searchTimer){ // state will be refreshed after results are returned - this.inherited(arguments); - } - }, + // 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: "", - _callbackSetLabel: function( - /*Array*/ result, - /*Object*/ dataObject, - /*Boolean?*/ priorityChange){ - // summary: - // Callback from dojo.data after lookup of user entered value finishes + // baseClass: [protected] String + // Root CSS class of the widget (ex: dijitTextBox), used to construct CSS classes to indicate + // widget state. + baseClass: "", - // 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((dataObject && dataObject.query[this.searchAttr] != this._lastQuery) || (!dataObject && 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.valueNode.value = ""; - dijit.form.TextBox.superclass._setValueAttr.call(this, "", priorityChange || (priorityChange === undefined && !this._focused)); - this._set("item", null); - this.validate(this._focused); - }else{ - this.set('item', result[0], priorityChange); - } - }, + // srcNodeRef: [readonly] DomNode + // pointer to original DOM node + srcNodeRef: null, - _openResultList: function(/*Object*/ results, /*Object*/ dataObject){ - // Callback when a data store query completes. - // Overrides ComboBox._openResultList() + // 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, - // #3285: tap into search callback to see if user's query resembles a match - if(dataObject.query[this.searchAttr] != this._lastQuery){ - return; - } - dijit.form.ComboBoxMixin.prototype._openResultList.apply(this, arguments); + // 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, - 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); - } - }, +/*===== + // _started: Boolean + // startup() has completed. + _started: false, +=====*/ - _getValueAttr: function(){ - // summary: - // Hook for get('value') to work. + // 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: {}, - // 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; - }, + // _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"), - _getValueField: function(){ - // Overrides ComboBox._getValueField() - return "value"; - }, + //////////// INITIALIZATION METHODS /////////////////////////////////////// - _setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange){ - // 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; } - this._lastQuery = value; + postscript: function(/*Object?*/params, /*DomNode|String*/srcNodeRef){ + // summary: + // Kicks off widget instantiation. See create() for details. + // tags: + // private + this.create(params, srcNodeRef); + }, - if(value === null || value === ''){ - this._setDisplayedValueAttr('', priorityChange); - return; - } + create: function(/*Object?*/params, /*DomNode|String?*/srcNodeRef){ + // summary: + // Kick off the life-cycle of a widget + // params: + // Hash of initialization parameters for widget, including + // scalar values (like title, duration etc.) and functions, + // typically callbacks like onClick. + // srcNodeRef: + // 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 + // 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. + // tags: + // private - //#3347: fetchItemByIdentity if no keyAttr specified - var self = this; - this.store.fetchItemByIdentity({ - identity: value, - onItem: function(item){ - self._callbackSetLabel(item? [item] : [], undefined, priorityChange); - } - }); - }, + // store pointer to original DOM tree + this.srcNodeRef = dom.byId(srcNodeRef); - _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.valueNode.value = this.value; - this._lastDisplayedValue = this.textbox.value; - }, + // For garbage collection. An array of listener handles returned by this.connect() / this.subscribe() + this._connects = []; - _getDisplayQueryString: function(/*String*/ text){ - return text.replace(/([\\\*\?])/g, "\\$1"); - }, + // For widgets internal to this widget, invisible to calling code + this._supportingWidgets = []; - _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. + // 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; } - if(label == null){ label = ''; } + // mix in our passed parameters + if(params){ + this.params = params; + lang.mixin(this, params); + } + this.postMixInProperties(); - // 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; - } + // generate an id for the widget if one wasn't specified + // (be sure to do this before buildRendering() because that function might + // expect the id to be there.) + if(!this.id){ + this.id = registry.getUniqueId(this.declaredClass.replace(/\./g,"_")); + } + registry.add(this); - // 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 = dojo.clone(this.query); // #6196: populate query with user-specifics - // escape meta characters of dojo.data.util.filter.patternToRegExp(). - this._lastQuery = query[this.searchAttr] = this._getDisplayQueryString(label); - // 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 fetch = { - query: query, - queryOptions: { - ignoreCase: this.ignoreCase, - deep: true - }, - onComplete: function(result, dataObject){ - _this._fetchHandle = null; - dojo.hitch(_this, "_callbackSetLabel")(result, dataObject, priorityChange); - }, - onError: function(errText){ - _this._fetchHandle = null; - console.error('dijit.form.FilteringSelect: ' + errText); - dojo.hitch(_this, "_callbackSetLabel")([], undefined, false); - } - }; - dojo.mixin(fetch, this.fetchProperties); - this._fetchHandle = this.store.fetch(fetch); + this.buildRendering(); + + 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); } - }, + } - undo: function(){ - this.set('displayedValue', this._lastDisplayedValue); + if(this.domNode){ + // 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. + if(this.srcNodeRef && !this.srcNodeRef.parentNode){ + delete this.srcNodeRef; + } -if(!dojo._hasResource["dijit.form.Form"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.Form"] = true; -dojo.provide("dijit.form.Form"); + 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. + 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 attribute that was either specified as parameter to constructor, + // or was found above and has a default non-null value. For correlated attributes like value and displayedValue, the one + // specified as a parameter should take precedence, so apply attributes in this.params last. + // Particularly important for new DateTextBox({displayedValue: ...}) since DateTextBox's default value is + // NaN and thus is not ignored like a default value of "". + array.forEach(list, function(attr){ + if(this.params && attr in this.params){ + // skip this one, do it below + }else if(this[attr]){ + this.set(attr, this[attr]); + } + }, this); + for(var param in this.params){ + this.set(param, this[param]); + } + }, + 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 + }, -dojo.declare( - "dijit.form.Form", - [dijit._Widget, dijit._Templated, dijit.form._FormMixin, dijit.layout._ContentPaneResizeMixin], - { + buildRendering: function(){ // summary: - // Widget corresponding to HTML form tag, for validation and serialization - // - // example: - // | <form dojoType="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'); + // Construct the UI for this widget, setting this.domNode. + // Most widgets will mixin `dijit._TemplatedMixin`, which implements this method. + // tags: + // protected - // HTML <FORM> attributes + if(!this.domNode){ + // Create root node if it wasn't created by _Templated + this.domNode = this.srcNodeRef || domConstruct.create('div'); + } - // name: String? - // Name of form for scripting. - name: "", + // 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); + } + }, - // action: String? - // Server-side form handler. - action: "", + 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 + }, - // method: String? - // HTTP method used to submit the form, either "GET" or "POST". - method: "", + 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; + } + }); + }, - // encType: String? - // Encoding type for the form, ex: application/x-www-form-urlencoded. - encType: "", + //////////// DESTROY FUNCTIONS //////////////////////////////// - // accept-charset: String? - // List of supported charsets. - "accept-charset": "", + 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. - // accept: String? - // List of MIME types for file upload. - accept: "", + this._beingDestroyed = true; + this.destroyDescendants(preserveDom); + this.destroy(preserveDom); + }, - // target: String? - // Target frame for the document to be opened in. - target: "", + 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 - templateString: "<form dojoAttachPoint='containerNode' dojoAttachEvent='onreset:_onReset,onsubmit:_onSubmit' ${!nameAttrSetting}></form>", + this._beingDestroyed = true; + this.uninitialize(); - attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, { - action: "", - method: "", - encType: "", - "accept-charset": "", - accept: "", - target: "" - }), + // remove this.connect() and this.subscribe() listeners + var c; + while((c = this._connects.pop())){ + c.remove(); + } - 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 attributeMap to set the name due to IE limitations, see #8660 - this.nameAttrSetting = this.name ? ("name='" + this.name + "'") : ""; - this.inherited(arguments); - }, + // destroy widgets created as part of template, etc. + var w; + while((w = this._supportingWidgets.pop())){ + if(w.destroyRecursive){ + w.destroyRecursive(); + }else if(w.destroy){ + w.destroy(); + } + } - execute: function(/*Object*/ formContents){ - // summary: - // Deprecated: use submit() - // tags: - // deprecated - }, + this.destroyRendering(preserveDom); + registry.remove(this.id); + this._destroyed = true; + }, - onExecute: function(){ - // summary: - // Deprecated: use onSubmit() - // tags: - // deprecated - }, + 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 - _setEncTypeAttr: function(/*String*/ value){ - this.encType = value; - dojo.attr(this.domNode, "encType", value); - if(dojo.isIE){ this.domNode.encoding = value; } - }, + if(this.bgIframe){ + this.bgIframe.destroy(preserveDom); + delete this.bgIframe; + } - postCreate: function(){ - // IE tries to hide encType - // TODO: remove in 2.0, no longer necessary with data-dojo-params - if(dojo.isIE && this.srcNodeRef && this.srcNodeRef.attributes){ - var item = this.srcNodeRef.attributes.getNamedItem('encType'); - if(item && !item.specified && (typeof item.value == "string")){ - this.set('encType', item.value); - } + if(this.domNode){ + if(preserveDom){ + domAttr.remove(this.domNode, "widgetId"); + }else{ + domConstruct.destroy(this.domNode); } - this.inherited(arguments); - }, + delete this.domNode; + } - reset: function(/*Event?*/ e){ - // summary: - // restores all widget values back to their init values, - // calls onReset() which can cancel the reset by returning false + if(this.srcNodeRef){ + if(!preserveDom){ + domConstruct.destroy(this.srcNodeRef); + } + delete this.srcNodeRef; + } + }, - // 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, []); + 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); } - }, + }); + }, - 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 - }, + uninitialize: function(){ + // summary: + // Stub function. Override to implement custom widget tear-down + // behavior. + // tags: + // protected + return false; + }, - _onReset: function(e){ - this.reset(e); - dojo.stopEvent(e); - return false; - }, + ////////////////// GET/SET, CUSTOM SETTERS, ETC. /////////////////// - _onSubmit: function(e){ - var fp = dijit.form.Form.prototype; - // TODO: remove this if statement beginning with 2.0 - if(this.execute != fp.execute || this.onExecute != fp.onExecute){ - dojo.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 - dojo.stopEvent(e); - } - }, + _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 - 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 + var mapNode = this.domNode; - return this.isValid(); // Boolean - }, + // Note: technically we should revert any style setting made in a previous call + // to his method, but that's difficult to keep track of. - submit: function(){ - // summary: - // programmatically submit form if and only if the `onSubmit` returns true - if(!(this.onSubmit() === false)){ - this.containerNode.submit(); + 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); + }, -if(!dojo._hasResource["dijit.form.RadioButton"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.RadioButton"] = true; -dojo.provide("dijit.form.RadioButton"); + _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. + // + // tags: + // private + commands = arguments.length >= 3 ? commands : this.attributeMap[attr]; + array.forEach(lang.isArray(commands) ? commands : [commands], function(command){ -// TODO: for 2.0, move the RadioButton code into this file + // 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); + } -if(!dojo._hasResource["dijit.form._FormSelectWidget"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form._FormSelectWidget"] = true; -dojo.provide("dijit.form._FormSelectWidget"); + // 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); + domAttr.set(mapNode, attrName, value); + break; + case "innerText": + mapNode.innerHTML = ""; + mapNode.appendChild(win.doc.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)` -/*===== -dijit.form.__SelectOption = function(){ - // 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 - this.value = value; - this.label = label; - this.selected = selected; - this.disabled = disabled; -} -=====*/ + 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 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; + }, -dojo.declare("dijit.form._FormSelectWidget", dijit.form._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. + _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 - // multiple: [const] Boolean - // Whether or not we are multi-valued - multiple: false, + 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 + }); + }, - // options: dijit.form.__SelectOption[] - // The set of options for our select item. Roughly corresponds to - // the html <option> tag. - options: null, + _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._watchCallbacks && this._created && value !== oldValue){ + this._watchCallbacks(name, oldValue, value); + } + }, - // store: dojo.data.api.Identity - // A store which, at the very least impelements dojo.data.api.Identity - // to use for getting our list of options - rather than reading them - // from the <option> html tags. - store: null, + on: function(/*String*/ type, /*Function*/ func){ + // summary: + // Call specified function when event occurs, ex: myWidget.on("click", function(){ ... }). + // 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))`. - // query: object - // A query to use when fetching items from our store - query: null, + return aspect.after(this, this._onMap(type), func, true); + }, - // queryOptions: object - // Query options to use when fetching from the store - queryOptions: null, + _onMap: function(/*String*/ type){ + // summary: + // Maps on() type parameter (ex: "mousemove") to method name (ex: "onMouseMove") + 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[type.toLowerCase()]; // String + }, - // onFetch: Function - // A callback to do with an onFetch - but before any items are actually - // iterated over (i.e. to filter even futher what you want to add) - onFetch: null, + 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 + }, - // sortByLabel: Boolean - // Flag to sort the options returned from a store by the label of - // the store. - sortByLabel: true, + 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._Widget[] + }, + getParent: function(){ + // summary: + // Returns the parent widget of this widget + return registry.getEnclosingWidget(this.domNode.parentNode); + }, - // 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, + 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 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 dijit.form.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 - getOptions: function(/*anything*/ valueOrIdx){ + var handle = connect.connect(obj, event, this, method); + this._connects.push(handle); + return handle; // _Widget.Handle + }, + + disconnect: function(handle){ // 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.__SelectOption). + // Disconnects handle created by `connect`. + // Also removes handle from this widget's list of connects. + // tags: + // protected + var i = array.indexOf(this._connects, handle); + if(i != -1){ + handle.remove(); + this._connects.splice(i, 1); + } + }, + + subscribe: function(t, method){ + // summary: + // Subscribes to the specified topic and calls the specified method + // of this object and registers for unsubscribe() on widget destroy. + // description: + // 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 dijit.form.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 + var handle = topic.subscribe(t, lang.hitch(this, method)); + this._connects.push(handle); + return handle; // _Widget.Handle + }, + + unsubscribe: function(/*Object*/ handle){ + // summary: + // Unsubscribes handle created by this.subscribe. + // Also removes handle from this widget's list of subscriptions + // tags: + // protected + this.disconnect(handle); + }, + + 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(); //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's domNode reference somewhere in the DOM based + // on standard domConstruct.place conventions, or passing a Widget reference that + // contains and addChild member. // - // If passed in a number, then the option with the given index (0-based) - // within this select will be returned. + // 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. // - // If passed in a dijit.form.__SelectOption, the same option will be - // returned if and only if it exists within this select. + // reference: + // The String id of a domNode, a domNode reference, or a reference to a Widget possessing + // an addChild method. // - // If passed an array, then an array will be returned with each element - // in the array being looked up. + // position: + // If passed a string or domNode reference, the position argument + // accepts a string just as domConstruct.place does, one of: "first", "last", + // "before", or "after". // - // If not passed a value, then all options will be returned + // If passed a _Widget reference, and that widget reference has an ".addChild" method, + // it will be called passing this widget instance into that method, supplying the optional + // position index passed. // // 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.__SelectOption is passed in which is not a part of the select - - // NOTE: the compare for passing in a dijit.form.__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; + // dijit._Widget + // 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 dijit.form.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 dijit.form.Button({},"src").placeAt("wrapper"); + // + // example: + // | // place a new button as the first element of some div + // | var button = new dijit.form.Button({ label:"click" }).placeAt("wrapper","first"); + // + // example: + // | // create a contentpane and add it to a TabContainer + // | var tc = dijit.byId("myTabs"); + // | new dijit.layout.ContentPane({ href:"foo.html", title:"Wow!" }).placeAt(tc) - if(lookupValue === undefined){ - return opts; // dijit.form.__SelectOption[] - } - if(dojo.isArray(lookupValue)){ - return dojo.map(lookupValue, "return this.getOptions(item);", this); // dijit.form.__SelectOption[] - } - if(dojo.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(!dojo.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] // dijit.form.__SelectOption + if(reference.declaredClass && reference.addChild){ + reference.addChild(this, position); + }else{ + domConstruct.place(this.domNode, reference, position); } - return null; // null + return this; }, - addOption: function(/*dijit.form.__SelectOption|dijit.form.__SelectOption[]*/ option){ + getTextDir: function(/*String*/ text,/*String*/ originalDir){ // 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(!dojo.isArray(option)){ option = [option]; } - dojo.forEach(option, function(i){ - if(i && dojo.isObject(i)){ - this.options.push(i); - } - }, this); - this._loadChildren(); + // 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; }, - removeOption: function(/*String|dijit.form.__SelectOption|Number|Array*/ valueOrIdx){ + applyTextDir: function(/*===== element, text =====*/){ // 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(!dojo.isArray(valueOrIdx)){ valueOrIdx = [valueOrIdx]; } - var oldOpts = this.getOptions(valueOrIdx); - dojo.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 = dojo.filter(this.options, function(node, idx){ - return (node.value !== i.value || node.label !== i.label); - }); - this._removeOptionItem(i); - } - }, this); - this._loadChildren(); + // 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. }, - updateOption: function(/*dijit.form.__SelectOption|dijit.form.__SelectOption[]*/ newOption){ + defer: function(fcn, delay){ // 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 yeild better performance since - // the children will only be loaded once. - if(!dojo.isArray(newOption)){ newOption = [newOption]; } - dojo.forEach(newOption, function(i){ - var oldOpt = this.getOptions(i), k; - if(oldOpt){ - for(k in i){ oldOpt[k] = i[k]; } - } - }, this); - this._loadChildren(); - }, + // 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(); + } + }; + } +}); - setStore: function(/*dojo.data.api.Identity*/ store, - /*anything?*/ selectedValue, - /*Object?*/ 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.data.api.Identity - // The store you would like to use - it MUST implement Identity, - // and MAY implement Notification. - // selectedValue: anything? - // The value that this widget should set itself to *after* the store - // has been loaded - // fetchArgs: Object? - // The arguments that will be passed to the store's fetch() function - var oStore = this.store; - fetchArgs = fetchArgs || {}; - if(oStore !== store){ - // Our store has changed, so update our notifications - dojo.forEach(this._notifyConnections || [], dojo.disconnect); - delete this._notifyConnections; - if(store && store.getFeatures()["dojo.data.api.Notification"]){ - this._notifyConnections = [ - dojo.connect(store, "onNew", this, "_onNewItem"), - dojo.connect(store, "onDelete", this, "_onDeleteItem"), - dojo.connect(store, "onSet", this, "_onSetItem") - ]; - } - this._set("store", store); - } +}); - // Turn off change notifications while we make all these changes - this._onChangeActive = false; +}, +'dijit/form/Form':function(){ +define("dijit/form/Form", [ + "dojo/_base/declare", // declare + "dojo/dom-attr", // domAttr.set + "dojo/_base/event", // event.stop + "dojo/_base/kernel", // kernel.deprecated + "dojo/_base/sniff", // has("ie") + "../_Widget", + "../_TemplatedMixin", + "./_FormMixin", + "../layout/_ContentPaneResizeMixin" +], function(declare, domAttr, event, kernel, has, _Widget, _TemplatedMixin, _FormMixin, _ContentPaneResizeMixin){ - // Remove existing options (if there are any) - if(this.options && this.options.length){ - this.removeOption(this.options); - } +/*===== + var _Widget = dijit._Widget; + var _TemplatedMixin = dijit._TemplatedMixin; + var _FormMixin = dijit.form._FormMixin; + var _ContentPaneResizeMixin = dijit.layout._ContentPaneResizeMixin; +=====*/ - // Add our new options - if(store){ - this._loadingStore = true; - store.fetch(dojo.delegate(fetchArgs, { - onComplete: function(items, opts){ - if(this.sortByLabel && !fetchArgs.sort && items.length){ - items.sort(dojo.data.util.sorter.createSortFunction([{ - attribute: store.getLabelAttributes(items[0])[0] - }], store)); - } - - if(fetchArgs.onFetch){ - items = fetchArgs.onFetch.call(this, items, opts); - } - // TODO: Add these guys as a batch, instead of separately - dojo.forEach(items, function(i){ - this._addOptionForItem(i); - }, this); - - // 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._fetchedWith = opts; - this._lastValueReported = this.multiple ? [] : null; - this._onChangeActive = true; - this.onSetStore(); - this._handleOnChange(this.value); - }, - scope: this - })); - }else{ - delete this._fetchedWith; - } - return oStore; // dojo.data.api.Identity - }, + // module: + // dijit/form/Form + // summary: + // Widget corresponding to HTML form tag, for validation and serialization - // 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){ + return declare("dijit.form.Form", [_Widget, _TemplatedMixin, _FormMixin, _ContentPaneResizeMixin], { // summary: - // set the value of the widget. - // If a string is passed, then we set our value from looking it up. - 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(!dojo.isArray(newValue)){ - newValue = [newValue]; - } - dojo.forEach(newValue, function(i, idx){ - if(!dojo.isObject(i)){ - i = i + ""; - } - if(typeof i === "string"){ - newValue[idx] = dojo.filter(opts, function(node){ - return node.value === i; - })[0] || {value: "", label: ""}; - } - }, this); + // 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'); - // Make sure some sane default is set - newValue = dojo.filter(newValue, function(i){ return i && i.value; }); - if(!this.multiple && (!newValue[0] || !newValue[0].value) && opts.length){ - newValue[0] = opts[0]; - } - dojo.forEach(opts, function(i){ - i.selected = dojo.some(newValue, function(v){ return v.value === i.value; }); - }); - var val = dojo.map(newValue, function(i){ return i.value; }), - disp = dojo.map(newValue, function(i){ return i.label; }); + // HTML <FORM> attributes - this._set("value", this.multiple ? val : val[0]); - this._setDisplay(this.multiple ? disp : disp[0]); - this._updateSelection(); - this._handleOnChange(this.value, priorityChange); - }, + // name: String? + // Name of form for scripting. + name: "", - _getDisplayedValueAttr: function(){ - // summary: - // returns the displayed value of the widget - var val = this.get("value"); - if(!dojo.isArray(val)){ - val = [val]; - } - var ret = dojo.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]; - }, + // action: String? + // Server-side form handler. + action: "", - _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; } - dojo.forEach(this._getChildren(), function(child){ - child.destroyRecursive(); - }); - // Add each menu item - dojo.forEach(this.options, this._addOptionItem, this); + // method: String? + // HTTP method used to submit the form, either "GET" or "POST". + method: "", - // Update states - this._updateSelection(); - }, + // encType: String? + // Encoding type for the form, ex: application/x-www-form-urlencoded. + encType: "", - _updateSelection: function(){ - // summary: - // Sets the "selected" class on the item for styling purposes - this._set("value", this._getValueFromOpts()); - var val = this.value; - if(!dojo.isArray(val)){ - val = [val]; - } - if(val && val[0]){ - dojo.forEach(this._getChildren(), function(child){ - var isSelected = dojo.some(val, function(v){ - return child.option && (v === child.option.value); - }); - dojo.toggleClass(child.domNode, this.baseClass + "SelectedOption", isSelected); - dijit.setWaiState(child.domNode, "selected", isSelected); - }, this); - } - }, + // accept-charset: String? + // List of supported charsets. + "accept-charset": "", - _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 = dojo.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 dojo.map(dojo.filter(opts, function(i){ - return i.selected; - }), function(i){ - return i.value; - }) || []; - } - return ""; - }, + // accept: String? + // List of MIME types for file upload. + accept: "", - // 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)); - }, + // target: String? + // Target frame for the document to be opened in. + target: "", - _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. If the item contains - // children, the children value of the item will be set - var store = this.store, label = store.getLabel(item), - value = (label ? store.getIdentity(item) : null); - return {value: value, label: label, item:item}; // dijit.form.__SelectOption - }, + templateString: "<form data-dojo-attach-point='containerNode' data-dojo-attach-event='onreset:_onReset,onsubmit:_onSubmit' ${!nameAttrSetting}></form>", - _addOptionForItem: function(/*item*/ item){ - // summary: - // Creates (and adds) the option for the given item - var store = this.store; - if(!store.isItemLoaded(item)){ - // We are not loaded - so let's load it and add later - store.loadItem({item: item, onComplete: function(i){ - this._addOptionForItem(item); - }, - scope: this}); - return; - } - var newOpt = this._getOptionObjForItem(item); - this.addOption(newOpt); - }, + 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); + }, - constructor: function(/*Object*/ keywordArgs){ - // summary: - // 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 = (keywordArgs || {}).value || null; - }, + execute: function(/*Object*/ /*===== formContents =====*/){ + // summary: + // Deprecated: use submit() + // tags: + // deprecated + }, - buildRendering: function(){ - this.inherited(arguments); - dojo.setSelectable(this.focusNode, false); - }, + onExecute: function(){ + // summary: + // Deprecated: use onSubmit() + // tags: + // deprecated + }, - _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. - var opts = this.options; - if(!opts){ - opts = this.options = this.srcNodeRef ? dojo.query(">", - this.srcNodeRef).map(function(node){ - if(node.getAttribute("type") === "separator"){ - return { value: "", label: "", selected: false, disabled: false }; - } - return { - value: (node.getAttribute("data-" + dojo._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(",")); - } - }, + _setEncTypeAttr: function(/*String*/ value){ + this.encType = value; + domAttr.set(this.domNode, "encType", value); + if(has("ie")){ this.domNode.encoding = value; } + }, - postCreate: function(){ - // summary: - // sets up our event handling that we need for functioning - // as a select - this.inherited(arguments); + reset: function(/*Event?*/ e){ + // summary: + // restores all widget values back to their init values, + // calls onReset() which can cancel the reset by returning false - // Make our event connections for updating state - this.connect(this, "onChange", "_updateSelection"); - this.connect(this, "startup", "_loadChildren"); + // 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, []); + } + }, - this._setValueAttr(this.value, null); - }, + 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 + }, - startup: function(){ - // summary: - // Connects in our store, if we have one defined - this.inherited(arguments); - var store = this.store, fetchArgs = {}; - dojo.forEach(["query", "queryOptions", "onFetch"], function(i){ - if(this[i]){ - fetchArgs[i] = this[i]; + _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(); } - delete this[i]; - }, this); - if(store && 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, fetchArgs); } - }, + }); +}); - destroy: function(){ - // summary: - // Clean up our connections - dojo.forEach(this._notifyConnections || [], dojo.disconnect); - this.inherited(arguments); - }, +}, +'dijit/layout/_TabContainerBase':function(){ +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){ - _addOptionItem: function(/*dijit.form.__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(/*dijit.form.__SelectOption*/ option){ - // summary: - // User-overridable function which, for the given option, removes - // its item from the select. - }, +/*===== + var StackContainer = dijit.layout.StackContainer; + var _TemplatedMixin = dijit._TemplatedMixin; +=====*/ - _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) - }, +// module: +// dijit/layout/_TabContainerBase +// summary: +// Abstract base class for TabContainer. Must define _makeController() to instantiate +// and return the widget that displays the tab labels - _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")); - }, +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. - _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 - }, + // tabPosition: String + // Defines where tabs go relative to tab content. + // "top", "bottom", "left-h", "right-h" + tabPosition: "top", - 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 - } -}); + 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, -if(!dojo._hasResource["dijit._KeyNavContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit._KeyNavContainer"] = true; -dojo.provide("dijit._KeyNavContainer"); + // 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(/-.*/, ""); -dojo.declare("dijit._KeyNavContainer", - dijit._Container, - { + this.srcNodeRef && domStyle.set(this.srcNodeRef, "visibility", "hidden"); - // summary: - // A _Container with keyboard navigation of its children. - // description: - // To use this mixin, call connectKeyNavHandlers() in - // postCreate() and call startupKeyNavChildren() in startup(). - // 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, -=====*/ + this.inherited(arguments); + }, - // tabIndex: Integer - // 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", + buildRendering: function(){ + this.inherited(arguments); - _keyNavCodes: {}, + // Create the tab list that will have a tab (a.k.a. tab button) for each tab panel + this.tablist = this._makeController(this.tablistNode); - connectKeyNavHandlers: function(/*dojo.keys[]*/ prevKeyCodes, /*dojo.keys[]*/ nextKeyCodes){ - // summary: - // Call in postCreate() to attach the keyboard handlers - // to the container. - // preKeyCodes: dojo.keys[] - // Key codes for navigating to the previous child. - // nextKeyCodes: dojo.keys[] - // Key codes for navigating to the next child. - // tags: - // protected + if(!this.doLayout){ domClass.add(this.domNode, "dijitTabContainerNoLayout"); } - var keyCodes = (this._keyNavCodes = {}); - var prev = dojo.hitch(this, this.focusPrev); - var next = dojo.hitch(this, this.focusNext); - dojo.forEach(prevKeyCodes, function(code){ keyCodes[code] = prev; }); - dojo.forEach(nextKeyCodes, function(code){ keyCodes[code] = next; }); - keyCodes[dojo.keys.HOME] = dojo.hitch(this, "focusFirstChild"); - keyCodes[dojo.keys.END] = dojo.hitch(this, "focusLastChild"); - this.connect(this.domNode, "onkeypress", "_onContainerKeypress"); - this.connect(this.domNode, "onfocus", "_onContainerFocus"); - }, + 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")); + } + }, - startupKeyNavChildren: function(){ - // summary: - // Call in startup() to set child tabindexes to -1 - // tags: - // protected - dojo.forEach(this.getChildren(), dojo.hitch(this, "_startupChild")); - }, + _setupChild: function(/*dijit._Widget*/ tab){ + // Overrides StackContainer._setupChild(). + domClass.add(tab.domNode, "dijitTabPane"); + this.inherited(arguments); + }, - addChild: function(/*dijit._Widget*/ widget, /*int?*/ insertIndex){ - // summary: - // Add a child to our _Container - dijit._KeyNavContainer.superclass.addChild.apply(this, arguments); - this._startupChild(widget); - }, + startup: function(){ + if(this._started){ return; } - focus: function(){ - // summary: - // Default focus() implementation: focus the first child. - this.focusFirstChild(); - }, + // wire up the tablist and its tabs + this.tablist.startup(); - focusFirstChild: function(){ - // summary: - // Focus the first focusable child in the container. - // tags: - // protected - var child = this._getFirstFocusableChild(); - if(child){ // edge case: Menu could be empty or hidden - this.focusChild(child); - } - }, + this.inherited(arguments); + }, - focusLastChild: function(){ - // summary: - // Focus the last focusable child in the container. - // tags: - // protected - var child = this._getLastFocusableChild(); - if(child){ // edge case: Menu could be empty or hidden - this.focusChild(child); - } - }, + layout: function(){ + // Overrides StackContainer.layout(). + // Configure the content pane to take up all the space except for where the tabs are - focusNext: function(){ - // summary: - // Focus the next widget - // tags: - // protected - var child = this._getNextFocusableChild(this.focusedChild, 1); - this.focusChild(child); - }, + if(!this._contentBox || typeof(this._contentBox.l) == "undefined"){return;} - 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 - var child = this._getNextFocusableChild(this.focusedChild, -1); - this.focusChild(child, true); - }, - - focusChild: function(/*dijit._Widget*/ widget, /*Boolean*/ last){ - // summary: - // Focus 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(this.focusedChild && widget !== this.focusedChild){ - this._onChildBlur(this.focusedChild); - } - 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._Widget*/ 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) - - // focus bubbles on Firefox, - // so just make sure that focus has really gone to the container - if(evt.target !== this.domNode){ return; } + var sc = this.selectedChildWidget; - this.focusFirstChild(); + 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); - // 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 - dojo.attr(this.domNode, "tabIndex", "-1"); - }, + // 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]); - _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){ - dojo.attr(this.domNode, "tabIndex", this.tabIndex); + 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}); } - 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(); - dojo.stopEvent(evt); + // and call resize() on the selected pane just to tell it that it's been made visible + if(sc && sc.resize){ + sc.resize(); } - }, + } + }, - _onChildBlur: function(/*dijit._Widget*/ widget){ - // summary: - // Called when focus leaves a child widget to go - // to a sibling widget. - // tags: - // protected - }, + destroy: function(){ + if(this.tablist){ + this.tablist.destroy(); + } + this.inherited(arguments); + } +}); - _getFirstFocusableChild: function(){ - // summary: - // Returns first child that can be focused - return this._getNextFocusableChild(null, 1); // dijit._Widget - }, +}); - _getLastFocusableChild: function(){ - // summary: - // Returns last child that can be focused - return this._getNextFocusableChild(null, -1); // dijit._Widget - }, +}, +'dojo/store/Memory':function(){ +define("dojo/store/Memory", ["../_base/declare", "./util/QueryResults", "./util/SimpleQueryEngine"], function(declare, QueryResults, SimpleQueryEngine) { + // module: + // dojo/store/Memory + // summary: + // The module defines an in-memory object store. - _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._Widget - } - child = this._getSiblingOfChild(child, dir); - } - // no focusable child found - return null; // dijit._Widget + +return declare("dojo.store.Memory", null, { + // summary: + // This is a basic in-memory object store. It implements dojo.store.api.Store. + constructor: function(/*dojo.store.Memory*/ options){ + // summary: + // Creates a memory object store. + // options: + // This provides any configuration information that will be mixed into the store. + // This should generally include the data property to provide the starting set of data. + for(var i in options){ + this[i] = options[i]; + } + this.setData(this.data || []); + }, + // data: Array + // The array of all the objects in the memory store + data:null, + + // idProperty: String + // Indicates the property to use as the identity property. The values of this + // property should be unique. + idProperty: "id", + + // index: Object + // An index of data indices into the data array by id + index:null, + + // queryEngine: Function + // Defines the query engine to use for querying the data store + queryEngine: SimpleQueryEngine, + get: function(id){ + // summary: + // Retrieves an object by its identity + // id: Number + // The identity to use to lookup the object + // returns: Object + // The object in the store that matches the given id. + return this.data[this.index[id]]; + }, + getIdentity: function(object){ + // summary: + // Returns an object's identity + // object: Object + // The object to get the identity from + // returns: Number + return object[this.idProperty]; + }, + put: function(object, options){ + // summary: + // Stores an object + // object: Object + // The object to store. + // options: dojo.store.api.Store.PutDirectives?? + // Additional metadata for storing the data. Includes an "id" + // property if a specific id is to be used. + // returns: Number + var data = this.data, + index = this.index, + idProperty = this.idProperty; + var id = (options && "id" in options) ? options.id : idProperty in object ? object[idProperty] : Math.random(); + if(id in index){ + // object exists + if(options && options.overwrite === false){ + throw new Error("Object already exists"); + } + // replace the entry in data + data[index[id]] = object; + }else{ + // add the new object + index[id] = data.push(object) - 1; + } + return id; + }, + add: function(object, options){ + // summary: + // Creates an object, throws an error if the object already exists + // object: Object + // The object to store. + // options: dojo.store.api.Store.PutDirectives?? + // Additional metadata for storing the data. Includes an "id" + // property if a specific id is to be used. + // returns: Number + (options = options || {}).overwrite = false; + // call put with overwrite being false + return this.put(object, options); + }, + remove: function(id){ + // summary: + // Deletes an object by its identity + // id: Number + // The identity to use to delete the object + // returns: Boolean + // Returns true if an object was removed, falsy (undefined) if no object matched the id + var index = this.index; + var data = this.data; + if(id in index){ + data.splice(index[id], 1); + // now we have to reindex + this.setData(data); + return true; + } + }, + query: function(query, options){ + // summary: + // Queries the store for objects. + // query: Object + // The query to use for retrieving objects from the store. + // options: dojo.store.api.Store.QueryOptions? + // The optional arguments to apply to the resultset. + // returns: dojo.store.api.Store.QueryResults + // The results of the query, extended with iterative methods. + // + // example: + // Given the following store: + // + // | var store = new dojo.store.Memory({ + // | data: [ + // | {id: 1, name: "one", prime: false }, + // | {id: 2, name: "two", even: true, prime: true}, + // | {id: 3, name: "three", prime: true}, + // | {id: 4, name: "four", even: true, prime: false}, + // | {id: 5, name: "five", prime: true} + // | ] + // | }); + // + // ...find all items where "prime" is true: + // + // | var results = store.query({ prime: true }); + // + // ...or find all items where "even" is true: + // + // | var results = store.query({ even: true }); + return QueryResults(this.queryEngine(query, options)(this.data)); + }, + setData: function(data){ + // summary: + // Sets the given data as the source for this store, and indexes it + // data: Object[] + // An array of objects to use as the source of data. + if(data.items){ + // just for convenience with the data format IFRS expects + this.idProperty = data.identifier; + data = this.data = data.items; + }else{ + this.data = data; + } + this.index = {}; + for(var i = 0, l = data.length; i < l; i++){ + this.index[data[i][this.idProperty]] = i; } } -); +}); -} +}); -if(!dojo._hasResource["dijit.MenuItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.MenuItem"] = true; -dojo.provide("dijit.MenuItem"); +}, +'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", +'dijit/_base/sniff':function(){ +define("dijit/_base/sniff", [ "dojo/uacss" ], function(){ + // module: + // dijit/_base/sniff + // summary: + // Back compatibility module, new code should require dojo/uacss directly instead of this module. +}); +}, +'dijit/Toolbar':function(){ +define("dijit/Toolbar", [ + "require", + "dojo/_base/declare", // declare + "dojo/_base/kernel", + "dojo/keys", // keys.LEFT_ARROW keys.RIGHT_ARROW + "dojo/ready", + "./_Widget", + "./_KeyNavContainer", + "./_TemplatedMixin" +], function(require, declare, kernel, keys, ready, _Widget, _KeyNavContainer, _TemplatedMixin){ +/*===== + var _Widget = dijit._Widget; + var _KeyNavContainer = dijit._KeyNavContainer; + var _TemplatedMixin = dijit._TemplatedMixin; +=====*/ + // module: + // dijit/Toolbar + // summary: + // A Toolbar widget, used to hold things like `dijit.Editor` buttons + // Back compat w/1.6, remove for 2.0 + if(!kernel.isAsync){ + ready(0, function(){ + var requires = ["dijit/ToolbarSeparator"]; + require(requires); // use indirection so modules not rolled into a build + }); + } -dojo.declare("dijit.MenuItem", - [dijit._Widget, dijit._Templated, dijit._Contained, dijit._CssStateMixin], - { + return declare("dijit.Toolbar", [_Widget, _TemplatedMixin, _KeyNavContainer], { // summary: - // A line item in a Menu Widget - - // Make 3 columns - // icon, label, and expand arrow (BiDi-dependent) indicating sub-menu - templateString: dojo.cache("dijit", "templates/MenuItem.html", "<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" role=\"menuitem\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" role=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitMenuItemIcon\" dojoAttachPoint=\"iconNode\"/>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojoAttachPoint=\"containerNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" dojoAttachPoint=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" role=\"presentation\">\n\t\t<div dojoAttachPoint=\"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"), + // A Toolbar widget, used to hold things like `dijit.Editor` buttons - attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, { - label: { node: "containerNode", type: "innerHTML" }, - iconClass: { node: "iconNode", type: "class" } - }), + templateString: + '<div class="dijit" role="toolbar" tabIndex="${tabIndex}" data-dojo-attach-point="containerNode">' + + '</div>', - baseClass: "dijitMenuItem", + baseClass: "dijitToolbar", - // label: String - // Menu text - label: '', + postCreate: function(){ + this.inherited(arguments); - // iconClass: String - // Class to apply to DOMNode to make it display an icon. - iconClass: "", + this.connectKeyNavHandlers( + this.isLeftToRight() ? [keys.LEFT_ARROW] : [keys.RIGHT_ARROW], + this.isLeftToRight() ? [keys.RIGHT_ARROW] : [keys.LEFT_ARROW] + ); + } + }); +}); - // 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: "", +}, +'dijit/layout/StackContainer':function(){ +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/_base/kernel", // kernel.isAsync + "dojo/_base/lang", // lang.extend + "dojo/ready", + "dojo/topic", // publish + "../registry", // registry.byId + "../_WidgetBase", + "./_LayoutWidget", + "dojo/i18n!../nls/common" +], function(array, cookie, declare, domClass, kernel, lang, ready, topic, + registry, _WidgetBase, _LayoutWidget){ - // disabled: Boolean - // If true, the menu item is disabled. - // If false, the menu item is enabled. - disabled: false, +/*===== +var _WidgetBase = dijit._WidgetBase; +var _LayoutWidget = dijit.layout._LayoutWidget; +var StackController = dijit.layout.StackController; +=====*/ - _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); - } - }, +// module: +// dijit/layout/StackContainer +// summary: +// A container that has multiple children, but shows only one child at a time. - buildRendering: function(){ - this.inherited(arguments); - var label = this.id+"_text"; - dojo.attr(this.containerNode, "id", label); - if(this.accelKeyNode){ - dojo.attr(this.accelKeyNode, "id", this.id + "_accel"); - label += " " + this.id + "_accel"; - } - dijit.setWaiState(this.domNode, "labelledby", label); - dojo.setSelectable(this.domNode, false); - }, +// Back compat w/1.6, remove for 2.0 +if(!kernel.isAsync){ + ready(0, function(){ + var requires = ["dijit/layout/StackController"]; + require(requires); // use indirection so modules not rolled into a build + }); +} - _onHover: function(){ - // summary: - // Handler when mouse is moved onto menu item - // tags: - // protected - this.getParent().onItemHover(this); - }, +// These arguments can be specified for the children of a StackContainer. +// 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.) +lang.extend(_WidgetBase, { + // selected: Boolean + // Parameter for children of `dijit.layout.StackContainer` or subclasses. + // Specifies that this widget should be the initially displayed pane. + // Note: to change the selected child use `dijit.layout.StackContainer.selectChild` + selected: false, - _onUnhover: function(){ - // summary: - // Handler when mouse is moved off of menu item, - // possibly to a child menu, or maybe to a sibling - // menuitem or somewhere else entirely. - // tags: - // protected - - // if we are unhovering the currently selected item - // then unselect it - this.getParent().onItemUnhover(this); + // closable: Boolean + // Parameter for children of `dijit.layout.StackContainer` or subclasses. + // True if user can close (destroy) this child, such as (for example) clicking the X on the tab. + closable: false, - // When menu is hidden (collapsed) due to clicking a MenuItem and having it execute, - // FF and IE don't generate an onmouseout event for the MenuItem. - // So, help out _CssStateMixin in this case. - this._set("hovering", false); - }, + // iconClass: String + // Parameter for children of `dijit.layout.StackContainer` or subclasses. + // CSS Class specifying icon to use in label associated with this pane. + iconClass: "dijitNoIcon", - _onClick: function(evt){ - // summary: - // Internal handler for click events on MenuItem. - // tags: - // private - this.getParent().onItemClick(this, evt); - dojo.stopEvent(evt); - }, + // showTitle: Boolean + // Parameter for children of `dijit.layout.StackContainer` or subclasses. + // When true, display title of this widget as tab label etc., rather than just using + // icon specified in iconClass + showTitle: true +}); - onClick: function(/*Event*/ evt){ - // summary: - // User defined function to handle clicks - // tags: - // callback - }, +return 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. - focus: function(){ - // summary: - // Focus on this MenuItem - try{ - if(dojo.isIE == 8){ - // needed for IE8 which won't scroll TR tags into view on focus yet calling scrollIntoView creates flicker (#10275) - this.containerNode.focus(); - } - dijit.focus(this.focusNode); - }catch(e){ - // this throws on IE (at least) in some scenarios - } - }, + // doLayout: Boolean + // If true, change the size of my currently displayed child to match my size + doLayout: true, - _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); + // persist: Boolean + // Remembers the selected child across sessions + persist: false, - this.inherited(arguments); - }, + baseClass: "dijitStackContainer", - _setSelected: function(selected){ - // summary: - // Indicate that this node is the currently selected one - // tags: - // private +/*===== + // selectedChildWidget: [readonly] dijit._Widget + // References the currently selected child widget, if any. + // Adjust selected child with selectChild() method. + selectedChildWidget: null, +=====*/ - /*** - * 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() - */ + buildRendering: function(){ + this.inherited(arguments); + domClass.add(this.domNode, "dijitLayoutContainer"); + this.containerNode.setAttribute("role", "tabpanel"); + }, - dojo.toggleClass(this.domNode, "dijitMenuItemSelected", selected); - }, + postCreate: function(){ + this.inherited(arguments); + this.connect(this.domNode, "onkeypress", this._onKeyPress); + }, - setLabel: function(/*String*/ content){ - // summary: - // Deprecated. Use set('label', ...) instead. - // tags: - // deprecated - dojo.deprecated("dijit.MenuItem.setLabel() is deprecated. Use set('label', ...) instead.", "", "2.0"); - this.set("label", content); - }, + startup: function(){ + if(this._started){ return; } - setDisabled: function(/*Boolean*/ disabled){ - // summary: - // Deprecated. Use set('disabled', bool) instead. - // tags: - // deprecated - dojo.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. + var children = this.getChildren(); - dijit.setWaiState(this.focusNode, '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. + // Setup each page panel to be initially hidden + array.forEach(children, this._setupChild, this); - this.accelKeyNode.style.display=value?"":"none"; - this.accelKeyNode.innerHTML=value; - //have to use colSpan to make it work in IE - dojo.attr(this.containerNode,'colSpan',value?"1":"2"); - - this._set("accelKey", value); + // 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; } - }); - -} - -if(!dojo._hasResource["dijit.PopupMenuItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.PopupMenuItem"] = true; -dojo.provide("dijit.PopupMenuItem"); - - - -dojo.declare("dijit.PopupMenuItem", - dijit.MenuItem, - { - _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 dojoType="dijit.PopupMenuItem"> - // | <span>pick me</span> - // | <popup> ... </popup> - // | </div> - // tags: - // protected - - if(this.srcNodeRef){ - var nodes = dojo.query("*", this.srcNodeRef); - dijit.PopupMenuItem.superclass._fillContent.call(this, 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 dojo.doc.body. - if(!this.popup){ - var node = dojo.query("[widgetId]", this.dropDownContainer)[0]; - this.popup = dijit.byNode(node); - } - dojo.body().appendChild(this.popup.domNode); - this.popup.startup(); + // 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}); - this.popup.domNode.style.display="none"; - if(this.arrowWrapper){ - dojo.style(this.arrowWrapper, "visibility", ""); - } - dijit.setWaiState(this.focusNode, "haspopup", "true"); - }, + // 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); + }, - destroyDescendants: function(){ - 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(); - } - delete this.popup; + resize: function(){ + // 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); } - }); + this.inherited(arguments); + }, -} + _setupChild: function(/*dijit._Widget*/ child){ + // Overrides _LayoutWidget._setupChild() -if(!dojo._hasResource["dijit.CheckedMenuItem"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.CheckedMenuItem"] = true; -dojo.provide("dijit.CheckedMenuItem"); + 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 = ""; + }, -dojo.declare("dijit.CheckedMenuItem", - dijit.MenuItem, - { - // summary: - // A checkbox-like menu item for toggling on and off + addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){ + // Overrides _Container.addChild() to do layout and publish events - templateString: dojo.cache("dijit", "templates/CheckedMenuItem.html", "<tr class=\"dijitReset dijitMenuItem\" dojoAttachPoint=\"focusNode\" role=\"menuitemcheckbox\" tabIndex=\"-1\"\n\t\tdojoAttachEvent=\"onmouseenter:_onHover,onmouseleave:_onUnhover,ondijitclick:_onClick\">\n\t<td class=\"dijitReset dijitMenuItemIconCell\" role=\"presentation\">\n\t\t<img src=\"${_blankGif}\" alt=\"\" class=\"dijitMenuItemIcon dijitCheckedMenuItemIcon\" dojoAttachPoint=\"iconNode\"/>\n\t\t<span class=\"dijitCheckedMenuItemIconChar\">✓</span>\n\t</td>\n\t<td class=\"dijitReset dijitMenuItemLabel\" colspan=\"2\" dojoAttachPoint=\"containerNode,labelNode\"></td>\n\t<td class=\"dijitReset dijitMenuItemAccelKey\" style=\"display: none\" dojoAttachPoint=\"accelKeyNode\"></td>\n\t<td class=\"dijitReset dijitMenuArrowCell\" role=\"presentation\"> </td>\n</tr>\n"), + this.inherited(arguments); - // 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. - dojo.toggleClass(this.domNode, "dijitCheckedMenuItemChecked", checked); - dijit.setWaiState(this.domNode, "checked", checked); - this._set("checked", checked); - }, + if(this._started){ + topic.publish(this.id+"-addChild", child, insertIndex); // publish - onChange: function(/*Boolean*/ checked){ - // summary: - // User defined function to handle check/uncheck events - // tags: - // callback - }, + // 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(); - _onClick: function(/*Event*/ e){ - // summary: - // Clicking this item just toggles its state - // tags: - // private - if(!this.disabled){ - this.set("checked", !this.checked); - this.onChange(this.checked); + // if this is the first child, then select it + if(!this.selectedChildWidget){ + this.selectChild(child); } - this.inherited(arguments); } - }); + }, -} + removeChild: function(/*dijit._Widget*/ page){ + // Overrides _Container.removeChild() to do layout and publish events -if(!dojo._hasResource["dijit.MenuSeparator"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.MenuSeparator"] = true; -dojo.provide("dijit.MenuSeparator"); + 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(); + } + }, -dojo.declare("dijit.MenuSeparator", - [dijit._Widget, dijit._Templated, dijit._Contained], - { + selectChild: function(/*dijit._Widget|String*/ page, /*Boolean*/ animate){ // summary: - // A line between two menu items - - templateString: dojo.cache("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>\n"), + // Show the given widget (which must be one of my children) + // page: + // Reference to child widget or id of child widget - buildRendering: function(){ - this.inherited(arguments); - dojo.setSelectable(this.domNode, false); - }, + page = registry.byId(page); - isFocusable: function(){ - // summary: - // Override to always return false - // tags: - // protected + 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 - return false; // Boolean + if(this.persist){ + cookie(this.id + "_selectedChild", this.selectedChildWidget.id); + } } - }); - -} - -if(!dojo._hasResource["dijit.Menu"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.Menu"] = true; -dojo.provide("dijit.Menu"); - - - - - - - - - - -// "dijit/MenuItem", "dijit/PopupMenuItem", "dijit/CheckedMenuItem", "dijit/MenuSeparator" for Back-compat (TODO: remove in 2.0) -dojo.declare("dijit._MenuBase", - [dijit._Widget, dijit._Templated, dijit._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, - - startup: function(){ - if(this._started){ return; } - - dojo.forEach(this.getChildren(), function(child){ child.startup(); }); - this.startupKeyNavChildren(); - - this.inherited(arguments); + return d; // If child has an href, promise that fires when the child's href finishes loading }, - onExecute: function(){ + _transition: function(newWidget, oldWidget /*===== , animate =====*/){ // 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. + // Hide the old widget and display the new widget. + // Subclasses should override this. + // newWidget: dijit._Widget + // The newly selected widget. + // oldWidget: dijit._Widget + // The previously selected widget. + // animate: Boolean + // Used by AccordionContainer to turn on/off slide effect. // tags: - // protected + // 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 }, - onCancel: function(/*Boolean*/ closeAll){ + _adjacent: function(/*Boolean*/ forward){ // 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 + // Gets the next/previous child widget in this container from the current selection. + var children = this.getChildren(); + var index = array.indexOf(children, this.selectedChildWidget); + index += forward ? 1 : children.length - 1; + return children[ index % children.length ]; // dijit._Widget }, - _moveToPopup: function(/*Event*/ evt){ + forward: function(){ // 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.focusedChild._onClick(evt); - }else{ - var topMenu = this._getTopMenu(); - if(topMenu && topMenu._isMenuBar){ - topMenu.focusNext(); - } - } + // Advance to next page. + return this.selectChild(this._adjacent(true), true); }, - _onPopupHover: function(/*Event*/ evt){ + back: function(){ // 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); - } + // Go back to previous page. + return this.selectChild(this._adjacent(false), true); }, - onItemHover: function(/*MenuItem*/ item){ - // summary: - // Called when cursor is over a MenuItem. - // tags: - // protected + _onKeyPress: function(e){ + topic.publish(this.id+"-containerKeyPress", { e: e, page: this}); // publish + }, - // 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 = setTimeout(dojo.hitch(this, "_openPopup"), this.popupDelay); + 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(); } } - // 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; }, - _onChildBlur: function(item){ + _showChild: function(/*dijit._Widget*/ page){ // 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 = setTimeout(function(){ - itemPopup._pendingClose_timer = null; - if(itemPopup.parentMenu){ - itemPopup.parentMenu.currentPopup = null; - } - dijit.popup.close(itemPopup); // this calls onClose - }, this.popupDelay); - } - }, + // 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); - onItemUnhover: function(/*MenuItem*/ item){ - // summary: - // Callback fires when mouse exits a MenuItem - // tags: - // protected + domClass.replace(page.domNode, "dijitVisible", "dijitHidden"); - if(this.isActive){ - this._stopPopupTimer(); - } - if(this._hoveredChild == item){ this._hoveredChild = null; } + return (page._onShow && page._onShow()) || true; }, - _stopPopupTimer: function(){ + _hideChild: function(/*dijit._Widget*/ page){ // summary: - // Cancels the popup timer because the user has stop hovering - // on the MenuItem, etc. - // tags: - // private - if(this.hover_timer){ - clearTimeout(this.hover_timer); - this.hover_timer = null; - } - }, + // 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"); - _stopPendingCloseTimer: function(/*dijit._Widget*/ popup){ - // summary: - // Cancels the pending-close timer because the close has been preempted - // tags: - // private - if(popup._pendingClose_timer){ - clearTimeout(popup._pendingClose_timer); - popup._pendingClose_timer = null; - } + page.onHide && page.onHide(); }, - _stopFocusTimer: function(){ + closeChild: function(/*dijit._Widget*/ page){ // summary: - // Cancels the pending-focus timer because the menu was closed before focus occured + // Callback when user clicks the [X] to remove a page. + // If onClose() returns true then remove and destroy the child. // tags: // private - if(this._focus_timer){ - clearTimeout(this._focus_timer); - this._focus_timer = null; + var remove = page.onClose(this, page); + if(remove){ + this.removeChild(page); + // makes sure we can clean up executeScripts in ContentPane onUnLoad + page.destroyRecursive(); } }, - _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._Widget*/ item, /*Event*/ evt){ - // summary: - // Handle clicks on an item. - // tags: - // private + 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; + } +}); - // 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); +}, +'dojo/regexp':function(){ +define("dojo/regexp", ["./_base/kernel", "./_base/lang"], function(dojo, lang) { + // module: + // dojo/regexp + // summary: + // TODOC - if(item.disabled){ return false; } +lang.getObject("regexp", true, dojo); - if(item.popup){ - this._openPopup(); - }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(evt); - } - }, +/*===== +dojo.regexp = { + // summary: Regular expressions and Builder resources +}; +=====*/ - _openPopup: function(){ - // summary: - // Open the popup to the side of/underneath the current menu item - // tags: - // protected +dojo.regexp.escapeString = function(/*String*/str, /*String?*/except){ + // summary: + // Adds escape sequences for special characters in regular expressions + // except: + // a String with special characters to be left unescaped - 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){ return; } - if(this.currentPopup){ - this._stopPendingCloseTimer(this.currentPopup); - dijit.popup.close(this.currentPopup); + return str.replace(/([\.$?*|{}\(\)\[\]\\\/\+^])/g, function(ch){ + if(except && except.indexOf(ch) != -1){ + return ch; } - popup.parentMenu = this; - popup.from_item = from_item; // helps finding the parent item that should be focused for this popup - var self = this; - dijit.popup.open({ - parent: this, - popup: popup, - around: from_item.domNode, - orient: this._orient || (this.isLeftToRight() ? - {'TR': 'TL', 'TL': 'TR', 'BR': 'BL', 'BL': 'BR'} : - {'TL': 'TR', 'TR': 'TL', 'BL': 'BR', 'BR': 'BL'}), - 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: dojo.hitch(this, "_cleanUp") - }); - - this.currentPopup = popup; - // detect mouseovers to handle lazy mouse movements that temporarily focus other menu items - popup.connect(popup.domNode, "onmouseenter", dojo.hitch(self, "_onPopupHover")); // cleaned up when the popped-up widget is destroyed on close + return "\\" + ch; + }); // String +}; - if(popup.focus){ - // If user is opening the popup via keyboard (right arrow, or down arrow for MenuBar), - // if the cursor happens to collide with the popup, it will generate an onmouseover event - // even though the mouse wasn't moved. Use a setTimeout() to call popup.focus so that - // our focus() call overrides the onmouseover event, rather than vice-versa. (#8742) - popup._focus_timer = setTimeout(dojo.hitch(popup, function(){ - this._focus_timer = null; - this.focus(); - }), 0); - } - }, +dojo.regexp.buildGroupRE = function(/*Object|Array*/arr, /*Function*/re, /*Boolean?*/nonCapture){ + // summary: + // Builds a regular expression that groups subexpressions + // description: + // A utility function used by some of the RE generators. The + // subexpressions are constructed by the function, re, in the second + // parameter. re builds one subexpression for each elem in the array + // a, in the first parameter. Returns a string for a regular + // expression that groups all the subexpressions. + // arr: + // A single value or an array of values. + // re: + // A function. Takes one parameter and converts it to a regular + // expression. + // nonCapture: + // If true, uses non-capturing match, otherwise matches are retained + // by regular expression. Defaults to false - _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; - dojo.replaceClass(this.domNode, "dijitMenuActive", "dijitMenuPassive"); - }, + // case 1: a is a single value. + if(!(arr instanceof Array)){ + return re(arr); // String + } - 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 + // case 2: a is an array + var b = []; + for(var i = 0; i < arr.length; i++){ + // convert each elem to a RE + b.push(re(arr[i])); + } - this.isShowingNow = true; - this._markActive(); - }, + // join the REs as alternatives in a RE group. + return dojo.regexp.group(b.join("|"), nonCapture); // String +}; - _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 - dojo.replaceClass(this.domNode, "dijitMenuPassive", "dijitMenuActive"); - }, +dojo.regexp.group = function(/*String*/expression, /*Boolean?*/nonCapture){ + // summary: + // adds group match to expression + // nonCapture: + // If true, uses non-capturing match, otherwise matches are retained + // by regular expression. + return "(" + (nonCapture ? "?:":"") + expression + ")"; // String +}; - 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 +return dojo.regexp; +}); - this._stopFocusTimer(); - this._markInactive(); - this.isShowingNow = false; - this.parentMenu = null; - }, +}, +'dijit/form/_FormMixin':function(){ +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/window" // winUtils.scrollIntoView +], function(array, declare, kernel, lang, winUtils){ + + // module: + // dijit/form/_FormMixin + // 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) - _closeChild: function(){ + return declare("dijit.form._FormMixin", null, { // summary: - // Called when submenu is clicked or focus is lost. Close hierarchy of menus. - // tags: - // private - this._stopPopupTimer(); + // 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 - var fromItem = this.focusedChild && this.focusedChild.from_item; + /*===== + // 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"] } + =====*/ - if(this.currentPopup){ - // If focus is on my child menu then move focus to me, - // because IE doesn't like it when you display:none a node with focus - if(dijit._curFocus && dojo.isDescendant(dijit._curFocus, this.currentPopup.domNode)){ - this.focusedChild.focusNode.focus(); - } - // Close all popups that are open and descendants of this menu - dijit.popup.close(this.currentPopup); - this.currentPopup = null; - } + // 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: "", - if(this.focusedChild){ // unhighlight the focused item - this.focusedChild._setSelected(false); - this.focusedChild._onUnhover(); - this.focusedChild = null; - } - }, + // 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}, ...]) + // + // - _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._hoveredChild._onUnhover(); // any previous mouse movement is trumped by focus selection - } - }, + _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; + }, - _onBlur: function(){ - // summary: - // Called when focus is moved away from this Menu and it's submenus. - // tags: - // protected - this._cleanUp(); - this.inherited(arguments); - }, + reset: function(){ + array.forEach(this._getDescendantFormWidgets(), function(widget){ + if(widget.reset){ + widget.reset(); + } + }); + }, - _cleanUp: function(){ - // summary: - // Called when the user is done with this menu. Closes hierarchy of menus. - // tags: - // private + 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; }); + }, - 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(); - } - } -}); + 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')) -dojo.declare("dijit.Menu", - dijit._MenuBase, - { - // summary - // A context menu you can assign to multiple elements + // 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); + }); - // TODO: most of the code in here is just for context menu (right-click menu) - // support. In retrospect that should have been a separate class (dijit.ContextMenu). - // Split them for 2.0 + 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 - constructor: function(){ - this._bindings = []; - }, + 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]); + }); + } + } - templateString: dojo.cache("dijit", "templates/Menu.html", "<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" role=\"menu\" tabIndex=\"${tabIndex}\" dojoAttachEvent=\"onkeypress:_onKeyPress\" cellspacing=\"0\">\n\t<tbody class=\"dijitReset\" dojoAttachPoint=\"containerNode\"></tbody>\n</table>\n"), + /*** + * TODO: code for plain input boxes (this shouldn't run for inputs that are part of widgets) - baseClass: "dijitMenu", + 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 - // 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: [], + nameIndex=parseInt(nameA[1]); + if(typeof(myObj[nameA[0]][nameIndex]) == "undefined"){ + myObj[nameA[0]][nameIndex] = { }; + } + myObj=myObj[nameA[0]][nameIndex]; + continue; + } // repeater support ends - // 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, + if(typeof(myObj[p]) == "undefined"){ + myObj=undefined; + break; + }; + myObj=myObj[p]; + } - // leftClickToOpen: [const] Boolean - // If true, menu will open on left click instead of right click, similiar to a file menu. - leftClickToOpen: false, + if(typeof(myObj) == "undefined"){ + return; // like "continue" + } + if(typeof(myObj[name]) == "undefined" && this.ignoreNullValues){ + return; // like "continue" + } - // refocus: Boolean - // When this menu closes, re-focus the element which had focus before it was opened. - refocus: true, + // TODO: widget values (just call set('value', ...) on the widget) - postCreate: function(){ - if(this.contextMenuForWindow){ - this.bindDomNode(dojo.body()); - }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) - dojo.forEach(this.targetNodeIds, this.bindDomNode, this); - } - var k = dojo.keys, l = this.isLeftToRight(); - this._openSubMenuKey = l ? k.RIGHT_ARROW : k.LEFT_ARROW; - this._closeSubMenuKey = l ? k.LEFT_ARROW : k.RIGHT_ARROW; - this.connectKeyNavHandlers([k.UP_ARROW], [k.DOWN_ARROW]); - }, + // 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; + } + }); + */ - _onKeyPress: function(/*Event*/ evt){ - // summary: - // Handle keyboard based menu navigation. - // tags: - // protected + // Note: no need to call this._set("value", ...) as the child updates will trigger onChange events + // which I am monitoring. + }, - if(evt.ctrlKey || evt.altKey){ return; } + 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: - switch(evt.charOrCode){ - case this._openSubMenuKey: - this._moveToPopup(evt); - dojo.stopEvent(evt); - break; - case this._closeSubMenuKey: - if(this.parentMenu){ - if(this.parentMenu._isMenuBar){ - this.parentMenu.focusPrev(); + // 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 setTimeout(..., 0) 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{ - this.onCancel(false); + // 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{ - dojo.stopEvent(evt); + 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); + } } - break; - } - }, + }); - // thanks burstlib! - _iframeContentWindow: function(/* HTMLIFrameElement */iframe_el){ - // summary: - // Returns the window reference of the passed iframe - // tags: - // private - var win = dojo.window.get(this._iframeContentDocument(iframe_el)) || - // Moz. TODO: is this available when defaultView isn't? - this._iframeContentDocument(iframe_el)['__parent__'] || - (iframe_el.name && dojo.doc.frames[iframe_el.name]) || null; - return win; // Window - }, + /*** + * 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 - _iframeContentDocument: function(/* HTMLIFrameElement */iframe_el){ - // summary: - // Returns a reference to the document object inside iframe_el - // tags: - // protected - var doc = iframe_el.contentDocument // W3 - || (iframe_el.contentWindow && iframe_el.contentWindow.document) // IE - || (iframe_el.name && dojo.doc.frames[iframe_el.name] && dojo.doc.frames[iframe_el.name].document) - || null; - return doc; // HTMLDocument - }, + if(nameA.length == 1){ + myObj=myObj[nameA[0]]; + }else{ + myObj=myObj[nameA[0]][nameIndex]; + } // if + } // for - bindDomNode: function(/*String|DomNode*/ node){ - // summary: - // Attach menu to given node - node = dojo.byId(node); + 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; + }, - var cn; // Connect node + isValid: function(){ + // summary: + // Returns true if all of the widgets are valid. + // Deprecated, will be removed in 2.0. Use get("state") instead. - // 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, - win = this._iframeContentWindow(iframe); - cn = dojo.withGlobal(win, dojo.body); - }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 == dojo.body() ? dojo.doc.documentElement : node); - } + 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. + }, - // "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. - dojo.attr(node, "_dijitMenu" + this.id, this._bindings.push(binding)); + _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") || ""; + }); - // 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 = dojo.hitch(this, function(cn){ - return [ - // TODO: when leftClickToOpen is true then shouldn't space/enter key trigger the menu, - // rather than shift-F10? - dojo.connect(cn, this.leftClickToOpen ? "onclick" : "oncontextmenu", this, function(evt){ - // Schedule context menu to be opened unless it's already been scheduled from onkeydown handler - dojo.stopEvent(evt); - this._scheduleOpen(evt.target, iframe, {x: evt.pageX, y: evt.pageY}); - }), - dojo.connect(cn, "onkeydown", this, function(evt){ - if(evt.shiftKey && evt.keyCode == dojo.keys.F10){ - dojo.stopEvent(evt); - this._scheduleOpen(evt.target, iframe); // no coords - open near target node - } - }) - ]; - }); - binding.connects = cn ? doConnects(cn) : []; + return array.indexOf(states, "Error") >= 0 ? "Error" : + array.indexOf(states, "Incomplete") >= 0 ? "Incomplete" : ""; + }, - 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 dojo.connect(), see #9609. + disconnectChildren: function(){ + // summary: + // Remove connections to monitor changes to children's value, error state, and disabled state, + // in order to update Form.value and Form.state. + array.forEach(this._childConnections || [], lang.hitch(this, "disconnect")); + array.forEach(this._childWatches || [], function(w){ w.unwatch(); }); + }, - binding.onloadHandler = dojo.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 + connectChildren: function(/*Boolean*/ inStartup){ + // summary: + // Setup connections to monitor changes to children's value, error state, and disabled state, + // in order to update Form.value and Form.state. + // + // 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. - var win = this._iframeContentWindow(iframe); - cn = dojo.withGlobal(win, dojo.body); - binding.connects = doConnects(cn); - }); - if(iframe.addEventListener){ - iframe.addEventListener("load", binding.onloadHandler, false); - }else{ - iframe.attachEvent("onload", binding.onloadHandler); - } - } - }, + var _this = this; - unBindDomNode: function(/*String|DomNode*/ nodeName){ - // summary: - // Detach menu from given node + // Remove old connections, if any + this.disconnectChildren(); - var node; - try{ - node = dojo.byId(nodeName); - }catch(e){ - // On IE the dojo.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; - } + this._descendants = this._getDescendantFormWidgets(); - // node["_dijitMenu" + this.id] contains index(+1) into my _bindings[] array - var attrName = "_dijitMenu" + this.id; - if(node && dojo.hasAttr(node, attrName)){ - var bid = dojo.attr(node, attrName)-1, b = this._bindings[bid]; - dojo.forEach(b.connects, dojo.disconnect); + // (Re)set this.value and this.state. Send watch() notifications but not on startup. + var set = inStartup ? function(name, val){ _this[name] = val; } : lang.hitch(this, "_set"); + set("value", this.get("value")); + set("state", this._getState()); - // 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); - } - } + // Monitor changes to error state and disabled state in order to update + // Form.state + var conns = (this._childConnections = []), + watches = (this._childWatches = []); + array.forEach(array.filter(this._descendants, + function(item){ return item.validate; } + ), + function(widget){ + // We are interested in whenever the widget changes validity state - or + // whenever the disabled attribute on that widget is changed. + array.forEach(["state", "disabled"], function(attr){ + watches.push(widget.watch(attr, function(){ + _this.set("state", _this._getState()); + })); + }); + }); - dojo.removeAttr(node, attrName); - delete this._bindings[bid]; - } - }, + // And monitor calls to child.onChange so we can update this.value + var onChange = function(){ + // summary: + // Called when child's value or disabled state changes - _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 dojo.stopEvent(e). (Shift-F10 on windows doesn't generate the - // oncontextmenu event.) + // Use setTimeout() 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(_this._onChangeDelayTimer){ + clearTimeout(_this._onChangeDelayTimer); + } + _this._onChangeDelayTimer = setTimeout(function(){ + delete _this._onChangeDelayTimer; + _this._set("value", _this.get("value")); + }, 10); + }; + array.forEach( + array.filter(this._descendants, function(item){ return item.onChange; } ), + function(widget){ + // When a child widget's value changes, + // the efficient thing to do is to just update that one attribute in this.value, + // but that gets a little complicated when a checkbox is checked/unchecked + // since this.value["checkboxName"] contains an array of all the checkboxes w/the same name. + // Doing simple thing for now. + conns.push(_this.connect(widget, "onChange", onChange)); - if(!this._openTimer){ - this._openTimer = setTimeout(dojo.hitch(this, function(){ - delete this._openTimer; - this._openMyself({ - target: target, - iframe: iframe, - coords: coords - }); - }), 1); - } - }, + // Disabling/enabling a child widget should remove it's value from this.value. + // Again, this code could be more efficient, doing simple thing for now. + watches.push(widget.watch("disabled", onChange)); + } + ); + }, - _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). + startup: function(){ + this.inherited(arguments); - var target = args.target, - iframe = args.iframe, - coords = args.coords; + // Initialize value and valid/invalid state tracking. Needs to be done in startup() + // so that children are initialized. + this.connectChildren(true); - // 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 od = target.ownerDocument, - ifc = dojo.position(iframe, true), - win = this._iframeContentWindow(iframe), - scroll = dojo.withGlobal(win, "_docScroll", dojo); - - var cs = dojo.getComputedStyle(iframe), - tp = dojo._toPixelValue, - left = (dojo.isIE && dojo.isQuirks ? 0 : tp(iframe, cs.paddingLeft)) + (dojo.isIE && dojo.isQuirks ? tp(iframe, cs.borderLeftWidth) : 0), - top = (dojo.isIE && dojo.isQuirks ? 0 : tp(iframe, cs.paddingTop)) + (dojo.isIE && dojo.isQuirks ? tp(iframe, cs.borderTopWidth) : 0); + // Make state change call onValidStateChange(), will be removed in 2.0 + this.watch("state", function(attr, oldVal, newVal){ this.onValidStateChange(newVal == ""); }); + }, - coords.x += ifc.x + left - scroll.x; - coords.y += ifc.y + top - scroll.y; - } - }else{ - coords = dojo.position(target, true); - coords.x += 10; - coords.y += 10; + destroy: function(){ + this.disconnectChildren(); + this.inherited(arguments); } - var self=this; - var savedFocus = dijit.getFocus(this); - function closeAndRestoreFocus(){ - // user has clicked on a menu or popup - if(self.refocus){ - dijit.focus(savedFocus); - } - dijit.popup.close(self); - } - dijit.popup.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 - dijit.popup.close(this); - // don't try to restore focus; user has clicked another part of the screen - // and set focus there - }; - }, +}, +'dijit/DropDownMenu':function(){ +require({cache:{ +'url:dijit/templates/Menu.html':"<table class=\"dijit dijitMenu dijitMenuPassive dijitReset dijitMenuTable\" role=\"menu\" tabIndex=\"${tabIndex}\" 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){ - uninitialize: function(){ - dojo.forEach(this._bindings, function(b){ if(b){ this.unBindDomNode(b.node); } }, this); - this.inherited(arguments); - } -} -); +/*===== + var _MenuBase = dijit._MenuBase; + var _OnDijitClickMixin = dijit._OnDijitClickMixin; +=====*/ -} + // module: + // dijit/DropDownMenu + // summary: + // dijit.DropDownMenu widget -if(!dojo._hasResource["dijit.form.Select"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.Select"] = true; -dojo.provide("dijit.form.Select"); + return declare("dijit.DropDownMenu", [_MenuBase, _OnDijitClickMixin], { + // summary: + // A menu, without features for context menu (Meaning, drop down menu) + templateString: template, + baseClass: "dijitMenu", + postCreate: function(){ + 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; + } + } + }); +}); -dojo.declare("dijit.form._SelectMenu", dijit.Menu, { +}, +'dojo/data/util/simpleFetch':function(){ +define("dojo/data/util/simpleFetch", ["dojo/_base/lang", "dojo/_base/window", "./sorter"], + function(lang, winUtil, sorter) { + // module: + // dojo/data/util/simpleFetch // summary: - // An internally-used menu for dropdown that allows us a vertical scrollbar - 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 = dojo.create("div", {style: {overflowX: "hidden", overflowY: "scroll"}})); - if(o.parentNode){ - o.parentNode.replaceChild(n, o); - } - dojo.removeClass(o, "dijitMenuTable"); - n.className = o.className + " dijitSelectMenu"; - o.className = "dijitReset dijitMenuTable"; - dijit.setWaiRole(o,"listbox"); - dijit.setWaiRole(n,"presentation"); - n.appendChild(o); - }, + // TODOC - postCreate: function(){ - // summary: - // stop mousemove from selecting text on IE to be consistent with other browsers +var simpleFetch = lang.getObject("dojo.data.util.simpleFetch", true); - this.inherited(arguments); +simpleFetch.fetch = function(/* Object? */ request){ + // summary: + // The simpleFetch mixin is designed to serve as a set of function(s) that can + // be mixed into other datastore implementations to accelerate their development. + // The simpleFetch mixin should work well for any datastore that can respond to a _fetchItems() + // call by returning an array of all the found items that matched the query. The simpleFetch mixin + // is not designed to work for datastores that respond to a fetch() call by incrementally + // loading items, or sequentially loading partial batches of the result + // set. For datastores that mixin simpleFetch, simpleFetch + // implements a fetch method that automatically handles eight of the fetch() + // arguments -- onBegin, onItem, onComplete, onError, start, count, sort and scope + // The class mixing in simpleFetch should not implement fetch(), + // but should instead implement a _fetchItems() method. The _fetchItems() + // method takes three arguments, the keywordArgs object that was passed + // to fetch(), a callback function to be called when the result array is + // available, and an error callback to be called if something goes wrong. + // The _fetchItems() method should ignore any keywordArgs parameters for + // start, count, onBegin, onItem, onComplete, onError, sort, and scope. + // The _fetchItems() method needs to correctly handle any other keywordArgs + // parameters, including the query parameter and any optional parameters + // (such as includeChildren). The _fetchItems() method should create an array of + // result items and pass it to the fetchHandler along with the original request object + // -- or, the _fetchItems() method may, if it wants to, create an new request object + // with other specifics about the request that are specific to the datastore and pass + // that as the request object to the handler. + // + // For more information on this specific function, see dojo.data.api.Read.fetch() + request = request || {}; + if(!request.store){ + request.store = this; + } + var self = this; - this.connect(this.domNode, "onmousemove", dojo.stopEvent); - }, + var _errorHandler = function(errorData, requestObject){ + if(requestObject.onError){ + var scope = requestObject.scope || winUtil.global; + requestObject.onError.call(scope, errorData, requestObject); + } + }; - 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){ - dojo.marginBox(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 _fetchHandler = function(items, requestObject){ + var oldAbortFunction = requestObject.abort || null; + var aborted = false; + + var startIndex = requestObject.start?requestObject.start:0; + var endIndex = (requestObject.count && (requestObject.count !== Infinity))?(startIndex + requestObject.count):items.length; + + requestObject.abort = function(){ + aborted = true; + if(oldAbortFunction){ + oldAbortFunction.call(requestObject); } - } - } -}); + }; -dojo.declare("dijit.form.Select", [dijit.form._FormSelectWidget, dijit._HasDropDown], { - // summary: - // This is a "styleable" select box - it is basically a DropDownButton which - // can take a <select> as its input. + var scope = requestObject.scope || winUtil.global; + if(!requestObject.store){ + requestObject.store = self; + } + if(requestObject.onBegin){ + requestObject.onBegin.call(scope, items.length, requestObject); + } + if(requestObject.sort){ + items.sort(sorter.createSortFunction(requestObject.sort, self)); + } + if(requestObject.onItem){ + for(var i = startIndex; (i < items.length) && (i < endIndex); ++i){ + var item = items[i]; + if(!aborted){ + requestObject.onItem.call(scope, item, requestObject); + } + } + } + if(requestObject.onComplete && !aborted){ + var subset = null; + if(!requestObject.onItem){ + subset = items.slice(startIndex, endIndex); + } + requestObject.onComplete.call(scope, subset, requestObject); + } + }; + this._fetchItems(request, _fetchHandler, _errorHandler); + return request; // Object +}; - baseClass: "dijitSelect", +return simpleFetch; +}); - templateString: dojo.cache("dijit.form", "templates/Select.html", "<table class=\"dijit dijitReset dijitInline dijitLeft\"\n\tdojoAttachPoint=\"_buttonNode,tableNode,focusNode\" cellspacing='0' cellpadding='0'\n\trole=\"combobox\" aria-haspopup=\"true\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" role=\"presentation\"\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\" dojoAttachPoint=\"containerNode,_popupStateNode\"></span\n\t\t\t><input type=\"hidden\" ${!nameAttrSetting} dojoAttachPoint=\"valueNode\" value=\"${value}\" aria-hidden=\"true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdojoAttachPoint=\"titleNode\" role=\"presentation\"\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></tr></tbody\n></table>\n"), +}, +'dijit/Menu':function(){ +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/_base/kernel", + "dojo/keys", // keys.F10 + "dojo/_base/lang", // lang.hitch + "dojo/on", + "dojo/_base/sniff", // has("ie"), has("quirks") + "dojo/_base/window", // win.body win.doc.documentElement win.doc.frames win.withGlobal + "dojo/window", // winUtils.get + "./popup", + "./DropDownMenu", + "dojo/ready" +], function(require, array, declare, event, dom, domAttr, domGeometry, domStyle, kernel, keys, lang, on, + has, win, winUtils, pm, DropDownMenu, ready){ - // attributeMap: Object - // Add in our style to be applied to the focus node - attributeMap: dojo.mixin(dojo.clone(dijit.form._FormSelectWidget.prototype.attributeMap),{style:"tableNode"}), +/*===== + var DropDownMenu = dijit.DropDownMenu; +=====*/ - // required: Boolean - // Can be true or false, default is false. - required: false, +// module: +// dijit/Menu +// summary: +// Includes dijit.Menu widget and base class dijit._MenuBase - // state: String - // Shows current state (ie, validation result) of input (Normal, Warning, or Error) - state: "", +// Back compat w/1.6, remove for 2.0 +if(!kernel.isAsync){ + ready(0, function(){ + var requires = ["dijit/MenuItem", "dijit/PopupMenuItem", "dijit/CheckedMenuItem", "dijit/MenuSeparator"]; + require(requires); // use indirection so modules not rolled into a build + }); +} - // message: String - // Currently displayed error/prompt message - message: "", +return declare("dijit.Menu", DropDownMenu, { + // summary: + // A context menu you can assign to multiple elements - // tooltipPosition: String[] - // See description of dijit.Tooltip.defaultPosition for details on this parameter. - tooltipPosition: [], + constructor: function(){ + this._bindings = []; + }, - // emptyLabel: string - // What to display in an "empty" dropdown - emptyLabel: " ", + // 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: [], - // _isLoaded: Boolean - // Whether or not we have been loaded - _isLoaded: false, + // 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, - // _childrenLoaded: Boolean - // Whether or not our children have been loaded - _childrenLoaded: false, + // leftClickToOpen: [const] Boolean + // If true, menu will open on left click instead of right click, similar to a file menu. + leftClickToOpen: 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 dijit.form._SelectMenu({id: this.id + "_menu"}); - dojo.addClass(this.dropDown.domNode, this.baseClass + "Menu"); - }, + // refocus: Boolean + // When this menu closes, re-focus the element which had focus before it was opened. + refocus: true, - _getMenuItemForOption: function(/*dijit.form.__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 dijit.MenuSeparator(); + postCreate: function(){ + if(this.contextMenuForWindow){ + this.bindDomNode(win.body()); }else{ - // Just a regular menu option - var click = dojo.hitch(this, "_setValueAttr", option); - var item = new dijit.MenuItem({ - option: option, - label: option.label || this.emptyLabel, - onClick: click, - disabled: option.disabled || false - }); - dijit.setWaiRole(item.focusNode, "listitem"); - return item; + // 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); }, - _addOptionItem: function(/*dijit.form.__SelectOption*/ option){ + // thanks burstlib! + _iframeContentWindow: function(/* HTMLIFrameElement */iframe_el){ // 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)); - } + // 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 }, - _getChildren: function(){ - if(!this.dropDown){ - return []; - } - return this.dropDown.getChildren(); + _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 }, - _loadChildren: function(/*Boolean*/ loadMenuItems){ + bindDomNode: function(/*String|DomNode*/ node){ // 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. + // Attach menu to given node + node = dom.byId(node); - 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) - dojo.forEach(this._getChildren(), function(child){ child.destroyRecursive(); }); - var item = new dijit.MenuItem({label: " "}); - this.dropDown.addChild(item); - } - }else{ - this._updateSelection(); - } + var cn; // Connect node - this._isLoaded = false; - this._childrenLoaded = true; + // 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.withGlobal(window, win.body); + }else{ - if(!this._loadingStore){ - // Don't call this if we are loading - since we will handle it later - this._setValueAttr(this.value); + // 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() ? win.doc.documentElement : node); } - }, - _setValueAttr: function(value){ - this.inherited(arguments); - dojo.attr(this.valueNode, "value", this.get("value")); - }, - _setDisplay: function(/*String*/ newDisplay){ - // summary: - // sets the display for the given value (or values) - var lbl = newDisplay || this.emptyLabel; - this.containerNode.innerHTML = '<span class="dijitReset dijitInline ' + this.baseClass + 'Label">' + lbl + '</span>'; - dijit.setWaiState(this.focusNode, "valuetext", lbl); - }, + // "binding" is the object to track our connection to the node (ie, the parameter to bindDomNode()) + var binding = { + node: node, + iframe: iframe + }; - validate: function(/*Boolean*/ isFocused){ - // summary: - // Called by oninit, onblur, and onkeypress. - // 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.isValid(isFocused); - this._set("state", isValid ? "" : "Error"); - dijit.setWaiState(this.focusNode, "invalid", isValid ? "false" : "true"); - var message = isValid ? "" : this._missingMsg; - if(this.message !== message){ - this._set("message", message); - dijit.hideTooltip(this.domNode); - if(message){ - dijit.showTooltip(message, this.domNode, this.tooltipPosition, !this.isLeftToRight()); + // 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){ + return [ + // TODO: when leftClickToOpen is true then shouldn't space/enter key trigger the menu, + // rather than shift-F10? + on(cn, this.leftClickToOpen ? "click" : "contextmenu", lang.hitch(this, function(evt){ + // Schedule context menu to be opened unless it's already been scheduled from onkeydown handler + event.stop(evt); + this._scheduleOpen(evt.target, iframe, {x: evt.pageX, y: evt.pageY}); + })), + on(cn, "keydown", lang.hitch(this, function(evt){ + if(evt.shiftKey && evt.keyCode == keys.F10){ + event.stop(evt); + this._scheduleOpen(evt.target, 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.withGlobal(window, win.body); + binding.connects = doConnects(cn); + }); + if(iframe.addEventListener){ + iframe.addEventListener("load", binding.onloadHandler, false); + }else{ + iframe.attachEvent("onload", binding.onloadHandler); } } - return isValid; }, - isValid: function(/*Boolean*/ isFocused){ + unBindDomNode: function(/*String|DomNode*/ nodeName){ // 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 - }, + // Detach menu from given node - reset: function(){ - // summary: - // Overridden so that the state will be cleared. - this.inherited(arguments); - dijit.hideTooltip(this.domNode); - this._set("state", ""); - this._set("message", "") + var node; + try{ + node = dom.byId(nodeName); + }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]; + } }, - postMixInProperties: function(){ + _scheduleOpen: function(/*DomNode?*/ target, /*DomNode?*/ iframe, /*Object?*/ coords){ // summary: - // set the missing message - this.inherited(arguments); - this._missingMsg = dojo.i18n.getLocalization("dijit.form", "validate", - this.lang).missingMessage; + // 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 = setTimeout(lang.hitch(this, function(){ + delete this._openTimer; + this._openMyself({ + target: target, + iframe: iframe, + coords: coords + }); + }), 1); + } }, - postCreate: function(){ + _openMyself: function(args){ // summary: - // stop mousemove from selecting text on IE to be consistent with other browsers - - this.inherited(arguments); + // 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). - this.connect(this.domNode, "onmousemove", dojo.stopEvent); - }, + var target = args.target, + iframe = args.iframe, + coords = args.coords; - _setStyleAttr: function(/*String||Object*/ value){ - this.inherited(arguments); - dojo.toggleClass(this.domNode, this.baseClass + "FixedWidth", !!this.tableNode.style.width); - }, + // 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 = win.withGlobal(window, "_docScroll", dojo); - isLoaded: function(){ - return this._isLoaded; - }, + 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); - loadDropDown: function(/*Function*/ loadCallback){ - // summary: - // populates the menu - this._loadChildren(true); - this._isLoaded = true; - loadCallback(); - }, + 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; + } - closeDropDown: function(){ - // overriding _HasDropDown.closeDropDown() - this.inherited(arguments); + 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; - 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 = ""; + 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 + }; }, - uninitialize: function(preserveDom){ - if(this.dropDown && !this.dropDown._destroyed){ - this.dropDown.destroyRecursive(preserveDom); - delete this.dropDown; - } - this.inherited(arguments); + uninitialize: function(){ + array.forEach(this._bindings, function(b){ if(b){ this.unBindDomNode(b.node); } }, this); + this.inherited(arguments); } }); -} +}); -if(!dojo._hasResource["dijit.form.SimpleTextarea"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.form.SimpleTextarea"] = true; -dojo.provide("dijit.form.SimpleTextarea"); +}, +'dijit/form/_CheckBoxMixin':function(){ +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 + // summary: + // Mixin to provide widget functionality corresponding to an HTML checkbox + 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", -dojo.declare("dijit.form.SimpleTextarea", - dijit.form.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 dojoType="dijit.form.SimpleTextarea" name="foo" value="bar" rows=30 cols=40></textarea> - // - // example: - // | new dijit.form.SimpleTextarea({ rows:20, cols:30 }, "foo"); + // 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", - baseClass: "dijitTextBox dijitTextArea", + // 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", - attributeMap: dojo.delegate(dijit.form._FormValueWidget.prototype.attributeMap, { - rows:"textbox", cols: "textbox" - }), + _setReadOnlyAttr: function(/*Boolean*/ value){ + this._set("readOnly", value); + domAttr.set(this.focusNode, 'readOnly', value); + this.focusNode.setAttribute("aria-readonly", value); + }, - // rows: Number - // The number of rows of text. - rows: "3", + // 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, - // rows: Number - // The number of characters per line. - cols: "20", + postMixInProperties: function(){ + if(this.value == ""){ + this.value = "on"; + } + this.inherited(arguments); + }, - templateString: "<textarea ${!nameAttrSetting} dojoAttachPoint='focusNode,containerNode,textbox' autocomplete='off'></textarea>", + 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); + }, - 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; + _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); } - this.inherited(arguments); - }, + }); +}); - buildRendering: function(){ - this.inherited(arguments); - if(dojo.isIE && this.cols){ // attribute selectors is not supported in IE6 - dojo.addClass(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); - }, - - _previousValue: "", - _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){ - if(e){ dojo.stopEvent(e); } - var textarea = this.textbox; - if(textarea.selectionStart){ - var pos = textarea.selectionStart; - var cr = 0; - if(dojo.isOpera){ - 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(dojo.doc.selection){ //IE - textarea.focus(); - var range = dojo.doc.selection.createRange(); - // delete overflow characters - range.moveStart("character", -overflow); - range.text = ''; - // show cursor - range.select(); - } - } - this._previousValue = this.textbox.value; - } - this.inherited(arguments); - } -}); - -} - -if(!dojo._hasResource["dijit.InlineEditBox"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.InlineEditBox"] = true; -dojo.provide("dijit.InlineEditBox"); +}, +'dijit/layout/ContentPane':function(){ +define("dijit/layout/ContentPane", [ + "dojo/_base/kernel", // kernel.deprecated + "dojo/_base/lang", // lang.mixin lang.delegate lang.hitch lang.isFunction lang.isObject + "../_Widget", + "./_ContentPaneResizeMixin", + "dojo/string", // string.substitute + "dojo/html", // html._ContentSetter html._emptyNode + "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/_base/window", // win.body win.doc.createDocumentFragment + "dojo/_base/xhr", // xhr.get + "dojo/i18n" // i18n.getLocalization +], function(kernel, lang, _Widget, _ContentPaneResizeMixin, string, html, nlsLoading, + array, declare, Deferred, dom, domAttr, win, xhr, i18n){ +/*===== + var _Widget = dijit._Widget; + var _ContentPaneResizeMixin = dijit.layout._ContentPaneResizeMixin; +=====*/ +// module: +// dijit/layout/ContentPane +// summary: +// A widget containing an HTML fragment, specified inline +// or by uri. Fragment may include widgets. +return declare("dijit.layout.ContentPane", [_Widget, _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, -dojo.declare("dijit.InlineEditBox", - dijit._Widget, - { - // summary: - // An element with in-line edit capabilites - // - // 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 + // parseOnLoad: Boolean + // Parse content and create the widgets, if any. + parseOnLoad: true, - // editing: [readonly] Boolean - // Is the node currently in edit mode? - editing: false, + // 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, - // autoSave: Boolean - // Changing the value automatically saves it; don't have to push save button - // (and save button isn't even displayed) - autoSave: true, + // preventCache: Boolean + // Prevent caching of data from href's by appending a timestamp to the href. + preventCache: false, - // buttonSave: String - // Save button label - buttonSave: "", + // preload: Boolean + // Force load of data on initialization even if pane is hidden. + preload: false, - // buttonCancel: String - // Cancel button label - buttonCancel: "", + // refreshOnShow: Boolean + // Refresh (re-download) content when pane goes from hidden to shown + refreshOnShow: false, - // 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, + // loadingMessage: String + // Message that shows while downloading + loadingMessage: "<span class='dijitContentPaneLoading'><span class='dijitInline dijitIconLoading'></span>${loadingState}</span>", - // editor: String|Function - // Class name (or reference to the Class) for Editor widget - editor: "dijit.form.TextBox", + // errorMessage: String + // Message that shows if an error occurs + errorMessage: "<span class='dijitContentPaneError'><span class='dijitInline dijitIconError'></span>${errorState}</span>", - // editorWrapper: String|Function - // Class name (or reference to the Class) for widget that wraps the editor widget, displaying save/cancel - // buttons. - editorWrapper: "dijit._InlineEditor", + // 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, - // editorParams: Object - // Set of parameters for editor, like {required: true} - editorParams: {}, + baseClass: "dijitContentPane", - // disabled: Boolean - // If true, clicking the InlineEditBox to edit it will have no effect. - disabled: false, + /*====== + // ioMethod: dojo.xhrGet|dojo.xhrPost + // Function that should grab the content specified via href. + ioMethod: dojo.xhrGet, + ======*/ - onChange: function(value){ - // summary: - // Set this handler to be notified of changes to value. - // tags: - // callback - }, + // 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: {}, - onCancel: function(){ - // summary: - // Set this handler to be notified when editing is cancelled. - // tags: - // callback - }, + // onLoadDeferred: [readonly] dojo.Deferred + // This is the `dojo.Deferred` returned by set('href', ...) and refresh(). + // Calling onLoadDeferred.addCallback() or addErrback() 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, - // width: String - // Width of editor. By default it's width=100% (ie, block mode). - width: "100%", + // 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, - // value: String - // The display value of the widget in read-only mode - value: "", + // Flag to parser that I'll parse my contents, so it shouldn't. + stopParser: true, - // 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: dojo.isIE <= 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>", + // 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, - constructor: function(){ - // summary: - // Sets up private arrays etc. - // tags: - // private - this.editorParams = {}; + 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)){ + var df = win.doc.createDocumentFragment(); + srcNodeRef = dom.byId(srcNodeRef); + 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); + }, - // save pointer to original source node, since Widget nulls-out srcNodeRef - this.displayNode = this.srcNodeRef; + buildRendering: function(){ + this.inherited(arguments); - // 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]); - } - dijit.setWaiRole(this.displayNode, "button"); - if(!this.displayNode.getAttribute("tabIndex")){ - this.displayNode.setAttribute("tabIndex", 0); + // 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; } - if(!this.value && !("value" in this.params)){ // "" is a good value if specified directly so check params){ - this.value = dojo.trim(this.renderAsHtml ? this.displayNode.innerHTML : - (this.displayNode.innerText||this.displayNode.textContent||"")); - } - if(!this.value){ - this.displayNode.innerHTML = this.noValueIndicator; - } + // 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 = ""; - dojo.addClass(this.displayNode, 'dijitInlineEditBoxDisplayMode'); + if(!domAttr.get(this.domNode,"role")){ + this.domNode.setAttribute("role", "group"); + } }, - setDisabled: function(/*Boolean*/ disabled){ + startup: function(){ // summary: - // Deprecated. Use set('disabled', ...) instead. - // tags: - // deprecated - dojo.deprecated("dijit.InlineEditBox.setDisabled() is deprecated. Use set('disabled', bool) instead.", "", "2.0"); - this.set('disabled', disabled); - }, + // Call startup() on all children including non _Widget ones like dojo.dnd.Source objects - _setDisabledAttr: function(/*Boolean*/ disabled){ - // summary: - // Hook to make set("disabled", ...) work. - // Set disabled state of widget. - dijit.setWaiState(this.domNode, "disabled", disabled); - if(disabled){ - this.displayNode.removeAttribute("tabIndex"); - }else{ - this.displayNode.setAttribute("tabIndex", 0); - } - dojo.toggleClass(this.displayNode, "dijitInlineEditBoxDisplayModeDisabled", disabled); - this._set("disabled", disabled); - }, + // This starts all the widgets + this.inherited(arguments); - _onMouseOver: function(){ - // summary: - // Handler for onmouseover and onfocus event. - // tags: - // private - if(!this.disabled){ - dojo.addClass(this.displayNode, "dijitInlineEditBoxDisplayModeHover"); + // 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); } }, - _onMouseOut: function(){ + setHref: function(/*String|Uri*/ href){ // summary: - // Handler for onmouseout and onblur event. - // tags: - // private - dojo.removeClass(this.displayNode, "dijitInlineEditBoxDisplayModeHover"); + // Deprecated. Use set('href', ...) instead. + kernel.deprecated("dijit.layout.ContentPane.setHref() is deprecated. Use set('href', ...) instead.", "", "2.0"); + return this.set("href", href); }, - - _onClick: function(/*Event*/ e){ + _setHrefAttr: function(/*String|Uri*/ href){ // summary: - // Handler for onclick event. - // tags: - // private - if(this.disabled){ return; } - if(e){ dojo.stopEvent(e); } - this._onMouseOut(); + // 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 - // Since FF gets upset if you move a node while in an event handler for that node... - setTimeout(dojo.hitch(this, "edit"), 0); + // 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.addCallback(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 }, - edit: function(){ + setContent: function(/*String|DomNode|Nodelist*/data){ // summary: - // Display the editor widget in place of the original (read only) markup. - // tags: - // private - - if(this.disabled || this.editing){ return; } - this.editing = true; + // 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 - // save some display node values that can be restored later - this._savedPosition = dojo.style(this.displayNode, "position") || "static"; - this._savedOpacity = dojo.style(this.displayNode, "opacity") || "1"; - this._savedTabIndex = dojo.attr(this.displayNode, "tabIndex") || "0"; + // clear href so we can't run refresh and clear content + // refresh should only work if we downloaded the content + this._set("href", ""); - 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 = dojo.create("span", null, this.domNode, "before"); + // Cancel any in-flight requests (a set('content', ...) will cancel any in-flight set('href', ...)) + this.cancel(); - // Create the editor wrapper (the thing that holds the editor widget and the save/cancel buttons) - var ewc = typeof this.editorWrapper == "string" ? dojo.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: dojo.getComputedStyle(this.displayNode), - save: dojo.hitch(this, "save"), - cancel: dojo.hitch(this, "cancel") - }, placeholder); - if(!this._started){ - this.startup(); - } + // 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.addCallback(lang.hitch(this, "onLoad")); } - var ww = this.wrapperWidget; - if(dojo.isIE){ - dijit.focus(dijit.getFocus()); // IE (at least 8) needs help with tab order changes - } - // 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 - // visiblity:hidden removes focus outline + this._setContent(data || ""); - dojo.style(this.displayNode, { position: "absolute", opacity: "0", display: "none" }); // makes display node invisible, display style used for focus-ability - dojo.style(ww.domNode, { position: this._savedPosition, visibility: "visible", opacity: "1" }); - dojo.attr(this.displayNode, "tabIndex", "-1"); // needed by WebKit for TAB from editor to skip displayNode + this._isDownloaded = false; // mark that content is from a set('content') not a set('href') - // Replace the display widget with edit widget, leaving them both displayed for a brief time so that - // focus can be shifted without incident. (browser may needs some time to render the editor.) - setTimeout(dojo.hitch(this, function(){ - ww.focus(); // both nodes are showing, so we can switch focus safely - ww._resetValue = ww.getValue(); - }), 0); + return this.onLoadDeferred; // Deferred }, - - _onBlur: function(){ + _getContentAttr: function(){ // summary: - // Called when focus moves outside the InlineEditBox. - // Performs garbage collection. - // tags: - // private + // Hook to make get("content") work + return this.containerNode.innerHTML; + }, - this.inherited(arguments); - if(!this.editing){ - /* causes IE focus problems, see TooltipDialog_a11y.html... - setTimeout(dojo.hitch(this, function(){ - if(this.wrapperWidget){ - this.wrapperWidget.destroy(); - delete this.wrapperWidget; - } - }), 0); - */ + 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(){ - if(this.wrapperWidget && !this.wrapperWidget._destroyed){ - this.wrapperWidget.destroy(); - delete this.wrapperWidget; + uninitialize: function(){ + if(this._beingDestroyed){ + this.cancel(); } this.inherited(arguments); }, - _showText: function(/*Boolean*/ focus){ + destroyRecursive: function(/*Boolean*/ preserveDom){ // summary: - // Revert to display mode, and optionally focus on display node - // tags: - // private + // Destroy the ContentPane and its contents - var ww = this.wrapperWidget; - dojo.style(ww.domNode, { position: "absolute", visibility: "hidden", opacity: "0" }); // hide the editor from mouse/keyboard events - dojo.style(this.displayNode, { position: this._savedPosition, opacity: this._savedOpacity, display: "" }); // make the original text visible - dojo.attr(this.displayNode, "tabIndex", this._savedTabIndex); - if(focus){ - dijit.focus(this.displayNode); + // if we have multiple controllers destroying us, bail after the first + if(this._beingDestroyed){ + return; } + this.inherited(arguments); }, - save: function(/*Boolean*/ focus){ + _onShow: function(){ // 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.editing = false; - - var ww = this.wrapperWidget; - var value = ww.getValue(); - this.set('value', value); // display changed, formatted value + // 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._showText(focus); // set focus as needed - }, + this.inherited(arguments); - setValue: function(/*String*/ val){ - // summary: - // Deprecated. Use set('value', ...) instead. - // tags: - // deprecated - dojo.deprecated("dijit.InlineEditBox.setValue() is deprecated. Use set('value', ...) instead.", "", "2.0"); - return this.set("value", val); + 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 + } + } }, - _setValueAttr: function(/*String*/ val){ + refresh: function(){ // summary: - // Hook to make set("value", ...) work. - // Inserts specified HTML value into this node, or an "input needed" character if node is blank. + // [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 - val = dojo.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); + // Cancel possible prior in-flight request + this.cancel(); - if(this._started){ - // tell the world that we have changed - setTimeout(dojo.hitch(this, "onChange", val), 0); // setTimeout prevents browser freeze for long-running event handlers - } + this.onLoadDeferred = new Deferred(lang.hitch(this, "cancel")); + this.onLoadDeferred.addCallback(lang.hitch(this, "onLoad")); + this._load(); + return this.onLoadDeferred; // If child has an href, promise that fires when refresh is complete }, - getValue: function(){ + _load: function(){ // summary: - // Deprecated. Use get('value') instead. - // tags: - // deprecated - dojo.deprecated("dijit.InlineEditBox.getValue() is deprecated. Use get('value') instead.", "", "2.0"); - return this.get("value"); - }, + // Load/reload the href specified in this.href - cancel: function(/*Boolean*/ focus){ - // summary: - // Revert to display mode, discarding any changes made in the editor - // tags: - // private + // display loading message + this._setContent(this.onDownloadStart(), true); - if(this.disabled || !this.editing){ return; } - this.editing = false; + 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); + } - // tell the world that we have no changes - setTimeout(dojo.hitch(this, "onCancel"), 0); // setTimeout prevents browser freeze for long-running event handlers + var hand = (this._xhrDfd = (this.ioMethod || xhr.get)(getArgs)); - this._showText(focus); - } -}); - -dojo.declare( - "dijit._InlineEditor", - [dijit._Widget, dijit._Templated], -{ - // 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 + hand.addCallback(function(html){ + try{ + self._isDownloaded = true; + self._setContent(html, false); + self.onDownloadEnd(); + }catch(err){ + self._onError('Content', err); // onContentError + } + delete self._xhrDfd; + return html; + }); - templateString: dojo.cache("dijit", "templates/InlineEditBox.html", "<span data-dojo-attach-point=\"editNode\" role=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\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"), - widgetsInTemplate: true, + hand.addErrback(function(err){ + if(!hand.canceled){ + // show error message in the pane + self._onError('Download', err); // onDownloadError + } + delete self._xhrDfd; + return err; + }); - postMixInProperties: function(){ - this.inherited(arguments); - this.messages = dojo.i18n.getLocalization("dijit", "common", this.lang); - dojo.forEach(["buttonSave", "buttonCancel"], function(prop){ - if(!this[prop]){ this[prop] = this.messages[prop]; } - }, this); + // Remove flag saying that a load is needed + delete this._hrefChanged; }, - buildRendering: function(){ - this.inherited(arguments); - - // Create edit widget in place in the template - var cls = typeof this.editor == "string" ? dojo.getObject(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 = dojo.getComputedStyle(this.domNode); - dojo.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); - dojo.forEach(["marginTop","marginBottom","marginLeft", "marginRight"], 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" : "")) + ";"; + _onLoadHandler: function(data){ + // summary: + // This is called whenever new content is being loaded + this._set("isLoaded", true); + try{ + this.onLoadDeferred.callback(data); + }catch(e){ + console.error('Error '+this.widgetId+' running custom onLoad code: ' + e.message); } - var editorParams = dojo.delegate(this.inlineEditBox.editorParams, { - style: editStyle, - dir: this.dir, - lang: this.lang - }); - 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 - dojo.destroy(this.buttonContainer); + _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); } }, - postCreate: function(){ - this.inherited(arguments); + destroyDescendants: function(/*Boolean*/ preserveDom){ + // summary: + // Destroy all the widgets inside the ContentPane and empty containerNode - var ew = this.editWidget; + // Make sure we call onUnload (but only when the ContentPane has real content) + if(this.isLoaded){ + this._onUnloadHandler(); + } - 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"); + // Even if this.isLoaded == false there might still be a "Loading..." message + // to erase, so continue... - // 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); + // 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){ + widget.destroyRecursive(preserveDom); } + }); + 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.destroyRecursive && widget.domNode && widget.domNode.parentNode == win.body()){ + widget.destroyRecursive(preserveDom); + } + }); + delete setter.parseResults; } - }, - _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()); - }, + // And then clear away all the DOM nodes + if(!preserveDom){ + html._emptyNode(this.containerNode); + } - destroy: function(){ - this.editWidget.destroy(true); // let the parent wrapper widget clean up the DOM - this.inherited(arguments); + // Delete any state information we have about current contents + delete this._singleChild; }, - getValue: function(){ + _setContent: function(/*String|DocumentFragment*/ cont, /*Boolean*/ isFakeContent){ // summary: - // Return the [display] value of the edit widget - var ew = this.editWidget; - return String(ew.get("displayedValue" in ew ? "displayedValue" : "value")); - }, + // Insert the content into the container node - _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 + // first get rid of child widgets + this.destroyDescendants(); - if(this.inlineEditBox.autoSave && this.inlineEditBox.editing){ - if(e.altKey || e.ctrlKey){ return; } - // If Enter/Esc pressed, treat as save/cancel. - if(e.charOrCode == dojo.keys.ESCAPE){ - dojo.stopEvent(e); - this.cancel(true); // sets editing=false which short-circuits _onBlur processing - }else if(e.charOrCode == dojo.keys.ENTER && e.target.tagName == "INPUT"){ - dojo.stopEvent(e); - this._onChange(); // fire _onBlur and then save - } + // 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 */ + }); + } - // _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. + 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 || {}); + + setter.set( (lang.isObject(cont) && cont.domNode) ? cont.domNode : cont, setterParams ); + + // setter params must be pulled afresh from the ContentPane each time + delete this._contentSetterParams; + + if(this.doLayout){ + this._checkIfSingleChild(); } - }, - _onBlur: function(){ - // summary: - // Called when focus moves outside the editor - // tags: - // private + if(!isFakeContent){ + if(this._started){ + // Startup each top level child widget (and they will start their children, recursively) + delete this._started; + this.startup(); - 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); + // 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 + this._scheduleLayout(); } + + this._onLoadHandler(cont); } }, - _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 + _onError: function(type, err, consoleText){ + this.onLoadDeferred.errback(err); - if(this.inlineEditBox.autoSave && this.inlineEditBox.editing && this.enableSave()){ - dojo.style(this.inlineEditBox.displayNode, { display: "" }); - dijit.focus(this.inlineEditBox.displayNode); // fires _onBlur which will save the formatted value + // 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); } }, - enableSave: function(){ + // EVENT's, should be overide-able + onLoad: function(/*===== data =====*/){ // summary: - // User overridable function returning a Boolean to indicate - // if the Save button should be enabled or not - usually due to invalid conditions + // Event hook, is called after everything is loaded and widgetified // tags: - // extension - return ( - this.editWidget.isValid - ? this.editWidget.isValid() - : true - ); + // callback }, - focus: function(){ + onUnload: function(){ // summary: - // Focus the edit widget. + // Event hook, is called before old content is cleared // tags: - // protected + // callback + }, - this.editWidget.focus(); - setTimeout(dojo.hitch(this, function(){ - if(this.editWidget.focusNode && this.editWidget.focusNode.tagName == "INPUT"){ - dijit.selectInputText(this.editWidget.focusNode); - } - }), 0); - } -}); + 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 + }, -if(!dojo._hasResource["dojo.cookie"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.cookie"] = true; -dojo.provide("dojo.cookie"); + 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 + } +}); +}); -/*===== -dojo.__cookieProps = function(){ - // expires: Date|String|Number? - // If a number, the number of days from today at which the cookie - // will expire. If a date, the date past which the cookie will expire. - // If expires is in the past, the cookie will be deleted. - // If expires is omitted or is 0, the cookie will expire when the browser closes. << FIXME: 0 seems to disappear right away? FF3. - // path: String? - // The path to use for the cookie. - // domain: String? - // The domain to use for the cookie. - // secure: Boolean? - // Whether to only send the cookie on secure connections - this.expires = expires; - this.path = path; - this.domain = domain; - this.secure = secure; -} -=====*/ +}, +'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", +'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", +'dijit/layout/utils':function(){ +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 + ".." // for exporting symbols to dijit, remove in 2.0 +], function(array, domClass, domGeometry, domStyle, lang, dijit){ + + // module: + // dijit/layout/utils + // summary: + // marginBox2contentBox() and layoutChildren() + var layout = lang.getObject("layout", true, dijit); + /*===== layout = dijit.layout =====*/ -dojo.cookie = function(/*String*/name, /*String?*/value, /*dojo.__cookieProps?*/props){ - // summary: - // Get or set a cookie. - // description: - // If one argument is passed, returns the value of the cookie - // For two or more arguments, acts as a setter. - // name: - // Name of the cookie - // value: - // Value for the cookie - // props: - // Properties for the cookie - // example: - // set a cookie with the JSON-serialized contents of an object which - // will expire 5 days from now: - // | dojo.cookie("configObj", dojo.toJson(config), { expires: 5 }); - // - // example: - // de-serialize a cookie back into a JavaScript object: - // | var config = dojo.fromJson(dojo.cookie("configObj")); - // - // example: - // delete a cookie: - // | dojo.cookie("configObj", null, {expires: -1}); - var c = document.cookie; - if(arguments.length == 1){ - var matches = c.match(new RegExp("(?:^|; )" + dojo.regexp.escapeString(name) + "=([^;]*)")); - return matches ? decodeURIComponent(matches[1]) : undefined; // String or undefined - }else{ - props = props || {}; -// FIXME: expires=0 seems to disappear right away, not on close? (FF3) Change docs? - var exp = props.expires; - if(typeof exp == "number"){ - var d = new Date(); - d.setTime(d.getTime() + exp*24*60*60*1000); - exp = props.expires = d; - } - if(exp && exp.toUTCString){ props.expires = exp.toUTCString(); } + 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) + }; + }; - value = encodeURIComponent(value); - var updatedCookie = name + "=" + value, propName; - for(propName in props){ - updatedCookie += "; " + propName; - var propValue = props[propName]; - if(propValue !== true){ updatedCookie += "=" + propValue; } - } - document.cookie = updatedCookie; + function capitalize(word){ + return word.substring(0,1).toUpperCase() + word.substring(1); } -}; -dojo.cookie.isSupported = function(){ - // summary: - // Use to determine if the current browser supports cookies or not. - // - // Returns true if user allows cookies. - // Returns false if user doesn't allow cookies. + function size(widget, dim){ + // size the child + var newSize = widget.resize ? widget.resize(dim) : domGeometry.setMarginBox(widget.domNode, dim); - if(!("cookieEnabled" in navigator)){ - this("__djCookieTest__", "CookiesAllowed"); - navigator.cookieEnabled = this("__djCookieTest__") == "CookiesAllowed"; - if(navigator.cookieEnabled){ - this("__djCookieTest__", "", {expires: -1}); + // 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); } } - return navigator.cookieEnabled; -}; -} + 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. -if(!dojo._hasResource["dijit.layout.StackController"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.layout.StackController"] = true; -dojo.provide("dijit.layout.StackController"); + // 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 = {}; -dojo.declare( - "dijit.layout.StackController", - [dijit._Widget, dijit._Templated, dijit._Container], - { - // summary: - // Set of buttons to select a page in a page list. - // description: - // Monitors the specified StackContainer, and whenever a page is - // added, deleted, or selected, updates itself accordingly. + // 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; + } - templateString: "<span role='tablist' dojoAttachEvent='onkeypress' class='dijitStackController'></span>", + // 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); + } + }); + }; - // containerId: [const] String - // The id of the page container that I point to - containerId: "", - // buttonWidget: [const] String - // The name of the button widget to create to correspond to each page - buttonWidget: "dijit.layout._StackButton", + return { + marginBox2contentBox: layout.marginBox2contentBox, + layoutChildren: layout.layoutChildren + }; +}); - constructor: function(){ - this.pane2button = {}; // mapping from pane id to buttons - this.pane2connects = {}; // mapping from pane id to this.connect() handles - this.pane2watches = {}; // mapping from pane id to watch() handles - }, +}, +'dijit/_Contained':function(){ +define("dijit/_Contained", [ + "dojo/_base/declare", // declare + "./registry" // registry.getEnclosingWidget(), registry.byNode() +], function(declare, registry){ + + // module: + // dijit/_Contained + // summary: + // Mixin for widgets that are children of a container widget - buildRendering: function(){ - this.inherited(arguments); - dijit.setWaiRole(this.domNode, "tablist"); // TODO: unneeded? it's in template above. - }, + 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],{}); - postCreate: function(){ - this.inherited(arguments); + _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._Widget + }, - // Listen to notifications from StackContainer - 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"); - }, + getPreviousSibling: function(){ + // summary: + // Returns null if this is the first child of the parent, + // otherwise returns the next element sibling to the "left". - onStartup: function(/*Object*/ info){ - // summary: - // Called after StackContainer has finished initializing - // tags: - // private - dojo.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); - } - }, + return this._getSibling("previous"); // dijit._Widget + }, - destroy: function(){ - for(var pane in this.pane2button){ - this.onRemoveChild(dijit.byId(pane)); - } - this.inherited(arguments); - }, + getNextSibling: function(){ + // summary: + // Returns null if this is the last child of the parent, + // otherwise returns the next element sibling to the "right". - onAddChild: function(/*dijit._Widget*/ 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 - var cls = dojo.getObject(this.buttonWidget); - var button = new cls({ - id: this.id + "_" + page.id, - label: page.title, - dir: page.dir, - lang: page.lang, - showLabel: page.showTitle, - iconClass: page.iconClass, - closeButton: page.closable, - title: page.tooltip - }); - dijit.setWaiState(button.focusNode,"selected", "false"); + return this._getSibling("next"); // dijit._Widget + }, + 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 - // map from page attribute to corresponding tab button attribute - var pageAttrList = ["title", "showTitle", "iconClass", "closable", "tooltip"], - buttonAttrList = ["label", "showLabel", "iconClass", "closeButton", "title"]; + var p = this.getParent(); + if(!p || !p.getIndexOfChild){ + return -1; // int + } + return p.getIndexOfChild(this); // int + } + }); +}); - // watch() so events like page title changes are reflected in tab button - this.pane2watches[page.id] = dojo.map(pageAttrList, function(pageAttr, idx){ - return page.watch(pageAttr, function(name, oldVal, newVal){ - button.set(buttonAttrList[idx], newVal); - }); - }); - - // connections so that clicking a tab button selects the corresponding page - this.pane2connects[page.id] = [ - this.connect(button, 'onClick', dojo.hitch(this,"onButtonClick", page)), - this.connect(button, 'onClickCloseButton', dojo.hitch(this,"onCloseButtonClick", 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){ // put the first child into the tab order - button.focusNode.setAttribute("tabIndex", "0"); - dijit.setWaiState(button.focusNode, "selected", "true"); - this._currentChild = page; - } - // make sure all tabs have the same length - if(!this.isLeftToRight() && dojo.isIE && this._rectifyRtlTabList){ - this._rectifyRtlTabList(); - } - }, - - onRemoveChild: function(/*dijit._Widget*/ 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; } - - // disconnect/unwatch connections/watches related to page being removed - dojo.forEach(this.pane2connects[page.id], dojo.hitch(this, "disconnect")); - delete this.pane2connects[page.id]; - dojo.forEach(this.pane2watches[page.id], function(w){ w.unwatch(); }); - delete this.pane2watches[page.id]; - - var button = this.pane2button[page.id]; - if(button){ - this.removeChild(button); - delete this.pane2button[page.id]; - button.destroy(); - } - delete page.controlButton; - }, - - onSelectChild: function(/*dijit._Widget*/ 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); - dijit.setWaiState(oldButton.focusNode, "selected", "false"); - oldButton.focusNode.setAttribute("tabIndex", "-1"); - } +}, +'dijit/_KeyNavContainer':function(){ +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){ - var newButton=this.pane2button[page.id]; - newButton.set('checked', true); - dijit.setWaiState(newButton.focusNode, "selected", "true"); - this._currentChild = page; - newButton.focusNode.setAttribute("tabIndex", "0"); - var container = dijit.byId(this.containerId); - dijit.setWaiState(container.containerNode, "labelledby", newButton.id); - }, +/*===== + var _FocusMixin = dijit._FocusMixin; + var _Container = dijit._Container; +=====*/ - onButtonClick: function(/*dijit._Widget*/ page){ - // summary: - // Called whenever one of my child buttons is pressed in an attempt to select a page - // tags: - // private + // module: + // dijit/_KeyNavContainer + // summary: + // A _Container with keyboard navigation of its children. - var container = dijit.byId(this.containerId); - container.selectChild(page); - }, + return declare("dijit._KeyNavContainer", [_FocusMixin, _Container], { - onCloseButtonClick: function(/*dijit._Widget*/ page){ - // summary: - // Called whenever one of my child buttons [X] is pressed in an attempt to close a page - // tags: - // private - - var container = dijit.byId(this.containerId); - container.closeChild(page); - if(this._currentChild){ - var b = this.pane2button[this._currentChild.id]; - if(b){ - dijit.focus(b.focusNode || b.domNode); - } - } - }, + // 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. - // 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 +/*===== + // focusedChild: [protected] Widget + // The currently focused child widget, or null if there isn't one + focusedChild: null, +=====*/ - if(!this.isLeftToRight() && (!this.tabPosition || /top|bottom/.test(this.tabPosition))){ forward = !forward; } - // find currently focused button in children array - var children = this.getChildren(); - var current = dojo.indexOf(children, this.pane2button[this._currentChild.id]); - // pick next button to focus on - var offset = forward ? 1 : children.length - 1; - return children[ (current + offset) % children.length ]; // dijit._Widget - }, + // tabIndex: Integer + // 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", - 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){ - var k = dojo.keys; - switch(e.charOrCode){ - case k.LEFT_ARROW: - case k.UP_ARROW: - if(!e._djpage){ forward = false; } - break; - case k.PAGE_UP: - if(e.ctrlKey){ forward = false; } - break; - case k.RIGHT_ARROW: - case k.DOWN_ARROW: - if(!e._djpage){ forward = true; } - break; - case k.PAGE_DOWN: - if(e.ctrlKey){ forward = true; } - break; - case k.HOME: - case k.END: - var children = this.getChildren(); - if(children && children.length){ - children[e.charOrCode == k.HOME ? 0 : children.length-1].onClick(); - } - dojo.stopEvent(e); - break; - case k.DELETE: - if(this._currentChild.closable){ - this.onCloseButtonClick(this._currentChild); - } - dojo.stopEvent(e); - break; - default: - if(e.ctrlKey){ - if(e.charOrCode === k.TAB){ - this.adjacent(!e.shiftKey).onClick(); - dojo.stopEvent(e); - }else if(e.charOrCode == "w"){ - if(this._currentChild.closable){ - this.onCloseButtonClick(this._currentChild); - } - dojo.stopEvent(e); // avoid browser tab closing. - } - } - } - // handle next/previous page navigation (left/right arrow, etc.) - if(forward !== null){ - this.adjacent(forward).onClick(); - dojo.stopEvent(e); - } - } - }, + 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 - 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); - } - }); + // 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"); + }, -dojo.declare("dijit.layout._StackButton", - dijit.form.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 + startupKeyNavChildren: function(){ + kernel.deprecated("startupKeyNavChildren() call no longer needed", "", "2.0"); + }, - // Override _FormWidget.tabIndex. - // StackContainer buttons are not in the tab order by default. - // Probably we should be calling this.startupKeyNavChildren() instead. - tabIndex: "-1", + startup: function(){ + this.inherited(arguments); + array.forEach(this.getChildren(), lang.hitch(this, "_startupChild")); + }, - buildRendering: function(/*Event*/ evt){ + addChild: function(/*dijit._Widget*/ widget, /*int?*/ insertIndex){ this.inherited(arguments); - dijit.setWaiRole((this.focusNode || this.domNode), "tab"); + this._startupChild(widget); }, - onClick: function(/*Event*/ evt){ + focus: function(){ // summary: - // This is for TabContainer where the tabs are <span> rather than button, - // so need to set focus explicitly (on some browsers) - // Note that you shouldn't override this method, but you can connect to it. - dijit.focus(this.focusNode); + // Default focus() implementation: focus the first child. + this.focusFirstChild(); + }, - // ... now let StackController catch the event and tell me what to do + focusFirstChild: function(){ + // summary: + // Focus the first focusable child in the container. + // tags: + // protected + this.focusChild(this._getFirstFocusableChild()); }, - onClickCloseButton: function(/*Event*/ evt){ + focusLastChild: function(){ // summary: - // StackContainer connects to this function; if your widget contains a close button - // then clicking it should call this function. - // Note that you shouldn't override this method, but you can connect to it. - evt.stopPropagation(); - } - }); + // 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)); + }, -if(!dojo._hasResource["dijit.layout.StackContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.layout.StackContainer"] = true; -dojo.provide("dijit.layout.StackContainer"); + 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._Widget*/ 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._Widget*/ 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"); + }); + }, -dojo.declare( - "dijit.layout.StackContainer", - dijit.layout._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. + _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 - // doLayout: Boolean - // If true, change the size of my currently displayed child to match my size - doLayout: true, + // 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. - // persist: Boolean - // Remembers the selected child across sessions - persist: false, + // 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; } - baseClass: "dijitStackContainer", + this.focusFirstChild(); -/*===== - // selectedChildWidget: [readonly] dijit._Widget - // References the currently selected child widget, if any. - // Adjust selected child with selectChild() method. - selectedChildWidget: null, -=====*/ + // 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"); + }, - buildRendering: function(){ - this.inherited(arguments); - dojo.addClass(this.domNode, "dijitLayoutContainer"); - dijit.setWaiRole(this.containerNode, "tabpanel"); - }, + _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); + }, - postCreate: function(){ - this.inherited(arguments); - this.connect(this.domNode, "onkeypress", this._onKeyPress); - }, + _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); + } + }, - startup: function(){ - if(this._started){ return; } + _onChildBlur: function(/*dijit._Widget*/ /*===== 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 + }, - var children = this.getChildren(); + _getFirstFocusableChild: function(){ + // summary: + // Returns first child that can be focused + return this._getNextFocusableChild(null, 1); // dijit._Widget + }, - // Setup each page panel to be initially hidden - dojo.forEach(children, this._setupChild, this); + _getLastFocusableChild: function(){ + // summary: + // Returns last child that can be focused + return this._getNextFocusableChild(null, -1); // dijit._Widget + }, - // Figure out which child to initially display, defaulting to first one - if(this.persist){ - this.selectedChildWidget = dijit.byId(dojo.cookie(this.id + "_selectedChild")); - }else{ - dojo.some(children, function(child){ - if(child.selected){ - this.selectedChildWidget = child; + _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)]; } - return child.selected; - }, this); - } - var selected = this.selectedChildWidget; - if(!selected && children[0]){ - selected = this.selectedChildWidget = children[0]; - selected.selected = true; + if(child.isFocusable()){ + return child; // dijit._Widget + } + child = this._getSiblingOfChild(child, dir); + } + // no focusable child found + return null; // dijit._Widget } + }); +}); - // 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. - dojo.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); - }, +}, +'dijit/form/DataList':function(){ +define("dijit/form/DataList", [ + "dojo/_base/declare", // declare + "dojo/dom", // dom.byId + "dojo/_base/lang", // lang.trim + "dojo/query", // query + "dojo/store/Memory", // dojo.store.Memory + "../registry" // registry.add registry.remove +], function(declare, dom, lang, query, MemoryStore, registry){ + + // module: + // dijit/form/DataList + // summary: + // Inefficient but small data store specialized for inlined data via OPTION tags - resize: function(){ - // 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. - var selected = this.selectedChildWidget; - if(selected && !this._hasBeenShown){ - this._hasBeenShown = true; - this._showChild(selected); - } - this.inherited(arguments); - }, + function toItem(/*DOMNode*/ option){ + // summary: + // Convert <option> node to hash + return { + id: option.value, + value: option.value, + name: lang.trim(option.innerText || option.textContent || '') + }; + } - _setupChild: function(/*dijit._Widget*/ child){ - // Overrides _LayoutWidget._setupChild() + 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> + // | ... - this.inherited(arguments); + constructor: function(/*Object?*/ params, /*DomNode|String*/ srcNodeRef){ + // store pointer to original DOM tree + this.domNode = dom.byId(srcNodeRef); - dojo.replaceClass(child.domNode, "dijitHidden", "dijitVisible"); + 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"; - // remove the title attribute so it doesn't show up when i hover - // over a node - child.domNode.title = ""; - }, + this.inherited(arguments, [{ + data: query("option", this.domNode).map(toItem) + }]); + }, - addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){ - // Overrides _Container.addChild() to do layout and publish events + destroy: function(){ + registry.remove(this.id); + }, - this.inherited(arguments); + 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); + } + }); +}); - if(this._started){ - dojo.publish(this.id+"-addChild", [child, insertIndex]); +}, +'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<span data-dojo-attach-point=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\"></span>\n\t<span data-dojo-attach-point=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" data-dojo-attach-event=\"ondijitclick: onCancel\" title=\"${buttonCancel}\" role=\"button\" tabIndex=\"-1\">\n\t\t<span data-dojo-attach-point=\"closeText\" class=\"closeText\" title=\"${buttonCancel}\">x</span>\n\t</span>\n\t</div>\n\t\t<div data-dojo-attach-point=\"containerNode\" class=\"dijitDialogPaneContent\"></div>\n</div>\n", +'dijit/form/CheckBox':function(){ +require({cache:{ +'url:dijit/form/templates/CheckBox.html':"<div class=\"dijit dijitReset dijitInline\" role=\"presentation\"\n\t><input\n\t \t${!nameAttrSetting} type=\"${type}\" ${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/_base/kernel", + "dojo/query", // query + "dojo/ready", + "./ToggleButton", + "./_CheckBoxMixin", + "dojo/text!./templates/CheckBox.html", + "dojo/NodeList-dom" // NodeList.addClass/removeClass +], function(require, declare, domAttr, kernel, query, ready, ToggleButton, _CheckBoxMixin, template){ - // 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() - this.layout(); +/*===== + var ToggleButton = dijit.form.ToggleButton; + var _CheckBoxMixin = dijit.form._CheckBoxMixin; +=====*/ - // if this is the first child, then select it - if(!this.selectedChildWidget){ - this.selectChild(child); - } - } - }, + // module: + // dijit/form/CheckBox + // summary: + // Checkbox widget - removeChild: function(/*dijit._Widget*/ page){ - // Overrides _Container.removeChild() to do layout and publish events + // Back compat w/1.6, remove for 2.0 + if(!kernel.isAsync){ + ready(0, function(){ + var requires = ["dijit/form/RadioButton"]; + require(requires); // use indirection so modules not rolled into a build + }); + } - this.inherited(arguments); + 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. - if(this._started){ - // this will notify any tablists to remove a button; do this first because it may affect sizing - dojo.publish(this.id + "-removeChild", [page]); - } + templateString: template, - // If we 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._beingDestroyed){ return; } + baseClass: "dijitCheckBox", - // 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]); - } + _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._set("value", newValue); + domAttr.set(this.focusNode, 'value', newValue); + 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); + }, - 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(); - } - }, + // Override behavior from Button, since we don't have an iconNode + _setIconClassAttr: null, - selectChild: function(/*dijit._Widget|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 + postMixInProperties: function(){ + this.inherited(arguments); - page = dijit.byId(page); + // 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" : ""; + }, - if(this.selectedChildWidget != page){ - // Deselect old page and select new one - var d = this._transition(page, this.selectedChildWidget, animate); - this._set("selectedChildWidget", page); - dojo.publish(this.id+"-selectChild", [page]); + _fillContent: function(){ + // Override Button::_fillContent() since it doesn't make sense for CheckBox, + // since CheckBox doesn't even have a container + }, - if(this.persist){ - dojo.cookie(this.id + "_selectedChild", this.selectedChildWidget.id); + _onFocus: function(){ + if(this.id){ + query("label[for='"+this.id+"']").addClass("dijitFocusedLabel"); } - } - - return d; // If child has an href, promise that fires when the child's href finishes loading - }, - - _transition: function(/*dijit._Widget*/ newWidget, /*dijit._Widget*/ oldWidget, /*Boolean*/ animate){ - // summary: - // Hide the old widget and display the new widget. - // Subclasses should override this. - // tags: - // protected extension - if(oldWidget){ - this._hideChild(oldWidget); - } - var d = this._showChild(newWidget); + this.inherited(arguments); + }, - // 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(); + _onBlur: function(){ + if(this.id){ + query("label[for='"+this.id+"']").removeClass("dijitFocusedLabel"); } + this.inherited(arguments); } + }); +}); - return d; // If child has an href, promise that fires when the child's href finishes loading - }, +}, +'dijit/tree/_dndSelector':function(){ +define("dijit/tree/_dndSelector", [ + "dojo/_base/array", // array.filter array.forEach array.map + "dojo/_base/connect", // connect.isCopyKey + "dojo/_base/declare", // declare + "dojo/_base/lang", // lang.hitch + "dojo/mouse", // mouse.isLeft + "dojo/on", + "dojo/touch", + "dojo/_base/window", // win.global + "./_dndContainer" +], function(array, connect, declare, lang, mouse, on, touch, win, _dndContainer){ + + // module: + // dijit/tree/_dndSelector + // 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`. - _adjacent: function(/*Boolean*/ forward){ - // summary: - // Gets the next/previous child widget in this container from the current selection. - var children = this.getChildren(); - var index = dojo.indexOf(children, this.selectedChildWidget); - index += forward ? 1 : children.length - 1; - return children[ index % children.length ]; // dijit._Widget - }, - forward: function(){ + return declare("dijit.tree._dndSelector", _dndContainer, { // summary: - // Advance to next page. - return this.selectChild(this._adjacent(true), true); - }, + // 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 - back: function(){ - // summary: - // Go back to previous page. - return this.selectChild(this._adjacent(false), true); - }, + /*===== + // selection: Hash<String, DomNode> + // (id, DomNode) map for every TreeNode that's currently selected. + // The DOMNode is the TreeNode.rowNode. + selection: {}, + =====*/ - _onKeyPress: function(e){ - dojo.publish(this.id+"-containerKeyPress", [{ e: e, page: this}]); - }, + constructor: function(){ + // summary: + // Initialization + // tags: + // private - layout: function(){ - // Implement _LayoutWidget.layout() virtual method. - if(this.doLayout && this.selectedChildWidget && this.selectedChildWidget.resize){ - this.selectedChildWidget.resize(this._containerContentBox || this._contentBox); - } - }, - - _showChild: function(/*dijit._Widget*/ 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); - - dojo.replaceClass(page.domNode, "dijitVisible", "dijitHidden"); + this.selection={}; + this.anchor = null; - return page._onShow() || true; - }, + this.tree.domNode.setAttribute("aria-multiselect", !this.singular); - _hideChild: function(/*dijit._Widget*/ page){ - // summary: - // Hide the specified child by changing it's CSS, and call _onHide() so - // it's notified. - page._set("selected", false); - dojo.replaceClass(page.domNode, "dijitHidden", "dijitVisible"); + 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")) + ); + }, - page.onHide(); - }, + // 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, - closeChild: function(/*dijit._Widget*/ 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(); - } - }, + // 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; + }, - destroyDescendants: function(/*Boolean*/ preserveDom){ - dojo.forEach(this.getChildren(), function(child){ - this.removeChild(child); - child.destroyRecursive(preserveDom); - }, this); - } -}); + selectNone: function(){ + // summary: + // Unselects all items + // tags: + // private -// For back-compat, remove for 2.0 + 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._TreeNode*/node, /*Boolean?*/isAnchor){ + // summary: + // add node to current selection + // node: Node + // node to add + // isAnchor: Boolean + // Whether the node should become anchor. -// These arguments can be specified for the children of a StackContainer. -// 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.) -dojo.extend(dijit._Widget, { - // selected: Boolean - // Parameter for children of `dijit.layout.StackContainer` or subclasses. - // Specifies that this widget should be the initially displayed pane. - // Note: to change the selected child use `dijit.layout.StackContainer.selectChild` - selected: false, + this.setSelection(this.getSelectedTreeNodes().concat( [node] )); + if(isAnchor){ this.anchor = node; } + return node; + }, + removeTreeNode: function(/*dijit._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._TreeNode*/node){ + // summary: + // return true if node is currently selected + // node: Node + // the node to check whether it's in the current selection - // closable: Boolean - // Parameter for children of `dijit.layout.StackContainer` or subclasses. - // True if user can close (destroy) this child, such as (for example) clicking the X on the tab. - closable: false, + return node.id && !!this.selection[node.id]; + }, + setSelection: function(/*dijit._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. - // iconClass: String - // Parameter for children of `dijit.layout.StackContainer` or subclasses. - // CSS Class specifying icon to use in label associated with this pane. - iconClass: "", + array.forEach(ys, function(y){ y.__exclude__ = true; }); + var ret = array.filter(xs, function(x){ return !x.__exclude__; }); - // showTitle: Boolean - // Parameter for children of `dijit.layout.StackContainer` or subclasses. - // When true, display title of this widget as tab label etc., rather than just using - // icon specified in iconClass - showTitle: true -}); + // 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 = []; + array.forEach(selected, function(node){ + nodes.push(node); + paths.push(node.getTreePath()); + }); + 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); + }, + // mouse events + onMouseDown: function(e){ + // summary: + // Event processor for onmousedown/ontouchstart + // e: Event + // onmousedown/ontouchstart event + // tags: + // protected -if(!dojo._hasResource["dijit.layout.AccordionPane"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.layout.AccordionPane"] = true; -dojo.provide("dijit.layout.AccordionPane"); + // ignore click on expando node + if(!this.current || this.tree.isExpandoNode(e.target, this.current)){ return; } + if(!mouse.isLeft(e)){ return; } // ignore right-click + e.preventDefault(); -dojo.declare("dijit.layout.AccordionPane", dijit.layout.ContentPane, { - // summary: - // Deprecated widget. Use `dijit.layout.ContentPane` instead. - // tags: - // deprecated + var treeNode = this.current, + copy = connect.isCopyKey(e), id = treeNode.id; - constructor: function(){ - dojo.deprecated("dijit.layout.AccordionPane deprecated, use ContentPane instead", "", "2.0"); - }, + // 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); + }, - onSelected: function(){ - // summary: - // called when this pane is selected - } -}); + 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; + }, -if(!dojo._hasResource["dijit.layout.AccordionContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.layout.AccordionContainer"] = true; -dojo.provide("dijit.layout.AccordionContainer"); + _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; + } + } + } + }, -//dojo.require("dijit.layout.AccordionPane "); // for back compat, remove for 2.0 + getItem: function(/*String*/ key){ + // summary: + // Returns the dojo.dnd.Item (representing a dragged node) by it's key (id). + // Called by dojo.dnd.Source.checkAcceptance(). + // tags: + // protected -// 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 widget = this.selection[key]; + return { + data: widget, + type: ["treeNode"] + }; // dojo.dnd.Item + }, -dojo.declare( - "dijit.layout.AccordionContainer", - dijit.layout.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 dojoType="dijit.layout.AccordionContainer"> - // | <div dojoType="dijit.layout.ContentPane" title="pane 1"> - // | </div> - // | <div dojoType="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: dijit.defaultDuration, + forInSelectedItems: function(/*Function*/ f, /*Object?*/ o){ + // summary: + // Iterates over selected items; + // see `dojo.dnd.Container.forInItems()` for details + o = o || win.global; + for(var id in this.selection){ + // console.log("selected item id: " + id); + f.call(o, this.getItem(id), id, this); + } + } + }); +}); - // buttonWidget: [const] String - // The name of the widget used to display the title of each pane - buttonWidget: "dijit.layout._AccordionButton", +}, +'dijit/_Container':function(){ +define("dijit/_Container", [ + "dojo/_base/array", // array.forEach array.indexOf + "dojo/_base/declare", // declare + "dojo/dom-construct", // domConstruct.place + "./registry" // registry.byNode() +], function(array, declare, domConstruct, registry){ + + // module: + // dijit/_Container + // summary: + // Mixin for widgets that contain a set of widget children. -/*===== - // _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", + return declare("dijit._Container", null, { + // summary: + // Mixin for widgets that contain a set of widget children. + // description: + // Use this mixin for widgets that needs to know about and + // keep track of their widget children. Suitable for widgets like BorderContainer + // and TabContainer which contain (only) a set of child widgets. + // + // It's not suitable for widgets like ContentPane + // which contains mixed HTML (plain DOM nodes in addition to widgets), + // and where contained widgets are not necessarily directly below + // this.containerNode. In that case calls like addChild(node, position) + // wouldn't make sense. buildRendering: function(){ this.inherited(arguments); - this.domNode.style.overflow = "hidden"; // TODO: put this in dijit.css - dijit.setWaiRole(this.domNode, "tablist"); // TODO: put this in template - }, - - startup: function(){ - if(this._started){ return; } - this.inherited(arguments); - if(this.selectedChildWidget){ - var style = this.selectedChildWidget.containerNode.style; - style.display = ""; - style.overflow = "auto"; - this.selectedChildWidget._wrapperWidget.set("selected", true); + if(!this.containerNode){ + // all widgets with descendants must set containerNode + this.containerNode = this.domNode; } }, - 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 = dojo._getMarginExtents(wrapperDomNode), - wrapperDomNodePadBorder = dojo._getPadBorderExtents(wrapperDomNode), - wrapperContainerNode = openPane._wrapperWidget.containerNode, - wrapperContainerNodeMargin = dojo._getMarginExtents(wrapperContainerNode), - wrapperContainerNodePadBorder = dojo._getPadBorderExtents(wrapperContainerNode), - mySize = this._contentBox; + addChild: function(/*dijit._Widget*/ 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). - // get cumulative height of all the unselected title bars - var totalCollapsedHeight = 0; - dojo.forEach(this.getChildren(), function(child){ - if(child != openPane){ - totalCollapsedHeight += dojo._getMarginSize(child._wrapperWidget.domNode).h; + 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"; } - }); - 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 = new dijit.layout._AccordionInnerContainer({ - contentWidget: child, - buttonWidget: this.buttonWidget, - id: child.id + "_wrapper", - dir: child.dir, - lang: child.lang, - parent: this - }); - - this.inherited(arguments); - }, - - addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){ - 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 - dojo.place(child.domNode, this.containerNode, insertIndex); - - if(!child._started){ - child.startup(); - } - - // Then stick the wrapper widget around the child widget - this._setupChild(child); + domConstruct.place(widget.domNode, refNode, insertIndex); - // Code below copied from StackContainer - dojo.publish(this.id+"-addChild", [child, insertIndex]); - 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); + // 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(child){ - // Overrides _LayoutWidget.removeChild(). + 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 - // 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){ - dojo.place(child.domNode, child._wrapperWidget.domNode, "after"); - child._wrapperWidget.destroy(); - delete child._wrapperWidget; + if(typeof widget == "number"){ + widget = this.getChildren()[widget]; } - dojo.removeClass(child.domNode, "dijitHidden"); - - this.inherited(arguments); - }, - - getChildren: function(){ - // Overrides _Container.getChildren() to return content panes rather than internal AccordionInnerContainer panes - return dojo.map(this.inherited(arguments), function(child){ - return child.declaredClass == "dijit.layout._AccordionInnerContainer" ? child.contentWidget : child; - }, this); - }, - - destroy: function(){ - if(this._animation){ - this._animation.stop(); - } - dojo.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(); + if(widget){ + var node = widget.domNode; + if(node && node.parentNode){ + node.parentNode.removeChild(node); // detach but don't destroy } - }); - 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); + hasChildren: function(){ + // summary: + // Returns true if widget has children, i.e. if this.containerNode contains something. + return this.getChildren().length > 0; // Boolean }, - _hideChild: function(child){ - // Override StackContainer._showChild() to set visibility of _wrapperWidget.containerNode - child._wrapperWidget.containerNode.style.display="none"; - this.inherited(arguments); + _getSiblingOfChild: function(/*dijit._Widget*/ 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 node = child.domNode, + which = (dir>0 ? "nextSibling" : "previousSibling"); + do{ + node = node[which]; + }while(node && (node.nodeType != 1 || !registry.byNode(node))); + return node && registry.byNode(node); // dijit._Widget }, - _transition: function(/*dijit._Widget?*/ newWidget, /*dijit._Widget?*/ oldWidget, /*Boolean*/ animate){ - // Overrides StackContainer._transition() to provide sliding of title bars etc. + getIndexOfChild: function(/*dijit._Widget*/ child){ + // summary: + // Gets the index of the child in this container or -1 if not found + return array.indexOf(this.getChildren(), child); // int + } + }); +}); - if(dojo.isIE < 8){ - // workaround animation bugs by not animating; not worth supporting animation for IE6 & 7 - animate = false; - } +}, +'dojo/data/ItemFileReadStore':function(){ +define("dojo/data/ItemFileReadStore", ["../_base/kernel", "../_base/lang", "../_base/declare", "../_base/array", "../_base/xhr", + "../Evented", "../_base/window", "./util/filter", "./util/simpleFetch", "../date/stamp" +], function(kernel, lang, declare, array, xhr, Evented, window, filterUtil, simpleFetch, dateStamp) { + // module: + // dojo/data/ItemFileReadStore + // summary: + // TODOC - 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; +var ItemFileReadStore = declare("dojo.data.ItemFileReadStore", [Evented],{ + // summary: + // The ItemFileReadStore implements the dojo.data.api.Read API and reads + // data from JSON files that have contents in this format -- + // { items: [ + // { name:'Kermit', color:'green', age:12, friends:['Gonzo', {_reference:{name:'Fozzie Bear'}}]}, + // { name:'Fozzie Bear', wears:['hat', 'tie']}, + // { name:'Miss Piggy', pets:'Foo-Foo'} + // ]} + // Note that it can also contain an 'identifer' property that specified which attribute on the items + // in the array of items that acts as the unique identifier for that item. + // + constructor: function(/* Object */ keywordParameters){ + // summary: constructor + // keywordParameters: {url: String} + // keywordParameters: {data: jsonObject} + // keywordParameters: {typeMap: object) + // The structure of the typeMap object is as follows: + // { + // type0: function || object, + // type1: function || object, + // ... + // typeN: function || object + // } + // Where if it is a function, it is assumed to be an object constructor that takes the + // value of _value as the initialization parameters. If it is an object, then it is assumed + // to be an object of general form: + // { + // type: function, //constructor. + // deserialize: function(value) //The function that parses the value and constructs the object defined by type appropriately. + // } - if(newWidget){ - newWidget._wrapperWidget.set("selected", true); + this._arrayOfAllItems = []; + this._arrayOfTopLevelItems = []; + this._loadFinished = false; + this._jsonFileUrl = keywordParameters.url; + this._ccUrl = keywordParameters.url; + this.url = keywordParameters.url; + this._jsonData = keywordParameters.data; + this.data = null; + this._datatypeMap = keywordParameters.typeMap || {}; + if(!this._datatypeMap['Date']){ + //If no default mapping for dates, then set this as default. + //We use the dojo.date.stamp here because the ISO format is the 'dojo way' + //of generically representing dates. + this._datatypeMap['Date'] = { + type: Date, + deserialize: function(value){ + return dateStamp.fromISOString(value); + } + }; + } + this._features = {'dojo.data.api.Read':true, 'dojo.data.api.Identity':true}; + this._itemsByIdentity = null; + this._storeRefPropName = "_S"; // Default name for the store reference to attach to every item. + this._itemNumPropName = "_0"; // Default Item Id for isItem to attach to every item. + this._rootItemPropName = "_RI"; // Default Item Id for isItem to attach to every item. + this._reverseRefMap = "_RRM"; // Default attribute for constructing a reverse reference map for use with reference integrity + this._loadInProgress = false; //Got to track the initial load to prevent duelling loads of the dataset. + this._queuedFetches = []; + if(keywordParameters.urlPreventCache !== undefined){ + this.urlPreventCache = keywordParameters.urlPreventCache?true:false; + } + if(keywordParameters.hierarchical !== undefined){ + this.hierarchical = keywordParameters.hierarchical?true:false; + } + if(keywordParameters.clearOnClose){ + this.clearOnClose = true; + } + if("failOk" in keywordParameters){ + this.failOk = keywordParameters.failOk?true:false; + } + }, - var d = this._showChild(newWidget); // prepare widget to be slid in + url: "", // use "" rather than undefined for the benefit of the parser (#3539) - // 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); - } - } + //Internal var, crossCheckUrl. Used so that setting either url or _jsonFileUrl, can still trigger a reload + //when clearOnClose and close is used. + _ccUrl: "", - if(oldWidget){ - oldWidget._wrapperWidget.set("selected", false); - if(!animate){ - this._hideChild(oldWidget); - } - } + data: null, // define this so that the parser can populate it - if(animate){ - var newContents = newWidget._wrapperWidget.containerNode, - oldContents = oldWidget._wrapperWidget.containerNode; + typeMap: null, //Define so parser can populate. - // 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 = dojo._getMarginExtents(wrapperContainerNode), - wrapperContainerNodePadBorder = dojo._getPadBorderExtents(wrapperContainerNode), - animationHeightOverhead = wrapperContainerNodeMargin.h + wrapperContainerNodePadBorder.h; + //Parameter to allow users to specify if a close call should force a reload or not. + //By default, it retains the old behavior of not clearing if close is called. But + //if set true, the store will be reset to default state. Note that by doing this, + //all item handles will become invalid and a new fetch must be issued. + clearOnClose: false, - oldContents.style.height = (self._verticalSpace - animationHeightOverhead) + "px"; + //Parameter to allow specifying if preventCache should be passed to the xhrGet call or not when loading data from a url. + //Note this does not mean the store calls the server on each fetch, only that the data load has preventCache set as an option. + //Added for tracker: #6072 + urlPreventCache: false, - this._animation = new dojo.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(); - } + //Parameter for specifying that it is OK for the xhrGet call to fail silently. + failOk: false, - return d; // If child has an href, promise that fires when the widget has finished loading - }, + //Parameter to indicate to process data from the url as hierarchical + //(data items can contain other data items in js form). Default is true + //for backwards compatibility. False means only root items are processed + //as items, all child objects outside of type-mapped objects and those in + //specific reference format, are left straight JS data objects. + hierarchical: true, - // note: we are treating the container as controller here - _onKeyPress: function(/*Event*/ e, /*dijit._Widget*/ 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 k = dojo.keys, - c = e.charOrCode; - if((fromTitle && (c == k.LEFT_ARROW || c == k.UP_ARROW)) || - (e.ctrlKey && c == k.PAGE_UP)){ - this._adjacent(false)._buttonWidget._onTitleClick(); - dojo.stopEvent(e); - }else if((fromTitle && (c == k.RIGHT_ARROW || c == k.DOWN_ARROW)) || - (e.ctrlKey && (c == k.PAGE_DOWN || c == k.TAB))){ - this._adjacent(true)._buttonWidget._onTitleClick(); - dojo.stopEvent(e); - } + _assertIsItem: function(/* item */ item){ + // summary: + // This function tests whether the item passed in is indeed an item in the store. + // item: + // The item to test for being contained by the store. + if(!this.isItem(item)){ + throw new Error("dojo.data.ItemFileReadStore: Invalid item argument."); } - } -); - -dojo.declare("dijit.layout._AccordionInnerContainer", - [dijit._Widget, dijit._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: String - // Name of 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._Widget - // Pointer to the real child widget - contentWidget: null, -=====*/ - - baseClass: "dijitAccordionInnerContainer", - - // tell nested layout widget that we will take care of sizing - isContainer: true, - isLayoutContainer: true, + }, - buildRendering: function(){ - // Builds a template like: - // <div class=dijitAccordionInnerContainer> - // Button - // <div class=dijitAccordionChildWrapper> - // ContentPane - // </div> - // </div> + _assertIsAttribute: function(/* attribute-name-string */ attribute){ + // summary: + // This function tests whether the item passed in is indeed a valid 'attribute' like type for the store. + // attribute: + // The attribute to test for being contained by the store. + if(typeof attribute !== "string"){ + throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument."); + } + }, - // Create wrapper div, placed where the child is now - this.domNode = dojo.place("<div class='" + this.baseClass + "'>", this.contentWidget.domNode, "after"); - - // wrapper div's first child is the button widget (ie, the title bar) - var child = this.contentWidget, - cls = dojo.getObject(this.buttonWidget); - this.button = child._buttonWidget = (new cls({ - contentWidget: child, - label: child.title, - title: child.tooltip, - dir: child.dir, - lang: child.lang, - 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 = dojo.place("<div class='dijitAccordionChildWrapper' style='display:none'>", this.domNode); - dojo.place(this.contentWidget.domNode, this.containerNode); - }, + getValue: function( /* item */ item, + /* attribute-name-string */ attribute, + /* value? */ defaultValue){ + // summary: + // See dojo.data.api.Read.getValue() + var values = this.getValues(item, attribute); + return (values.length > 0)?values[0]:defaultValue; // mixed + }, - postCreate: function(){ - this.inherited(arguments); + getValues: function(/* item */ item, + /* attribute-name-string */ attribute){ + // summary: + // See dojo.data.api.Read.getValues() - // Map changes in content widget's title etc. to changes in the button - var button = this.button; - this._contentWidgetWatches = [ - this.contentWidget.watch('title', dojo.hitch(this, function(name, oldValue, newValue){ - button.set("label", newValue); - })), - this.contentWidget.watch('tooltip', dojo.hitch(this, function(name, oldValue, newValue){ - button.set("title", newValue); - })), - this.contentWidget.watch('iconClass', dojo.hitch(this, function(name, oldValue, newValue){ - button.set("iconClass", newValue); - })) - ]; - }, + this._assertIsItem(item); + this._assertIsAttribute(attribute); + // Clone it before returning. refs: #10474 + return (item[attribute] || []).slice(0); // Array + }, - _setSelectedAttr: function(/*Boolean*/ isSelected){ - this._set("selected", isSelected); - this.button.set("selected", isSelected); - if(isSelected){ - var cw = this.contentWidget; - if(cw.onSelected){ cw.onSelected(); } + getAttributes: function(/* item */ item){ + // summary: + // See dojo.data.api.Read.getAttributes() + this._assertIsItem(item); + var attributes = []; + for(var key in item){ + // Save off only the real item attributes, not the special id marks for O(1) isItem. + if((key !== this._storeRefPropName) && (key !== this._itemNumPropName) && (key !== this._rootItemPropName) && (key !== this._reverseRefMap)){ + attributes.push(key); } - }, - - startup: function(){ - // Called by _Container.addChild() - this.contentWidget.startup(); - }, - - destroy: function(){ - this.button.destroyRecursive(); - - dojo.forEach(this._contentWidgetWatches || [], function(w){ w.unwatch(); }); - - delete this.contentWidget._buttonWidget; - delete this.contentWidget._wrapperWidget; - - this.inherited(arguments); - }, - - destroyDescendants: function(){ - // since getChildren isn't working for me, have to code this manually - this.contentWidget.destroyRecursive(); } -}); + return attributes; // Array + }, -dojo.declare("dijit.layout._AccordionButton", - [dijit._Widget, dijit._Templated, dijit._CssStateMixin], - { - // summary: - // The title bar to click to open up an accordion pane. - // Internal widget used by AccordionContainer. - // tags: - // private - - templateString: dojo.cache("dijit.layout", "templates/AccordionButton.html", "<div dojoAttachEvent='onclick:_onTitleClick' class='dijitAccordionTitle'>\n\t<div dojoAttachPoint='titleNode,focusNode' dojoAttachEvent='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\" dojoAttachPoint='iconNode' style=\"vertical-align: middle\" role=\"presentation\"/>\n\t\t<span role=\"presentation\" dojoAttachPoint='titleTextNode' class='dijitAccordionText'></span>\n\t</div>\n</div>\n"), - attributeMap: dojo.mixin(dojo.clone(dijit.layout.ContentPane.prototype.attributeMap), { - label: {node: "titleTextNode", type: "innerHTML" }, - title: {node: "titleTextNode", type: "attribute", attribute: "title"}, - iconClass: { 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(' ','_'); - dojo.attr(this.titleTextNode, "id", titleTextNodeId+"_title"); - dijit.setWaiState(this.focusNode, "labelledby", dojo.attr(this.titleTextNode, "id")); - dojo.setSelectable(this.domNode, false); - }, - - getTitleHeight: function(){ - // summary: - // Returns the height of the title dom node. - return dojo._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); - dijit.focus(this.focusNode); - }, - - _onTitleKeyPress: function(/*Event*/ evt){ - return this.getParent()._onKeyPress(evt, this.contentWidget); + hasAttribute: function( /* item */ item, + /* attribute-name-string */ attribute){ + // summary: + // See dojo.data.api.Read.hasAttribute() + this._assertIsItem(item); + this._assertIsAttribute(attribute); + return (attribute in item); }, - _setSelectedAttr: function(/*Boolean*/ isSelected){ - this._set("selected", isSelected); - dijit.setWaiState(this.focusNode, "expanded", isSelected); - dijit.setWaiState(this.focusNode, "selected", isSelected); - this.focusNode.setAttribute("tabIndex", isSelected ? "0" : "-1"); - } -}); - -} - -if(!dojo._hasResource["dijit.layout.BorderContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.layout.BorderContainer"] = true; -dojo.provide("dijit.layout.BorderContainer"); - - - - - -dojo.declare( - "dijit.layout.BorderContainer", - dijit.layout._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 conrol layout precedence of horizontal vs. vertical panes. - // example: - // | <div dojoType="dijit.layout.BorderContainer" design="sidebar" gutters="false" - // | style="width: 400px; height: 300px;"> - // | <div dojoType="dijit.layout.ContentPane" region="top">header text</div> - // | <div dojoType="dijit.layout.ContentPane" region="right" splitter="true" style="width: 200px;">table of contents</div> - // | <div dojoType="dijit.layout.ContentPane" 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: String - // Optional hook to override the default Splitter widget used by BorderContainer - _splitterClass: "dijit.layout._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"; + containsValue: function(/* item */ item, + /* attribute-name-string */ attribute, + /* anything */ value){ + // summary: + // See dojo.data.api.Read.containsValue() + var regexp = undefined; + if(typeof value === "string"){ + regexp = filterUtil.patternToRegExp(value, false); } - this.inherited(arguments); + return this._containsValue(item, attribute, value, regexp); //boolean. }, - startup: function(){ - if(this._started){ return; } - dojo.forEach(this.getChildren(), this._setupChild, this); - this.inherited(arguments); + _containsValue: function( /* item */ item, + /* attribute-name-string */ attribute, + /* anything */ value, + /* RegExp?*/ regexp){ + // summary: + // Internal function for looking at the values contained by the item. + // description: + // Internal function for looking at the values contained by the item. This + // function allows for denoting if the comparison should be case sensitive for + // strings or not (for handling filtering cases where string case should not matter) + // + // item: + // The data item to examine for attribute values. + // attribute: + // The attribute to inspect. + // value: + // The value to match. + // regexp: + // Optional regular expression generated off value if value was of string type to handle wildcarding. + // If present and attribute values are string, then it can be used for comparison instead of 'value' + return array.some(this.getValues(item, attribute), function(possibleValue){ + if(possibleValue !== null && !lang.isObject(possibleValue) && regexp){ + if(possibleValue.toString().match(regexp)){ + return true; // Boolean + } + }else if(value === possibleValue){ + return true; // Boolean + } + }); }, - _setupChild: function(/*dijit._Widget*/ child){ - // Override _LayoutWidget._setupChild(). - - var region = child.region; - if(region){ - this.inherited(arguments); - - dojo.addClass(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 = dojo.getObject(child.splitter ? this._splitterClass : "dijit.layout._Gutter"); - var splitter = new _Splitter({ - id: child.id + "_splitter", - container: this, - child: child, - region: region, - live: this.liveSplitters - }); - splitter.isSplitter = true; - child._splitterWidget = splitter; - - dojo.place(splitter.domNode, child.domNode, "after"); - - // Splitters aren't added as Contained children, so we need to call startup explicitly - splitter.startup(); + isItem: function(/* anything */ something){ + // summary: + // See dojo.data.api.Read.isItem() + if(something && something[this._storeRefPropName] === this){ + if(this._arrayOfAllItems[something[this._itemNumPropName]] === something){ + return true; } - child.region = region; // TODO: technically wrong since it overwrites "trailing" with "left" etc. } + return false; // Boolean }, - layout: function(){ - // Implement _LayoutWidget.layout() virtual method. - this._layoutChildren(); - }, - - addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){ - // Override _LayoutWidget.addChild(). - this.inherited(arguments); - if(this._started){ - this.layout(); //OPT - } + isItemLoaded: function(/* anything */ something){ + // summary: + // See dojo.data.api.Read.isItemLoaded() + return this.isItem(something); //boolean }, - removeChild: function(/*dijit._Widget*/ 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. - dojo.removeClass(child.domNode, this.baseClass+"Pane"); - dojo.style(child.domNode, { - top: "auto", - bottom: "auto", - left: "auto", - right: "auto", - position: "static" - }); - dojo.style(child.domNode, region == "top" || region == "bottom" ? "width" : "height", "auto"); + loadItem: function(/* object */ keywordArgs){ + // summary: + // See dojo.data.api.Read.loadItem() + this._assertIsItem(keywordArgs.item); }, - getChildren: function(){ - // Override _LayoutWidget.getChildren() to only return real children, not the splitters. - return dojo.filter(this.inherited(arguments), function(widget){ - return !widget.isSplitter; - }); + getFeatures: function(){ + // summary: + // See dojo.data.api.Read.getFeatures() + return this._features; //Object }, - // TODO: remove in 2.0 - getSplitter: function(/*String*/region){ - // summary: - // Returns the widget responsible for rendering the splitter associated with region - // tags: - // deprecated - return dojo.filter(this.getChildren(), function(child){ - return child.region == region; - })[0]._splitterWidget; + getLabel: function(/* item */ item){ + // summary: + // See dojo.data.api.Read.getLabel() + if(this._labelAttr && this.isItem(item)){ + return this.getValue(item,this._labelAttr); //String + } + return undefined; //undefined }, - 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 = dojo.getComputedStyle(node); - this.pe = dojo._getPadExtents(node, this.cs); - this.pe.r = dojo._toPixelValue(node, this.cs.paddingRight); - this.pe.b = dojo._toPixelValue(node, this.cs.paddingBottom); - - dojo.style(node, "padding", "0px"); + getLabelAttributes: function(/* item */ item){ + // summary: + // See dojo.data.api.Read.getLabelAttributes() + if(this._labelAttr){ + return [this._labelAttr]; //array } - - this.inherited(arguments); + return null; //null }, - _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; - } + _fetchItems: function( /* Object */ keywordArgs, + /* Function */ findCallback, + /* Function */ errorCallback){ + // summary: + // See dojo.data.util.simpleFetch.fetch() + var self = this, + filter = function(requestArgs, arrayOfItems){ + var items = [], + i, key; + if(requestArgs.query){ + var value, + ignoreCase = requestArgs.queryOptions ? requestArgs.queryOptions.ignoreCase : false; - // 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 = dojo.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]; + //See if there are any string values that can be regexp parsed first to avoid multiple regexp gens on the + //same value for each item examined. Much more efficient. + var regexpList = {}; + for(key in requestArgs.query){ + value = requestArgs.query[key]; + if(typeof value === "string"){ + regexpList[key] = filterUtil.patternToRegExp(value, ignoreCase); + }else if(value instanceof RegExp){ + regexpList[key] = value; + } } + for(i = 0; i < arrayOfItems.length; ++i){ + var match = true; + var candidateItem = arrayOfItems[i]; + if(candidateItem === null){ + match = false; + }else{ + for(key in requestArgs.query){ + value = requestArgs.query[key]; + if(!self._containsValue(candidateItem, key, value, regexpList[key])){ + match = false; + } + } + } + if(match){ + items.push(candidateItem); + } + } + findCallback(items, requestArgs); + }else{ + // We want a copy to pass back in case the parent wishes to sort the array. + // We shouldn't allow resort of the internal list, so that multiple callers + // can get lists and sort without affecting each other. We also need to + // filter out any null values that have been left as a result of deleteItem() + // calls in ItemFileWriteStore. + for(i = 0; i < arrayOfItems.length; ++i){ + var item = arrayOfItems[i]; + if(item !== null){ + items.push(item); + } + } + findCallback(items, requestArgs); } - return 0; - }); - - // Make new list, combining the externally specified children with splitters and gutters - var childrenAndSplitters = []; - dojo.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 - dijit.layout.layoutChildren(this.domNode, dim, childrenAndSplitters, - changedChildId, changedChildSize); - }, - - destroyRecursive: function(){ - // Destroy splitters first, while getChildren() still works - dojo.forEach(this.getChildren(), function(child){ - var splitter = child._splitterWidget; - if(splitter){ - splitter.destroy(); + if(this._loadFinished){ + filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions)); + }else{ + //Do a check on the JsonFileUrl and crosscheck it. + //If it doesn't match the cross-check, it needs to be updated + //This allows for either url or _jsonFileUrl to he changed to + //reset the store load location. Done this way for backwards + //compatibility. People use _jsonFileUrl (even though officially + //private. + if(this._jsonFileUrl !== this._ccUrl){ + kernel.deprecated("dojo.data.ItemFileReadStore: ", + "To change the url, set the url property of the store," + + " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0"); + this._ccUrl = this._jsonFileUrl; + this.url = this._jsonFileUrl; + }else if(this.url !== this._ccUrl){ + this._jsonFileUrl = this.url; + this._ccUrl = this.url; } - delete child._splitterWidget; - }); - // Then destroy the real children, and myself - this.inherited(arguments); - } -}); + //See if there was any forced reset of data. + if(this.data != null){ + this._jsonData = this.data; + this.data = null; + } -// This argument can be specified for the children of a BorderContainer. -// 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.) -dojo.extend(dijit._Widget, { - // region: [const] String - // Parameter for children of `dijit.layout.BorderContainer`. - // Values: "top", "bottom", "leading", "trailing", "left", "right", "center". - // See the `dijit.layout.BorderContainer` description for details. - region: '', + if(this._jsonFileUrl){ + //If fetches come in before the loading has finished, but while + //a load is in progress, we have to defer the fetching to be + //invoked in the callback. + if(this._loadInProgress){ + this._queuedFetches.push({args: keywordArgs, filter: filter}); + }else{ + this._loadInProgress = true; + var getArgs = { + url: self._jsonFileUrl, + handleAs: "json-comment-optional", + preventCache: this.urlPreventCache, + failOk: this.failOk + }; + var getHandler = xhr.get(getArgs); + getHandler.addCallback(function(data){ + try{ + self._getItemsFromLoadedData(data); + self._loadFinished = true; + self._loadInProgress = false; - // layoutPriority: [const] Number - // Parameter for children of `dijit.layout.BorderContainer`. - // Children with a higher layoutPriority will be placed closer to the BorderContainer center, - // between children with a lower layoutPriority. - layoutPriority: 0, + filter(keywordArgs, self._getItemsArray(keywordArgs.queryOptions)); + self._handleQueuedFetches(); + }catch(e){ + self._loadFinished = true; + self._loadInProgress = false; + errorCallback(e, keywordArgs); + } + }); + getHandler.addErrback(function(error){ + self._loadInProgress = false; + errorCallback(error, keywordArgs); + }); - // splitter: [const] Boolean - // Parameter for child of `dijit.layout.BorderContainer` 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, + //Wire up the cancel to abort of the request + //This call cancel on the deferred if it hasn't been called + //yet and then will chain to the simple abort of the + //simpleFetch keywordArgs + var oldAbort = null; + if(keywordArgs.abort){ + oldAbort = keywordArgs.abort; + } + keywordArgs.abort = function(){ + var df = getHandler; + if(df && df.fired === -1){ + df.cancel(); + df = null; + } + if(oldAbort){ + oldAbort.call(keywordArgs); + } + }; + } + }else if(this._jsonData){ + try{ + this._loadFinished = true; + this._getItemsFromLoadedData(this._jsonData); + this._jsonData = null; + filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions)); + }catch(e){ + errorCallback(e, keywordArgs); + } + }else{ + errorCallback(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."), keywordArgs); + } + } + }, - // minSize: [const] Number - // Parameter for children of `dijit.layout.BorderContainer`. - // Specifies a minimum size (in pixels) for this widget when resized by a splitter. - minSize: 0, + _handleQueuedFetches: function(){ + // summary: + // Internal function to execute delayed request in the store. + //Execute any deferred fetches now. + if(this._queuedFetches.length > 0){ + for(var i = 0; i < this._queuedFetches.length; i++){ + var fData = this._queuedFetches[i], + delayedQuery = fData.args, + delayedFilter = fData.filter; + if(delayedFilter){ + delayedFilter(delayedQuery, this._getItemsArray(delayedQuery.queryOptions)); + }else{ + this.fetchItemByIdentity(delayedQuery); + } + } + this._queuedFetches = []; + } + }, - // maxSize: [const] Number - // Parameter for children of `dijit.layout.BorderContainer`. - // Specifies a maximum size (in pixels) for this widget when resized by a splitter. - maxSize: Infinity -}); + _getItemsArray: function(/*object?*/queryOptions){ + // summary: + // Internal function to determine which list of items to search over. + // queryOptions: The query options parameter, if any. + if(queryOptions && queryOptions.deep){ + return this._arrayOfAllItems; + } + return this._arrayOfTopLevelItems; + }, -dojo.declare("dijit.layout._Splitter", [ dijit._Widget, dijit._Templated ], -{ - // 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, + close: function(/*dojo.data.api.Request || keywordArgs || null */ request){ + // summary: + // See dojo.data.api.Read.close() + if(this.clearOnClose && + this._loadFinished && + !this._loadInProgress){ + //Reset all internalsback to default state. This will force a reload + //on next fetch. This also checks that the data or url param was set + //so that the store knows it can get data. Without one of those being set, + //the next fetch will trigger an error. - // child: [const] dijit.layout._LayoutWidget - // Pointer to the pane associated with this splitter - child: null, + if(((this._jsonFileUrl == "" || this._jsonFileUrl == null) && + (this.url == "" || this.url == null) + ) && this.data == null){ + console.debug("dojo.data.ItemFileReadStore: WARNING! Data reload " + + " information has not been provided." + + " Please set 'url' or 'data' to the appropriate value before" + + " the next fetch"); + } + this._arrayOfAllItems = []; + this._arrayOfTopLevelItems = []; + this._loadFinished = false; + this._itemsByIdentity = null; + this._loadInProgress = false; + this._queuedFetches = []; + } + }, - // region: [const] String - // Region of pane associated with this splitter. - // "top", "bottom", "left", "right". - region: null, -=====*/ + _getItemsFromLoadedData: function(/* Object */ dataObject){ + // summary: + // Function to parse the loaded data into item format and build the internal items array. + // description: + // Function to parse the loaded data into item format and build the internal items array. + // + // dataObject: + // The JS data object containing the raw data to convery into item format. + // + // returns: array + // Array of items in store item format. - // 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, + // First, we define a couple little utility functions... + var addingArrays = false, + self = this; - templateString: '<div class="dijitSplitter" dojoAttachEvent="onkeypress:_onKeyPress,onmousedown:_startDrag,onmouseenter:_onMouse,onmouseleave:_onMouse" tabIndex="0" role="separator"><div class="dijitSplitterThumb"></div></div>', + function valueIsAnItem(/* anything */ aValue){ + // summary: + // Given any sort of value that could be in the raw json data, + // return true if we should interpret the value as being an + // item itself, rather than a literal value or a reference. + // example: + // | false == valueIsAnItem("Kermit"); + // | false == valueIsAnItem(42); + // | false == valueIsAnItem(new Date()); + // | false == valueIsAnItem({_type:'Date', _value:'1802-05-14'}); + // | false == valueIsAnItem({_reference:'Kermit'}); + // | true == valueIsAnItem({name:'Kermit', color:'green'}); + // | true == valueIsAnItem({iggy:'pop'}); + // | true == valueIsAnItem({foo:42}); + return (aValue !== null) && + (typeof aValue === "object") && + (!lang.isArray(aValue) || addingArrays) && + (!lang.isFunction(aValue)) && + (aValue.constructor == Object || lang.isArray(aValue)) && + (typeof aValue._reference === "undefined") && + (typeof aValue._type === "undefined") && + (typeof aValue._value === "undefined") && + self.hierarchical; + } - postMixInProperties: function(){ - this.inherited(arguments); + function addItemAndSubItemsToArrayOfAllItems(/* Item */ anItem){ + self._arrayOfAllItems.push(anItem); + for(var attribute in anItem){ + var valueForAttribute = anItem[attribute]; + if(valueForAttribute){ + if(lang.isArray(valueForAttribute)){ + var valueArray = valueForAttribute; + for(var k = 0; k < valueArray.length; ++k){ + var singleValue = valueArray[k]; + if(valueIsAnItem(singleValue)){ + addItemAndSubItemsToArrayOfAllItems(singleValue); + } + } + }else{ + if(valueIsAnItem(valueForAttribute)){ + addItemAndSubItemsToArrayOfAllItems(valueForAttribute); + } + } + } + } + } - this.horizontal = /top|bottom/.test(this.region); - this._factor = /top|left/.test(this.region) ? 1 : -1; - this._cookieName = this.container.id + "_" + this.region; - }, + this._labelAttr = dataObject.label; - buildRendering: function(){ - this.inherited(arguments); + // We need to do some transformations to convert the data structure + // that we read from the file into a format that will be convenient + // to work with in memory. - dojo.addClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V")); + // Step 1: Walk through the object hierarchy and build a list of all items + var i, + item; + this._arrayOfAllItems = []; + this._arrayOfTopLevelItems = dataObject.items; - if(this.container.persist){ - // restore old size - var persistSize = dojo.cookie(this._cookieName); - if(persistSize){ - this.child.domNode.style[this.horizontal ? "height" : "width"] = persistSize; + for(i = 0; i < this._arrayOfTopLevelItems.length; ++i){ + item = this._arrayOfTopLevelItems[i]; + if(lang.isArray(item)){ + addingArrays = true; } + addItemAndSubItemsToArrayOfAllItems(item); + item[this._rootItemPropName]=true; } - }, - - _computeMaxSize: function(){ - // summary: - // Return the maximum size that my corresponding pane can be set to - - var dim = this.horizontal ? 'h' : 'w', - childSize = dojo.marginBox(this.child.domNode)[dim], - center = dojo.filter(this.container.getChildren(), function(child){ return child.region == "center";})[0], - spaceAvailable = dojo.marginBox(center.domNode)[dim]; // can expand until center is crushed to 0 - return Math.min(this.child.maxSize, childSize + spaceAvailable); - }, + // Step 2: Walk through all the attribute values of all the items, + // and replace single values with arrays. For example, we change this: + // { name:'Miss Piggy', pets:'Foo-Foo'} + // into this: + // { name:['Miss Piggy'], pets:['Foo-Foo']} + // + // We also store the attribute names so we can validate our store + // reference and item id special properties for the O(1) isItem + var allAttributeNames = {}, + key; - _startDrag: function(e){ - if(!this.cover){ - this.cover = dojo.doc.createElement('div'); - dojo.addClass(this.cover, "dijitSplitterCover"); - dojo.place(this.cover, this.child.domNode, "after"); + for(i = 0; i < this._arrayOfAllItems.length; ++i){ + item = this._arrayOfAllItems[i]; + for(key in item){ + if(key !== this._rootItemPropName){ + var value = item[key]; + if(value !== null){ + if(!lang.isArray(value)){ + item[key] = [value]; + } + }else{ + item[key] = [null]; + } + } + allAttributeNames[key]=key; + } } - dojo.addClass(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){ dojo.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"); - dojo.addClass(this.domNode, "dijitSplitterShadow"); - dojo.place(this.fake, this.domNode, "after"); + // Step 3: Build unique property names to use for the _storeRefPropName and _itemNumPropName + // This should go really fast, it will generally never even run the loop. + while(allAttributeNames[this._storeRefPropName]){ + this._storeRefPropName += "_"; } - dojo.addClass(this.domNode, "dijitSplitterActive dijitSplitter" + (this.horizontal ? "H" : "V") + "Active"); - if(this.fake){ - dojo.removeClass(this.fake, "dijitSplitterHover dijitSplitter" + (this.horizontal ? "H" : "V") + "Hover"); + while(allAttributeNames[this._itemNumPropName]){ + this._itemNumPropName += "_"; + } + while(allAttributeNames[this._reverseRefMap]){ + this._reverseRefMap += "_"; } - //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 = dojo.marginBox(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 = dojo.hitch(this.container, "_layoutChildren", this.child.id), - de = dojo.doc; - - this._handlers = (this._handlers || []).concat([ - dojo.connect(de, "onmousemove", this._drag = function(e, forceResize){ - var delta = e[axis] - pageStart, - childSize = factor * delta + childStart, - boundChildSize = Math.max(Math.min(childSize, max), min); + // Step 4: Some data files specify an optional 'identifier', which is + // the name of an attribute that holds the identity of each item. + // If this data file specified an identifier attribute, then build a + // hash table of items keyed by the identity of the items. + var arrayOfValues; - if(resize || forceResize){ - layoutFunc(boundChildSize); + var identifier = dataObject.identifier; + if(identifier){ + this._itemsByIdentity = {}; + this._features['dojo.data.api.Identity'] = identifier; + for(i = 0; i < this._arrayOfAllItems.length; ++i){ + item = this._arrayOfAllItems[i]; + arrayOfValues = item[identifier]; + var identity = arrayOfValues[0]; + if(!Object.hasOwnProperty.call(this._itemsByIdentity, identity)){ + this._itemsByIdentity[identity] = item; + }else{ + if(this._jsonFileUrl){ + throw new Error("dojo.data.ItemFileReadStore: The json data as specified by: [" + this._jsonFileUrl + "] is malformed. Items within the list have identifier: [" + identifier + "]. Value collided: [" + identity + "]"); + }else if(this._jsonData){ + throw new Error("dojo.data.ItemFileReadStore: The json data provided by the creation arguments is malformed. Items within the list have identifier: [" + identifier + "]. Value collided: [" + identity + "]"); + } } - // TODO: setting style directly (usually) sets content box size, need to set margin box size - splitterStyle[splitterAttr] = delta + splitterStart + factor*(boundChildSize - childSize) + "px"; - }), - dojo.connect(de, "ondragstart", dojo.stopEvent), - dojo.connect(dojo.body(), "onselectstart", dojo.stopEvent), - dojo.connect(de, "onmouseup", this, "_stopDrag") - ]); - dojo.stopEvent(e); - }, - - _onMouse: function(e){ - var o = (e.type == "mouseover" || e.type == "mouseenter"); - dojo.toggleClass(this.domNode, "dijitSplitterHover", o); - dojo.toggleClass(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V") + "Hover", o); - }, - - _stopDrag: function(e){ - try{ - if(this.cover){ - dojo.removeClass(this.cover, "dijitSplitterCoverActive"); } - if(this.fake){ dojo.destroy(this.fake); } - dojo.removeClass(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; + }else{ + this._features['dojo.data.api.Identity'] = Number; } - if(this.container.persist){ - dojo.cookie(this._cookieName, this.child.domNode.style[this.horizontal ? "height" : "width"], {expires:365}); + // Step 5: Walk through all the items, and set each item's properties + // for _storeRefPropName and _itemNumPropName, so that store.isItem() will return true. + for(i = 0; i < this._arrayOfAllItems.length; ++i){ + item = this._arrayOfAllItems[i]; + item[this._storeRefPropName] = this; + item[this._itemNumPropName] = i; } - }, - - _cleanupHandlers: function(){ - dojo.forEach(this._handlers, dojo.disconnect); - delete this._handlers; - }, - _onKeyPress: function(/*Event*/ e){ - // should we apply typematic to this? - this._resize = true; - var horizontal = this.horizontal; - var tick = 1; - var dk = dojo.keys; - switch(e.charOrCode){ - case horizontal ? dk.UP_ARROW : dk.LEFT_ARROW: - tick *= -1; -// break; - case horizontal ? dk.DOWN_ARROW : dk.RIGHT_ARROW: - break; - default: -// this.inherited(arguments); - return; + // Step 6: We walk through all the attribute values of all the items, + // looking for type/value literals and item-references. + // + // We replace item-references with pointers to items. For example, we change: + // { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] } + // into this: + // { name:['Kermit'], friends:[miss_piggy] } + // (where miss_piggy is the object representing the 'Miss Piggy' item). + // + // We replace type/value pairs with typed-literals. For example, we change: + // { name:['Nelson Mandela'], born:[{_type:'Date', _value:'1918-07-18'}] } + // into this: + // { name:['Kermit'], born:(new Date(1918, 6, 18)) } + // + // We also generate the associate map for all items for the O(1) isItem function. + for(i = 0; i < this._arrayOfAllItems.length; ++i){ + item = this._arrayOfAllItems[i]; // example: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] } + for(key in item){ + arrayOfValues = item[key]; // example: [{_reference:{name:'Miss Piggy'}}] + for(var j = 0; j < arrayOfValues.length; ++j){ + value = arrayOfValues[j]; // example: {_reference:{name:'Miss Piggy'}} + if(value !== null && typeof value == "object"){ + if(("_type" in value) && ("_value" in value)){ + var type = value._type; // examples: 'Date', 'Color', or 'ComplexNumber' + var mappingObj = this._datatypeMap[type]; // examples: Date, dojo.Color, foo.math.ComplexNumber, {type: dojo.Color, deserialize(value){ return new dojo.Color(value)}} + if(!mappingObj){ + throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '" + type + "'"); + }else if(lang.isFunction(mappingObj)){ + arrayOfValues[j] = new mappingObj(value._value); + }else if(lang.isFunction(mappingObj.deserialize)){ + arrayOfValues[j] = mappingObj.deserialize(value._value); + }else{ + throw new Error("dojo.data.ItemFileReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function"); + } + } + if(value._reference){ + var referenceDescription = value._reference; // example: {name:'Miss Piggy'} + if(!lang.isObject(referenceDescription)){ + // example: 'Miss Piggy' + // from an item like: { name:['Kermit'], friends:[{_reference:'Miss Piggy'}]} + arrayOfValues[j] = this._getItemByIdentity(referenceDescription); + }else{ + // example: {name:'Miss Piggy'} + // from an item like: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] } + for(var k = 0; k < this._arrayOfAllItems.length; ++k){ + var candidateItem = this._arrayOfAllItems[k], + found = true; + for(var refKey in referenceDescription){ + if(candidateItem[refKey] != referenceDescription[refKey]){ + found = false; + } + } + if(found){ + arrayOfValues[j] = candidateItem; + } + } + } + if(this.referenceIntegrity){ + var refItem = arrayOfValues[j]; + if(this.isItem(refItem)){ + this._addReferenceToMap(refItem, item, key); + } + } + }else if(this.isItem(value)){ + //It's a child item (not one referenced through _reference). + //We need to treat this as a referenced item, so it can be cleaned up + //in a write store easily. + if(this.referenceIntegrity){ + this._addReferenceToMap(value, item, key); + } + } + } + } + } } - var childSize = dojo._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)); - dojo.stopEvent(e); }, - destroy: function(){ - this._cleanupHandlers(); - delete this.child; - delete this.container; - delete this.cover; - delete this.fake; - this.inherited(arguments); - } -}); - -dojo.declare("dijit.layout._Gutter", [dijit._Widget, dijit._Templated], -{ - // 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>', + _addReferenceToMap: function(/*item*/ refItem, /*item*/ parentItem, /*string*/ attribute){ + // summary: + // Method to add an reference map entry for an item and attribute. + // description: + // Method to add an reference map entry for an item and attribute. // + // refItem: + // The item that is referenced. + // parentItem: + // The item that holds the new reference to refItem. + // attribute: + // The attribute on parentItem that contains the new reference. - postMixInProperties: function(){ - this.inherited(arguments); - this.horizontal = /top|bottom/.test(this.region); + //Stub function, does nothing. Real processing is in ItemFileWriteStore. }, - buildRendering: function(){ - this.inherited(arguments); - dojo.addClass(this.domNode, "dijitGutter" + (this.horizontal ? "H" : "V")); - } -}); - -} + getIdentity: function(/* item */ item){ + // summary: + // See dojo.data.api.Identity.getIdentity() + var identifier = this._features['dojo.data.api.Identity']; + if(identifier === Number){ + return item[this._itemNumPropName]; // Number + }else{ + var arrayOfValues = item[identifier]; + if(arrayOfValues){ + return arrayOfValues[0]; // Object || String + } + } + return null; // null + }, -if(!dojo._hasResource["dijit.layout._TabContainerBase"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.layout._TabContainerBase"] = true; -dojo.provide("dijit.layout._TabContainerBase"); + fetchItemByIdentity: function(/* Object */ keywordArgs){ + // summary: + // See dojo.data.api.Identity.fetchItemByIdentity() + // Hasn't loaded yet, we have to trigger the load. + var item, + scope; + if(!this._loadFinished){ + var self = this; + //Do a check on the JsonFileUrl and crosscheck it. + //If it doesn't match the cross-check, it needs to be updated + //This allows for either url or _jsonFileUrl to he changed to + //reset the store load location. Done this way for backwards + //compatibility. People use _jsonFileUrl (even though officially + //private. + if(this._jsonFileUrl !== this._ccUrl){ + kernel.deprecated("dojo.data.ItemFileReadStore: ", + "To change the url, set the url property of the store," + + " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0"); + this._ccUrl = this._jsonFileUrl; + this.url = this._jsonFileUrl; + }else if(this.url !== this._ccUrl){ + this._jsonFileUrl = this.url; + this._ccUrl = this.url; + } + //See if there was any forced reset of data. + if(this.data != null && this._jsonData == null){ + this._jsonData = this.data; + this.data = null; + } + if(this._jsonFileUrl){ -dojo.declare("dijit.layout._TabContainerBase", - [dijit.layout.StackContainer, dijit._Templated], - { - // 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. + if(this._loadInProgress){ + this._queuedFetches.push({args: keywordArgs}); + }else{ + this._loadInProgress = true; + var getArgs = { + url: self._jsonFileUrl, + handleAs: "json-comment-optional", + preventCache: this.urlPreventCache, + failOk: this.failOk + }; + var getHandler = xhr.get(getArgs); + getHandler.addCallback(function(data){ + var scope = keywordArgs.scope?keywordArgs.scope:window.global; + try{ + self._getItemsFromLoadedData(data); + self._loadFinished = true; + self._loadInProgress = false; + item = self._getItemByIdentity(keywordArgs.identity); + if(keywordArgs.onItem){ + keywordArgs.onItem.call(scope, item); + } + self._handleQueuedFetches(); + }catch(error){ + self._loadInProgress = false; + if(keywordArgs.onError){ + keywordArgs.onError.call(scope, error); + } + } + }); + getHandler.addErrback(function(error){ + self._loadInProgress = false; + if(keywordArgs.onError){ + var scope = keywordArgs.scope?keywordArgs.scope:window.global; + keywordArgs.onError.call(scope, error); + } + }); + } - // tabPosition: String - // Defines where tabs go relative to tab content. - // "top", "bottom", "left-h", "right-h" - tabPosition: "top", + }else if(this._jsonData){ + // Passed in data, no need to xhr. + self._getItemsFromLoadedData(self._jsonData); + self._jsonData = null; + self._loadFinished = true; + item = self._getItemByIdentity(keywordArgs.identity); + if(keywordArgs.onItem){ + scope = keywordArgs.scope?keywordArgs.scope:window.global; + keywordArgs.onItem.call(scope, item); + } + } + }else{ + // Already loaded. We can just look it up and call back. + item = this._getItemByIdentity(keywordArgs.identity); + if(keywordArgs.onItem){ + scope = keywordArgs.scope?keywordArgs.scope:window.global; + keywordArgs.onItem.call(scope, item); + } + } + }, - baseClass: "dijitTabContainer", + _getItemByIdentity: function(/* Object */ identity){ + // summary: + // Internal function to look an item up by its identity map. + var item = null; + if(this._itemsByIdentity){ + // If this map is defined, we need to just try to get it. If it fails + // the item does not exist. + if(Object.hasOwnProperty.call(this._itemsByIdentity, identity)){ + item = this._itemsByIdentity[identity]; + } + }else if (Object.hasOwnProperty.call(this._arrayOfAllItems, identity)){ + item = this._arrayOfAllItems[identity]; + } + if(item === undefined){ + item = null; + } + return item; // Object + }, - // 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, + getIdentityAttributes: function(/* item */ item){ + // summary: + // See dojo.data.api.Identity.getIdentityAttributes() - // 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: dojo.cache("dijit.layout", "templates/TabContainer.html", "<div class=\"dijitTabContainer\">\n\t<div class=\"dijitTabListWrapper\" dojoAttachPoint=\"tablistNode\"></div>\n\t<div dojoAttachPoint=\"tablistSpacer\" class=\"dijitTabSpacer ${baseClass}-spacer\"></div>\n\t<div class=\"dijitTabPaneWrapper ${baseClass}-container\" dojoAttachPoint=\"containerNode\"></div>\n</div>\n"), - - 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 && dojo.style(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){ dojo.addClass(this.domNode, "dijitTabContainerNoLayout"); } - - if(this.nested){ - /* workaround IE's lack of support for "a > b" selectors by - * tagging each node in the template. - */ - dojo.addClass(this.domNode, "dijitTabContainerNested"); - dojo.addClass(this.tablist.containerNode, "dijitTabContainerTabListNested"); - dojo.addClass(this.tablistSpacer, "dijitTabContainerSpacerNested"); - dojo.addClass(this.containerNode, "dijitTabPaneWrapperNested"); + var identifier = this._features['dojo.data.api.Identity']; + if(identifier === Number){ + // If (identifier === Number) it means getIdentity() just returns + // an integer item-number for each item. The dojo.data.api.Identity + // spec says we need to return null if the identity is not composed + // of attributes + return null; // null }else{ - dojo.addClass(this.domNode, "tabStrip-" + (this.tabStrip ? "enabled" : "disabled")); + return [identifier]; // Array } }, - _setupChild: function(/*dijit._Widget*/ tab){ - // Overrides StackContainer._setupChild(). - dojo.addClass(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" - }]; - dijit.layout.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 = dijit.layout.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 = dojo.contentBox(this.domNode).w; - s.width=""; - this.tablist.resize({w: width}); - } + _forceLoad: function(){ + // summary: + // Internal function to force a load of the store if it hasn't occurred yet. This is required + // for specific functions to work properly. + var self = this; + //Do a check on the JsonFileUrl and crosscheck it. + //If it doesn't match the cross-check, it needs to be updated + //This allows for either url or _jsonFileUrl to he changed to + //reset the store load location. Done this way for backwards + //compatibility. People use _jsonFileUrl (even though officially + //private. + if(this._jsonFileUrl !== this._ccUrl){ + kernel.deprecated("dojo.data.ItemFileReadStore: ", + "To change the url, set the url property of the store," + + " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0"); + this._ccUrl = this._jsonFileUrl; + this.url = this._jsonFileUrl; + }else if(this.url !== this._ccUrl){ + this._jsonFileUrl = this.url; + this._ccUrl = this.url; + } - // and call resize() on the selected pane just to tell it that it's been made visible - if(sc && sc.resize){ - sc.resize(); - } + //See if there was any forced reset of data. + if(this.data != null){ + this._jsonData = this.data; + this.data = null; } - }, - destroy: function(){ - if(this.tablist){ - this.tablist.destroy(); + if(this._jsonFileUrl){ + var getArgs = { + url: this._jsonFileUrl, + handleAs: "json-comment-optional", + preventCache: this.urlPreventCache, + failOk: this.failOk, + sync: true + }; + var getHandler = xhr.get(getArgs); + getHandler.addCallback(function(data){ + try{ + //Check to be sure there wasn't another load going on concurrently + //So we don't clobber data that comes in on it. If there is a load going on + //then do not save this data. It will potentially clobber current data. + //We mainly wanted to sync/wait here. + //TODO: Revisit the loading scheme of this store to improve multi-initial + //request handling. + if(self._loadInProgress !== true && !self._loadFinished){ + self._getItemsFromLoadedData(data); + self._loadFinished = true; + }else if(self._loadInProgress){ + //Okay, we hit an error state we can't recover from. A forced load occurred + //while an async load was occurring. Since we cannot block at this point, the best + //that can be managed is to throw an error. + throw new Error("dojo.data.ItemFileReadStore: Unable to perform a synchronous load, an async load is in progress."); + } + }catch(e){ + console.log(e); + throw e; + } + }); + getHandler.addErrback(function(error){ + throw error; + }); + }else if(this._jsonData){ + self._getItemsFromLoadedData(self._jsonData); + self._jsonData = null; + self._loadFinished = true; } - this.inherited(arguments); } }); +//Mix in the simple fetch implementation to this class. +lang.extend(ItemFileReadStore,simpleFetch); -} +return ItemFileReadStore; +}); -if(!dojo._hasResource["dijit.layout.TabController"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.layout.TabController"] = true; -dojo.provide("dijit.layout.TabController"); +}, +'dojo/html':function(){ +define("dojo/html", ["./_base/kernel", "./_base/lang", "./_base/array", "./_base/declare", "./dom", "./dom-construct", "./parser"], function(dojo, lang, darray, declare, dom, domConstruct, parser) { + // module: + // dojo/html + // summary: + // TODOC + lang.getObject("html", true, dojo); + // the parser might be needed.. + // idCounter is incremented with each instantiation to allow asignment of a unique id for tracking, logging purposes + var idCounter = 0; + dojo.html._secureForInnerHtml = function(/*String*/ cont){ + // summary: + // removes !DOCTYPE and title elements from the html string. + // + // khtml is picky about dom faults, you can't attach a style or <title> node as child of body + // must go into head, so we need to cut out those tags + // cont: + // An html string for insertion into the dom + // + return cont.replace(/(?:\s*<!DOCTYPE\s[^>]+>|<title[^>]*>[\s\S]*?<\/title>)/ig, ""); // String + }; +/*==== + dojo.html._emptyNode = function(node){ + // summary: + // removes all child nodes from the given node + // node: DOMNode + // the parent element + }; +=====*/ + dojo.html._emptyNode = domConstruct.empty; -// Menu is used for an accessible close button, would be nice to have a lighter-weight solution + dojo.html._setNodeContent = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont){ + // summary: + // inserts the given content into the given node + // node: + // the parent element + // content: + // the content to be set on the parent element. + // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes + // always empty + domConstruct.empty(node); -dojo.declare("dijit.layout.TabController", - dijit.layout.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 + if(cont) { + if(typeof cont == "string") { + cont = domConstruct.toDom(cont, node.ownerDocument); + } + if(!cont.nodeType && lang.isArrayLike(cont)) { + // handle as enumerable, but it may shrink as we enumerate it + for(var startlen=cont.length, i=0; i<cont.length; i=startlen==cont.length ? i+1 : 0) { + domConstruct.place( cont[i], node, "last"); + } + } else { + // pass nodes, documentFragments and unknowns through to dojo.place + domConstruct.place(cont, node, "last"); + } + } - templateString: "<div role='tablist' dojoAttachEvent='onkeypress:onkeypress'></div>", + // return DomNode + return node; + }; - // tabPosition: String - // Defines where tabs go relative to the content. - // "top", "bottom", "left-h", "right-h" - tabPosition: "top", + // we wrap up the content-setting operation in a object + declare("dojo.html._ContentSetter", null, + { + // node: DomNode|String + // An node which will be the parent element that we set content into + node: "", - // buttonWidget: String - // The name of the tab widget to create to correspond to each page - buttonWidget: "dijit.layout._TabButton", + // content: String|DomNode|DomNode[] + // The content to be placed in the node. Can be an HTML string, a node reference, or a enumerable list of nodes + content: "", - _rectifyRtlTabList: function(){ - // summary: - // For left/right TabContainer when page is RTL mode, rectify the width of all tabs to be equal, otherwise the tab widths are different in IE + // id: String? + // Usually only used internally, and auto-generated with each instance + id: "", - if(0 >= this.tabPosition.indexOf('-h')){ return; } - if(!this.pane2button){ return; } + // cleanContent: Boolean + // Should the content be treated as a full html document, + // and the real content stripped of <html>, <body> wrapper before injection + cleanContent: false, - var maxWidth = 0; - for(var pane in this.pane2button){ - var ow = this.pane2button[pane].innerDiv.scrollWidth; - maxWidth = Math.max(maxWidth, ow); - } - //unify the length of all the tabs - for(pane in this.pane2button){ - this.pane2button[pane].innerDiv.style.width = maxWidth + 'px'; - } - } -}); + // extractContent: Boolean + // Should the content be treated as a full html document, and the real content stripped of <html>, <body> wrapper before injection + extractContent: false, -dojo.declare("dijit.layout._TabButton", - dijit.layout._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 + // parseContent: Boolean + // Should the node by passed to the parser after the new content is set + parseContent: false, - // baseClass: String - // The CSS class applied to the domNode. - baseClass: "dijitTab", + // 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: dojo._scopeName, - // Apply dijitTabCloseButtonHover when close button is hovered - cssStateNodes: { - closeNode: "dijitTabCloseButton" - }, + // startup: Boolean + // Start the child widgets after parsing them. Only obeyed if parseContent is true. + startup: true, - templateString: dojo.cache("dijit.layout", "templates/_TabButton.html", "<div role=\"presentation\" dojoAttachPoint=\"titleNode\" dojoAttachEvent='onclick:onClick'>\n <div role=\"presentation\" class='dijitTabInnerDiv' dojoAttachPoint='innerDiv'>\n <div role=\"presentation\" class='dijitTabContent' dojoAttachPoint='tabContent'>\n \t<div role=\"presentation\" dojoAttachPoint='focusNode'>\n\t\t <img src=\"${_blankGif}\" alt=\"\" class=\"dijitIcon dijitTabButtonIcon\" dojoAttachPoint='iconNode' />\n\t\t <span dojoAttachPoint='containerNode' class='tabLabel'></span>\n\t\t <span class=\"dijitInline dijitTabCloseButton dijitTabCloseIcon\" dojoAttachPoint='closeNode'\n\t\t \t\tdojoAttachEvent='onclick: onClickCloseButton' role=\"presentation\">\n\t\t <span dojoAttachPoint='closeText' class='dijitTabCloseText'>[x]</span\n\t\t ></span>\n\t\t\t</div>\n </div>\n </div>\n</div>\n"), + // lifecyle methods + constructor: function(/* Object */params, /* String|DomNode */node){ + // summary: + // Provides a configurable, extensible object to wrap the setting on content on a node + // call the set() method to actually set the content.. - // Override _FormWidget.scrollOnFocus. - // Don't scroll the whole tab container into view when the button is focused. - scrollOnFocus: false, + // the original params are mixed directly into the instance "this" + lang.mixin(this, params || {}); - buildRendering: function(){ - this.inherited(arguments); + // give precedence to params.node vs. the node argument + // and ensure its a node, not an id string + node = this.node = dom.byId( this.node || node ); - dojo.setSelectable(this.containerNode, false); - }, + if(!this.id){ + this.id = [ + "Setter", + (node) ? node.id || node.tagName : "", + idCounter++ + ].join("_"); + } + }, + set: function(/* String|DomNode|NodeList? */ cont, /* Object? */ params){ + // summary: + // front-end to the set-content sequence + // cont: + // An html string, node or enumerable list of nodes for insertion into the dom + // If not provided, the object's content property will be used + if(undefined !== cont){ + this.content = cont; + } + // in the re-use scenario, set needs to be able to mixin new configuration + if(params){ + this._mixin(params); + } - startup: function(){ - this.inherited(arguments); - var n = this.domNode; + this.onBegin(); + this.setContent(); + this.onEnd(); - // Required to give IE6 a kick, as it initially hides the - // tabs until they are focused on. - setTimeout(function(){ - n.className = n.className; - }, 1); - }, + return this.node; + }, + setContent: function(){ + // summary: + // sets the content on the node - _setCloseButtonAttr: function(/*Boolean*/ disp){ - // summary: - // Hide/show close button - this._set("closeButton", disp); - dojo.toggleClass(this.innerDiv, "dijitClosable", disp); - this.closeNode.style.display = disp ? "" : "none"; - if(disp){ - var _nlsResources = dojo.i18n.getLocalization("dijit", "common"); - if(this.closeNode){ - dojo.attr(this.closeNode,"title", _nlsResources.itemClose); - } - // add context menu onto title button - var _nlsResources = dojo.i18n.getLocalization("dijit", "common"); - this._closeMenu = new dijit.Menu({ - id: this.id+"_Menu", - dir: this.dir, - lang: this.lang, - targetNodeIds: [this.domNode] - }); + var node = this.node; + if(!node) { + // can't proceed + throw new Error(this.declaredClass + ": setContent given no node"); + } + try{ + node = dojo.html._setNodeContent(node, this.content); + }catch(e){ + // check if a domfault occurs when we are appending this.errorMessage + // like for instance if domNode is a UL and we try append a DIV - this._closeMenu.addChild(new dijit.MenuItem({ - label: _nlsResources.itemClose, - dir: this.dir, - lang: this.lang, - onClick: dojo.hitch(this, "onClickCloseButton") - })); - }else{ - if(this._closeMenu){ - this._closeMenu.destroyRecursive(); - delete this._closeMenu; - } - } - }, - _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 == false && !this.params.title){ - this.iconNode.alt = dojo.trim(this.containerNode.innerText || this.containerNode.textContent || ''); - } - }, + // FIXME: need to allow the user to provide a content error message string + var errMess = this.onContentError(e); + try{ + node.innerHTML = errMess; + }catch(e){ + console.error('Fatal ' + this.declaredClass + '.setContent could not change content due to '+e.message, e); + } + } + // always put back the node for the next method + this.node = node; // DomNode + }, - destroy: function(){ - if(this._closeMenu){ - this._closeMenu.destroyRecursive(); - delete this._closeMenu; - } - this.inherited(arguments); - } -}); + empty: function() { + // summary + // cleanly empty out existing content -} + // destroy any widgets from a previous run + // NOTE: if you dont want this you'll need to empty + // the parseResults array property yourself to avoid bad things happenning + if(this.parseResults && this.parseResults.length) { + darray.forEach(this.parseResults, function(w) { + if(w.destroy){ + w.destroy(); + } + }); + delete this.parseResults; + } + // this is fast, but if you know its already empty or safe, you could + // override empty to skip this step + dojo.html._emptyNode(this.node); + }, -if(!dojo._hasResource["dijit.layout.ScrollingTabController"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.layout.ScrollingTabController"] = true; -dojo.provide("dijit.layout.ScrollingTabController"); + onBegin: function(){ + // summary + // Called after instantiation, but before set(); + // It allows modification of any of the object properties + // - including the node and content provided - before the set operation actually takes place + // This default implementation checks for cleanContent and extractContent flags to + // optionally pre-process html string content + var cont = this.content; + if(lang.isString(cont)){ + if(this.cleanContent){ + cont = dojo.html._secureForInnerHtml(cont); + } + if(this.extractContent){ + var match = cont.match(/<body[^>]*>\s*([\s\S]+)\s*<\/body>/im); + if(match){ cont = match[1]; } + } + } + // clean out the node and any cruft associated with it - like widgets + this.empty(); + this.content = cont; + return this.node; /* DomNode */ + }, + onEnd: function(){ + // summary + // Called after set(), when the new content has been pushed into the node + // It provides an opportunity for post-processing before handing back the node to the caller + // This default implementation checks a parseContent flag to optionally run the dojo parser over the new content + if(this.parseContent){ + // populates this.parseResults if you need those.. + this._parse(); + } + return this.node; /* DomNode */ + }, -dojo.declare("dijit.layout.ScrollingTabController", - dijit.layout.TabController, - { - // 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 + tearDown: function(){ + // summary + // manually reset the Setter instance if its being re-used for example for another set() + // description + // tearDown() is not called automatically. + // In normal use, the Setter instance properties are simply allowed to fall out of scope + // but the tearDown method can be called to explicitly reset this instance. + delete this.parseResults; + delete this.node; + delete this.content; + }, - templateString: dojo.cache("dijit.layout", "templates/ScrollingTabController.html", "<div class=\"dijitTabListContainer-${tabPosition}\" style=\"visibility:hidden\">\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerMenuButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_menuBtn\" containerId=\"${containerId}\" iconClass=\"dijitTabStripMenuIcon\"\n\t\t\tdropDownPosition=\"below-alt, above-alt\"\n\t\t\tdojoAttachPoint=\"_menuBtn\" showLabel=\"false\">▼</div>\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_leftBtn\" iconClass=\"dijitTabStripSlideLeftIcon\"\n\t\t\tdojoAttachPoint=\"_leftBtn\" dojoAttachEvent=\"onClick: doSlideLeft\" showLabel=\"false\">◀</div>\n\t<div dojoType=\"dijit.layout._ScrollingTabControllerButton\"\n\t\t\tclass=\"tabStripButton-${tabPosition}\"\n\t\t\tid=\"${id}_rightBtn\" iconClass=\"dijitTabStripSlideRightIcon\"\n\t\t\tdojoAttachPoint=\"_rightBtn\" dojoAttachEvent=\"onClick: doSlideRight\" showLabel=\"false\">▶</div>\n\t<div class='dijitTabListWrapper' dojoAttachPoint='tablistWrapper'>\n\t\t<div role='tablist' dojoAttachEvent='onkeypress:onkeypress'\n\t\t\t\tdojoAttachPoint='containerNode' class='nowrapTabStrip'></div>\n\t</div>\n</div>\n"), + onContentError: function(err){ + return "Error occured setting content: " + err; + }, - // 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, + _mixin: function(params){ + // mix properties/methods into the instance + // TODO: the intention with tearDown is to put the Setter's state + // back to that of the original constructor (vs. deleting/resetting everything regardless of ctor params) + // so we could do something here to move the original properties aside for later restoration + var empty = {}, key; + for(key in params){ + if(key in empty){ continue; } + // TODO: here's our opportunity to mask the properties we dont consider configurable/overridable + // .. but history shows we'll almost always guess wrong + this[key] = params[key]; + } + }, + _parse: function(){ + // summary: + // runs the dojo parser over the node contents, storing any results in this.parseResults + // Any errors resulting from parsing are passed to _onError for handling - // 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, + var rootNode = this.node; + try{ + // store the results (widgets, whatever) for potential retrieval + var inherited = {}; + darray.forEach(["dir", "lang", "textDir"], function(name){ + if(this[name]){ + inherited[name] = this[name]; + } + }, this); + this.parseResults = parser.parse({ + rootNode: rootNode, + noStart: !this.startup, + inherited: inherited, + scope: this.parserScope + }); + }catch(e){ + this._onError('Content', e, "Error parsing in _ContentSetter#"+this.id); + } + }, - // tabStripClass: [const] String - // The css class to apply to the tab strip, if it is visible. - tabStripClass: "", + _onError: function(type, err, consoleText){ + // summary: + // shows user the string that is returned by on[type]Error + // overide/implement 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 + dojo.html._setNodeContent(this.node, errText, true); + } + } + }); // end dojo.declare() - widgetsInTemplate: true, + dojo.html.set = function(/* DomNode */ node, /* String|DomNode|NodeList */ cont, /* Object? */ params){ + // summary: + // inserts (replaces) the given content into the given node. dojo.place(cont, node, "only") + // may be a better choice for simple HTML insertion. + // description: + // Unless you need to use the params capabilities of this method, you should use + // dojo.place(cont, node, "only"). dojo.place() has more robust support for injecting + // an HTML string into the DOM, but it only handles inserting an HTML string as DOM + // elements, or inserting a DOM node. dojo.place does not handle NodeList insertions + // or the other capabilities as defined by the params object for this method. + // node: + // the parent element that will receive the content + // cont: + // the content to be set on the parent element. + // This can be an html string, a node reference or a NodeList, dojo.NodeList, Array or other enumerable list of nodes + // params: + // Optional flags/properties to configure the content-setting. See dojo.html._ContentSetter + // example: + // A safe string/node/nodelist content replacement/injection with hooks for extension + // Example Usage: + // dojo.html.set(node, "some string"); + // dojo.html.set(node, contentNode, {options}); + // dojo.html.set(node, myNode.childNodes, {options}); + if(undefined == cont){ + console.warn("dojo.html.set: no cont argument provided, using empty string"); + cont = ""; + } + if(!params){ + // simple and fast + return dojo.html._setNodeContent(node, cont, true); + }else{ + // more options but slower + // note the arguments are reversed in order, to match the convention for instantiation via the parser + var op = new dojo.html._ContentSetter(lang.mixin( + params, + { content: cont, node: node } + )); + return op.set(); + } + }; - // _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, + return dojo.html; +}); - attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, { - "class": "containerNode" - }), - - buildRendering: function(){ - this.inherited(arguments); - var n = this.domNode; +}, +'dijit/_PaletteMixin':function(){ +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){ - this.scrollNode = this.tablistWrapper; - this._initButtons(); +/*===== + var _CssStateMixin = dijit._CssStateMixin; +=====*/ - if(!this.tabStripClass){ - this.tabStripClass = "dijitTabContainer" + - this.tabPosition.charAt(0).toUpperCase() + - this.tabPosition.substr(1).replace(/-.*/, "") + - "None"; - dojo.addClass(n, "tabStrip-disabled") - } +// module: +// dijit/_PaletteMixin +// summary: +// A keyboard accessible palette, for picking a color/emoticon/etc. - dojo.addClass(this.tablistWrapper, this.tabStripClass); - }, +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. - onStartup: function(){ - this.inherited(arguments); + // defaultTimeout: Number + // Number of milliseconds before a held key or button becomes typematic + defaultTimeout: 500, - // Do not show the TabController until the related - // StackController has added it's children. This gives - // a less visually jumpy instantiation. - dojo.style(this.domNode, "visibility", "visible"); - this._postStartup = true; - }, + // 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, - onAddChild: function(page, insertIndex){ - this.inherited(arguments); + // value: String + // Currently selected color/emoticon/etc. + value: "", - // changes to the tab button label or iconClass will have changed the width of the - // buttons, so do a resize - dojo.forEach(["label", "iconClass"], function(attr){ - this.pane2watches[page.id].push( - this.pane2button[page.id].watch(attr, dojo.hitch(this, function(name, oldValue, newValue){ - if(this._postStartup && this._dim){ - this.resize(this._dim); - } - })) - ); - }, this); + // _selectedCell: [private] Integer + // Index of the currently selected cell. Initially, none selected + _selectedCell: -1, - // 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. - dojo.style(this.containerNode, "width", - (dojo.style(this.containerNode, "width") + 200) + "px"); - }, +/*===== + // _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, +=====*/ - 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; - } +/*===== + // _xDim: [protected] Integer + // This is the number of cells horizontally across. + _xDim: null, +=====*/ - this.inherited(arguments); - }, +/*===== + // _yDim: [protected] Integer + // This is the number of cells vertically down. + _yDim: null, +=====*/ - _initButtons: function(){ - // summary: - // Creates the buttons used to scroll to view tabs that - // may not be visible if the TabContainer is too narrow. + // tabIndex: String + // Widget tab index. + tabIndex: "0", - // 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 = dojo.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 += dojo._getMarginSize(btn).w; - return true; - }else{ - dojo.style(btn, "display", "none"); - return false; - } - }, this); - }, + // cellClass: [protected] String + // CSS class applied to each cell in the palette + cellClass: "dijitPaletteCell", - _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 + dojo.style(rightTab, "width") - leftTab.offsetLeft; - }else{ - return 0; - } - }, + // dyeClass: [protected] String + // Name of javascript class for Object created for each cell of the palette. + // dyeClass should implements dijit.Dye interface + dyeClass: '', + + // summary: String + // Localized summary for the palette table + summary: '', + _setSummaryAttr: "paletteTableNode", - _enableBtn: function(width){ + _dyeFactory: function(value /*===== , row, col =====*/){ // 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 || dojo.style(this.scrollNode, "width"); - return tabsWidth > 0 && width < tabsWidth; + // Return instance of dijit.Dye for specified cell of palette + // tags: + // extension + var dyeClassObj = lang.getObject(this.dyeClass); + return new dyeClassObj(value); }, - resize: function(dim){ + _preparePalette: function(choices, titles) { // summary: - // Hides or displays the buttons used to scroll the tab list and launch the menu - // that selects tabs. + // 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 - if(this.domNode.offsetWidth == 0){ - return; - } + this._cells = []; + var url = this._blankGif; - // Save the dimensions to be used when a child is renamed. - this._dim = dim; + this.connect(this.gridNode, "ondijitclick", "_onCellClick"); - // 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"; - this._contentBox = dijit.layout.marginBox2contentBox(this.domNode, {h: 0, w: dim.w}); - this._contentBox.h = this.scrollNode.offsetHeight; - dojo.contentBox(this.domNode, this._contentBox); + 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); - // 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"); + var cellNode = domConstruct.create("td", { + "class": this.cellClass, + tabIndex: "-1", + title: titles[value], + role: "gridcell" + }); - // Position and size the navigation buttons and the tablist - this._leftBtn.layoutAlign = "left"; - this._rightBtn.layoutAlign = "right"; - this._menuBtn.layoutAlign = this.isLeftToRight() ? "right" : "left"; - dijit.layout.layoutChildren(this.domNode, this._contentBox, - [this._menuBtn, this._leftBtn, this._rightBtn, {domNode: this.scrollNode, layoutAlign: "client"}]); + // prepare cell inner structure + cellObject.fillCell(cellNode, url); - // set proper scroll so that selected tab is visible - if(this._selectedTab){ - if(this._anim && this._anim.status() == "playing"){ - this._anim.stop(); + domConstruct.place(cellNode, rowNode); + + cellNode.index = this._cells.length; + + // save cell info into _cells + this._cells.push({node:cellNode, dye:cellObject}); + } } - var w = this.scrollNode, - sl = this._convertToScrollLeft(this._getScrollForSelectedTab()); - w.scrollLeft = sl; } + this._xDim = choices[0].length; + this._yDim = choices.length; - // Enable/disabled left right buttons depending on whether or not user can scroll to left or right - this._setButtonClass(this._getScroll()); - - this._postResize = true; + // 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. - // 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}; + 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._connects.push( + 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 + ) + ); + } }, - _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" - var sl = (this.isLeftToRight() || dojo.isIE < 8 || (dojo.isIE && dojo.isQuirks) || dojo.isWebKit) ? this.scrollNode.scrollLeft : - dojo.style(this.containerNode, "width") - dojo.style(this.scrollNode, "width") - + (dojo.isIE == 8 ? -1 : 1) * this.scrollNode.scrollLeft; - return sl; - }, + postCreate: function(){ + this.inherited(arguments); - _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() || dojo.isIE < 8 || (dojo.isIE && dojo.isQuirks) || dojo.isWebKit){ - return val; - }else{ - var maxScroll = dojo.style(this.containerNode, "width") - dojo.style(this.scrollNode, "width"); - return (dojo.isIE == 8 ? -1 : 1) * (val - maxScroll); - } + // Set initial navigable node. + this._setCurrent(this._cells[0].node); }, - onSelectChild: function(/*dijit._Widget*/ page){ + focus: function(){ // summary: - // Smoothly scrolls to a tab when it is selected. + // Focus this widget. Puts focus on the most recently focused cell. - var tab = this.pane2button[page.id]; - if(!tab || !page){return;} + // The cell already has tabIndex set, just need to set CSS and focus it + focus.focus(this._currentFocus); + }, - // Scroll to the selected tab, except on startup, when scrolling is handled in resize() - var node = tab.domNode; - if(this._postResize && node != this._selectedTab){ - this._selectedTab = node; + _onCellClick: function(/*Event*/ evt){ + // summary: + // Handler for click, enter key & space key. Selects the cell. + // evt: + // The event. + // tags: + // private - var sl = this._getScroll(); + var target = evt.target; - if(sl > node.offsetLeft || - sl + dojo.style(this.scrollNode, "width") < - node.offsetLeft + dojo.style(node, "width")){ - this.createSmoothScroll().play(); + // 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; } - this.inherited(arguments); + 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); }, - _getScrollBounds: function(){ + _setCurrent: function(/*DomNode*/ node){ // summary: - // Returns the minimum and maximum scroll setting to show the leftmost and rightmost - // tabs (respectively) - var children = this.getChildren(), - scrollNodeWidth = dojo.style(this.scrollNode, "width"), // about 500px - containerWidth = dojo.style(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 + dojo.style(children[children.length-1].domNode, "width")) - 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 - }; + // 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"); } - }, - _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 = dojo.style(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 + dojo.style(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; + // Set tabIndex of new cell + this._currentFocus = node; + if(node){ + domAttr.set(node, "tabIndex", this.tabIndex); + } }, - createSmoothScroll: function(x){ + _setValueAttr: function(value, priorityChange){ // 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(); - } + // This selects a cell. It triggers the onChange event. + // value: String value of the cell to select + // tags: + // protected + // priorityChange: + // Optional parameter used to tell the select whether or not to fire + // onChange event. - if(this._anim && this._anim.status() == "playing"){ - this._anim.stop(); + // clear old selected cell + if(this._selectedCell >= 0){ + domClass.remove(this._cells[this._selectedCell].node, this.cellClass + "Selected"); } + this._selectedCell = -1; - var self = this, - w = this.scrollNode, - anim = new dojo._Animation({ - beforeBegin: function(){ - if(this.curve){ delete this.curve; } - var oldS = w.scrollLeft, - newS = self._convertToScrollLeft(x); - anim.curve = new dojo._Line(oldS, newS); - }, - onAnimate: function(val){ - w.scrollLeft = val; + // 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; } - }); - this._anim = anim; - - // Disable/enable left/right buttons according to new scroll position - this._setButtonClass(x); + } + } - return anim; // dojo._Animation - }, + // record new value, or null if no matching cell + this._set("value", this._selectedCell >= 0 ? value : null); - _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 && !dojo.hasClass(n, "tabStripButton")){ - n = n.parentNode; + if(priorityChange || priorityChange === undefined){ + this.onChange(value); } - 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){ + onChange: function(/*===== value =====*/){ // summary: - // Scrolls the menu to the left. - // e: - // The mouse click event. - this.doSlide(-1,this._getBtnNode(e)); + // Callback when a cell is selected. + // value: String + // Value corresponding to cell. }, - doSlide: function(/*Number*/ direction, /*DomNode*/ node){ + _navigateByKey: function(increment, typeCount){ // 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 && dojo.hasClass(node, "dijitTabDisabled")){return;} - - var sWidth = dojo.style(this.scrollNode, "width"); - var d = (sWidth * 0.75) * direction; + // 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 - var to = this._getScroll() + d; + // typecount == -1 means the key is released. + if(typeCount == -1){ return; } - this._setButtonClass(to); + var newFocusIndex = this._currentFocus.index + increment; + if(newFocusIndex < this._cells.length && newFocusIndex > -1){ + var focusNode = this._cells[newFocusIndex].node; + this._setCurrent(focusNode); - this.createSmoothScroll(to).play(); + // Actually focus the node, for the benefit of screen readers. + // Use setTimeout because IE doesn't like changing focus inside of an event handler + setTimeout(lang.hitch(dijit, "focus", focusNode), 0); + } }, - _setButtonClass: function(/*Number*/ scroll){ + _getDye: function(/*DomNode*/ cell){ // 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 + // Get JS object for given cell DOMNode - var scrollBounds = this._getScrollBounds(); - this._leftBtn.set("disabled", scroll <= scrollBounds.min); - this._rightBtn.set("disabled", scroll >= scrollBounds.max); + return this._cells[cell.index].dye; } }); +/*===== +declare("dijit.Dye", + null, + { + // summary: + // Interface for the JS Object associated with a palette cell (i.e. DOMNode) -dojo.declare("dijit.layout._ScrollingTabControllerButtonMixin", null, { - baseClass: "dijitTab tabStripButton", + constructor: function(alias, row, col){ + // summary: + // Initialize according to value or alias like "white" + // alias: String + }, - templateString: dojo.cache("dijit.layout", "templates/_ScrollingTabControllerButton.html", "<div dojoAttachEvent=\"onclick:_onButtonClick\">\n\t<div role=\"presentation\" class=\"dijitTabInnerDiv\" dojoattachpoint=\"innerDiv,focusNode\">\n\t\t<div role=\"presentation\" class=\"dijitTabContent dijitButtonContents\" dojoattachpoint=\"tabContent\">\n\t\t\t<img role=\"presentation\" alt=\"\" src=\"${_blankGif}\" class=\"dijitTabStripIcon\" dojoAttachPoint=\"iconNode\"/>\n\t\t\t<span dojoAttachPoint=\"containerNode,titleNode\" class=\"dijitButtonText\"></span>\n\t\t</div>\n\t</div>\n</div>\n"), + 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. + }, - // Override inherited tabIndex: 0 from dijit.form.Button, because user shouldn't be - // able to tab to the left/right/menu buttons - tabIndex: "", + fillCell: function(cell, blankGif){ + // summary: + // Add cell DOMNode inner structure + // cell: DomNode + // The surrounding cell + // blankGif: String + // URL for blank cell image + } + } +); +=====*/ - // 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; } }); -dojo.declare("dijit.layout._ScrollingTabControllerButton", - [dijit.form.Button, dijit.layout._ScrollingTabControllerButtonMixin]); - -dojo.declare( - "dijit.layout._ScrollingTabControllerMenuButton", - [dijit.form.Button, dijit._HasDropDown, dijit.layout._ScrollingTabControllerButtonMixin], -{ - // id of the TabContainer itself - containerId: "", +}, +'dijit/form/ValidationTextBox':function(){ +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/i18n", // i18n.getLocalization + "./TextBox", + "../Tooltip", + "dojo/text!./templates/ValidationTextBox.html", + "dojo/i18n!./nls/validate" +], function(declare, i18n, TextBox, Tooltip, template){ - // -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", +/*===== + var Tooltip = dijit.Tooltip; + var TextBox = dijit.form.TextBox; +=====*/ - isLoaded: function(){ - // recreate menu every time, in case the TabContainer's list of children (or their icons/labels) have changed - return false; - }, + // module: + // dijit/form/ValidationTextBox + // summary: + // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. - loadDropDown: function(callback){ - this.dropDown = new dijit.Menu({ - id: this.containerId + "_menu", - dir: this.dir, - lang: this.lang - }); - var container = dijit.byId(this.containerId); - dojo.forEach(container.getChildren(), function(page){ - var menuItem = new dijit.MenuItem({ - id: page.id + "_stcMi", - label: page.title, - iconClass: page.iconClass, - dir: page.dir, - lang: page.lang, - 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; + /*===== + dijit.form.ValidationTextBox.__Constraints = function(){ + // locale: String + // locale used for validation, picks up value from this widget's lang attribute + // _flags_: anything + // various flags passed to regExpGen function + this.locale = ""; + this._flags_ = ""; } - } -}); - -} - -if(!dojo._hasResource["dijit.layout.TabContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.layout.TabContainer"] = true; -dojo.provide("dijit.layout.TabContainer"); + =====*/ + return declare("dijit.form.ValidationTextBox", TextBox, { + // summary: + // Base class for textbox widgets with the ability to validate content of various types and provide user feedback. + // tags: + // protected + templateString: template, + baseClass: "dijitTextBox dijitValidationTextBox", + // 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: "", -dojo.declare("dijit.layout.TabContainer", - dijit.layout._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. + // 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_$", - // 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, + // 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_$", - // 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, + // message: String + // Currently error/prompt message. + // When using the default tooltip implementation, this will only be + // displayed when the field is focused. + message: "", - // controllerWidget: String - // An optional parameter to override the widget used to display the tab labels - controllerWidget: "", + // constraints: dijit.form.ValidationTextBox.__Constraints + // user-defined object needed to pass parameters to the validator functions + constraints: {}, - _makeController: function(/*DomNode*/ srcNode){ + // regExp: [extension protected] String + // regular expression string used to validate the input + // Do not specify both regExp and regExpGen + regExp: ".*", + + regExpGen: function(/*dijit.form.ValidationTextBox.__Constraints*/ /*===== constraints =====*/){ // summary: - // Instantiate tablist controller widget and return reference to it. - // Callback from _TabContainerBase.postCreate(). + // Overridable function used to generate regExp when dependent on constraints. + // Do not specify both regExp and regExpGen. // tags: - // protected extension + // extension protected + return this.regExp; // String + }, - var cls = this.baseClass + "-tabs" + (this.doLayout ? "" : " dijitTabNoLayout"), - TabController = dojo.getObject(this.controllerWidget); + // state: [readonly] String + // Shows current state (ie, validation result) of input (""=Normal, Incomplete, or Error) + state: "", - return new TabController({ - id: this.id + "_tablist", - dir: this.dir, - lang: this.lang, - 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); - }, + // tooltipPosition: String[] + // See description of `dijit.Tooltip.defaultPosition` for details on this parameter. + tooltipPosition: [], - postMixInProperties: function(){ + _setValueAttr: function(){ + // summary: + // Hook so set('value', ...) works. this.inherited(arguments); + this.validate(this.focused); + }, - // Scrolling controller only works for horizontal non-nested tabs - if(!this.controllerWidget){ - this.controllerWidget = (this.tabPosition == "top" || this.tabPosition == "bottom") && !this.nested ? - "dijit.layout.ScrollingTabController" : "dijit.layout.TabController"; - } - } -}); + validator: function(/*anything*/ value, /*dijit.form.ValidationTextBox.__Constraints*/ constraints){ + // summary: + // Overridable function used to validate the text input against the regular expression. + // tags: + // protected + return (new RegExp("^(?:" + this.regExpGen(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; + }, -if(!dojo._hasResource["dojo.number"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.number"] = true; -dojo.provide("dojo.number"); + 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 + return (this.required && this._isEmpty(this.textbox.value)) ? this.missingMessage : this.invalidMessage; // 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) ? "Incomplete" : "Error")); + this.focusNode.setAttribute("aria-invalid", isValid ? "false" : "true"); -dojo.getObject("number", true, dojo); + 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); -/*===== -dojo.number = { - // summary: localized formatting and parsing routines for Number -} + return isValid; + }, -dojo.number.__FormatOptions = function(){ - // pattern: String? - // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) - // with this string. Default value is based on locale. Overriding this property will defeat - // localization. Literal characters in patterns are not supported. - // type: String? - // choose a format type based on the locale from the following: - // decimal, scientific (not yet supported), percent, currency. decimal by default. - // places: Number? - // fixed number of decimal places to show. This overrides any - // information in the provided pattern. - // round: Number? - // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1 - // means do not round. - // locale: String? - // override the locale used to determine formatting rules - // fractional: Boolean? - // If false, show no decimal places, overriding places and pattern settings. - this.pattern = pattern; - this.type = type; - this.places = places; - this.round = round; - this.locale = locale; - this.fractional = fractional; -} -=====*/ + 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); + } + }, -dojo.number.format = function(/*Number*/value, /*dojo.number.__FormatOptions?*/options){ - // summary: - // Format a Number as a String, using locale-specific settings - // description: - // Create a string from a Number using a known localized pattern. - // Formatting patterns appropriate to the locale are chosen from the - // [Common Locale Data Repository](http://unicode.org/cldr) as well as the appropriate symbols and - // delimiters. - // If value is Infinity, -Infinity, or is not a valid JavaScript number, return null. - // value: - // the number to be formatted + _refreshState: function(){ + // Overrides TextBox._refreshState() + this.validate(this.focused); + this.inherited(arguments); + }, - options = dojo.mixin({}, options || {}); - var locale = dojo.i18n.normalizeLocale(options.locale), - bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale); - options.customs = bundle; - var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"]; - if(isNaN(value) || Math.abs(value) == Infinity){ return null; } // null - return dojo.number._applyPattern(value, pattern, options); // String -}; + //////////// INITIALIZATION METHODS /////////////////////////////////////// -//dojo.number._numberPatternRE = /(?:[#0]*,?)*[#0](?:\.0*#*)?/; // not precise, but good enough -dojo.number._numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/; // not precise, but good enough + constructor: function(){ + this.constraints = {}; + }, -dojo.number._applyPattern = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatOptions?*/options){ - // summary: - // Apply pattern to format value as a string using options. Gives no - // consideration to local customs. - // value: - // the number to be formatted. - // pattern: - // a pattern string as described by - // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) - // options: dojo.number.__FormatOptions? - // _applyPattern is usually called via `dojo.number.format()` which - // populates an extra property in the options parameter, "customs". - // The customs object specifies group and decimal parameters if set. + _setConstraintsAttr: function(/*Object*/ constraints){ + if(!constraints.locale && this.lang){ + constraints.locale = this.lang; + } + this._set("constraints", constraints); + this._computePartialRE(); + }, - //TODO: support escapes - options = options || {}; - var group = options.customs.group, - decimal = options.customs.decimal, - patternList = pattern.split(';'), - positivePattern = patternList[0]; - pattern = patternList[(value < 0) ? 1 : 0] || ("-" + positivePattern); - - //TODO: only test against unescaped - if(pattern.indexOf('%') != -1){ - value *= 100; - }else if(pattern.indexOf('\u2030') != -1){ - value *= 1000; // per mille - }else if(pattern.indexOf('\u00a4') != -1){ - group = options.customs.currencyGroup || group;//mixins instead? - decimal = options.customs.currencyDecimal || decimal;// Should these be mixins instead? - pattern = pattern.replace(/\u00a4{1,3}/, function(match){ - var prop = ["symbol", "currency", "displayName"][match.length-1]; - return options[prop] || options.currency || ""; - }); - }else if(pattern.indexOf('E') != -1){ - throw new Error("exponential notation not supported"); - } - - //TODO: support @ sig figs? - var numberPatternRE = dojo.number._numberPatternRE; - var numberPattern = positivePattern.match(numberPatternRE); - if(!numberPattern){ - throw new Error("unable to find a number expression in pattern: "+pattern); - } - if(options.fractional === false){ options.places = 0; } - return pattern.replace(numberPatternRE, - dojo.number._formatAbsolute(value, numberPattern[0], {decimal: decimal, group: group, places: options.places, round: options.round})); -}; + _computePartialRE: function(){ + var p = this.regExpGen(this.constraints); + this.regExp = p; + var partialre = ""; + // 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 != ".*"){ this.regExp.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.regExp; + console.warn('RegExp error in ' + this.declaredClass + ': ' + this.regExp); + } // should never be here unless the original RE is bad or the parsing is bad + this._partialre = "^(?:" + partialre + ")$"; + }, -dojo.number.round = function(/*Number*/value, /*Number?*/places, /*Number?*/increment){ - // summary: - // Rounds to the nearest value with the given number of decimal places, away from zero - // description: - // Rounds to the nearest value with the given number of decimal places, away from zero if equal. - // Similar to Number.toFixed(), but compensates for browser quirks. Rounding can be done by - // fractional increments also, such as the nearest quarter. - // NOTE: Subject to floating point errors. See dojox.math.round for experimental workaround. - // value: - // The number to round - // places: - // The number of decimal places where rounding takes place. Defaults to 0 for whole rounding. - // Must be non-negative. - // increment: - // Rounds next place to nearest value of increment/10. 10 by default. - // example: - // >>> dojo.number.round(-0.5) - // -1 - // >>> dojo.number.round(162.295, 2) - // 162.29 // note floating point error. Should be 162.3 - // >>> dojo.number.round(10.71, 0, 2.5) - // 10.75 - var factor = 10 / (increment || 10); - return (factor * +value).toFixed(places) / factor; // Number -}; + postMixInProperties: function(){ + this.inherited(arguments); + this.messages = i18n.getLocalization("dijit.form", "validate", this.lang); + if(this.invalidMessage == "$_unset_$"){ this.invalidMessage = this.messages.invalidMessage; } + if(!this.invalidMessage){ this.invalidMessage = this.promptMessage; } + if(this.missingMessage == "$_unset_$"){ this.missingMessage = this.messages.missingMessage; } + if(!this.missingMessage){ this.missingMessage = this.invalidMessage; } + this._setConstraintsAttr(this.constraints); // this needs to happen now (and later) due to codependency on _set*Attr calls attachPoints + }, -if((0.9).toFixed() == 0){ - // (isIE) toFixed() bug workaround: Rounding fails on IE when most significant digit - // is just after the rounding place and is >=5 - (function(){ - var round = dojo.number.round; - dojo.number.round = function(v, p, m){ - var d = Math.pow(10, -p || 0), a = Math.abs(v); - if(!v || a >= d || a * Math.pow(10, p + 1) < 5){ - d = 0; - } - return round(v, p, m) + (v > 0 ? d : -d); - }; - })(); -} + _setDisabledAttr: function(/*Boolean*/ value){ + this.inherited(arguments); // call FormValueWidget._setDisabledAttr() + this._refreshState(); + }, -/*===== -dojo.number.__FormatAbsoluteOptions = function(){ - // decimal: String? - // the decimal separator - // group: String? - // the group separator - // places: Number?|String? - // number of decimal places. the range "n,m" will format to m places. - // round: Number? - // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1 - // means don't round. - this.decimal = decimal; - this.group = group; - this.places = places; - this.round = round; -} -=====*/ + _setRequiredAttr: function(/*Boolean*/ value){ + this._set("required", value); + this.focusNode.setAttribute("aria-required", value); + this._refreshState(); + }, -dojo.number._formatAbsolute = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatAbsoluteOptions?*/options){ - // summary: - // Apply numeric pattern to absolute value using options. Gives no - // consideration to local customs. - // value: - // the number to be formatted, ignores sign - // pattern: - // the number portion of a pattern (e.g. `#,##0.00`) - options = options || {}; - if(options.places === true){options.places=0;} - if(options.places === Infinity){options.places=6;} // avoid a loop; pick a limit + _setMessageAttr: function(/*String*/ message){ + this._set("message", message); + this.displayMessage(message); + }, - var patternParts = pattern.split("."), - comma = typeof options.places == "string" && options.places.indexOf(","), - maxPlaces = options.places; - if(comma){ - maxPlaces = options.places.substring(comma + 1); - }else if(!(maxPlaces >= 0)){ - maxPlaces = (patternParts[1] || []).length; - } - if(!(options.round < 0)){ - value = dojo.number.round(value, maxPlaces, options.round); - } + reset:function(){ + // Overrides dijit.form.TextBox.reset() by also + // hiding errors about partial matches + this._maskValidSubsetError = true; + this.inherited(arguments); + }, - var valueParts = String(Math.abs(value)).split("."), - fractional = valueParts[1] || ""; - if(patternParts[1] || options.places){ - if(comma){ - options.places = options.places.substring(0, comma); - } - // Pad fractional with trailing zeros - var pad = options.places !== undefined ? options.places : (patternParts[1] && patternParts[1].lastIndexOf("0") + 1); - if(pad > fractional.length){ - valueParts[1] = dojo.string.pad(fractional, pad, '0', true); - } + _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(''); - // Truncate fractional - if(maxPlaces < fractional.length){ - valueParts[1] = fractional.substr(0, maxPlaces); + this.inherited(arguments); } - }else{ - if(valueParts[1]){ valueParts.pop(); } - } + }); +}); - // Pad whole with leading zeros - var patternDigits = patternParts[0].replace(',', ''); - pad = patternDigits.indexOf("0"); - if(pad != -1){ - pad = patternDigits.length - pad; - if(pad > valueParts[0].length){ - valueParts[0] = dojo.string.pad(valueParts[0], pad); - } +}, +'dijit/_base/typematic':function(){ +define("dijit/_base/typematic", ["../typematic"], function(){ + // for back-compat, just loads top level module +}); - // Truncate whole - if(patternDigits.indexOf("#") == -1){ - valueParts[0] = valueParts[0].substr(valueParts[0].length - pad); - } - } +}, +'dijit/_base':function(){ +define("dijit/_base", [ + ".", + "./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 + // summary: + // Includes all the modules in dijit/_base - // Add group separators - var index = patternParts[0].lastIndexOf(','), - groupSize, groupSize2; - if(index != -1){ - groupSize = patternParts[0].length - index - 1; - var remainder = patternParts[0].substr(0, index); - index = remainder.lastIndexOf(','); - if(index != -1){ - groupSize2 = remainder.length - index - 1; - } - } - var pieces = []; - for(var whole = valueParts[0]; whole;){ - var off = whole.length - groupSize; - pieces.push((off > 0) ? whole.substr(off) : whole); - whole = (off > 0) ? whole.slice(0, off) : ""; - if(groupSize2){ - groupSize = groupSize2; - delete groupSize2; - } - } - valueParts[0] = pieces.reverse().join(options.group || ","); + return dijit._base; +}); - return valueParts.join(options.decimal || "."); -}; +}, +'dijit/layout/BorderContainer':function(){ +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", + "dojo/_base/window", // win.body win.doc win.doc.createElement + "../_WidgetBase", + "../_Widget", + "../_TemplatedMixin", + "./_LayoutWidget", + "./utils" // layoutUtils.layoutChildren +], function(array, cookie, declare, domClass, domConstruct, domGeometry, domStyle, event, keys, lang, on, touch, win, + _WidgetBase, _Widget, _TemplatedMixin, _LayoutWidget, layoutUtils){ /*===== -dojo.number.__RegexpOptions = function(){ - // pattern: String? - // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) - // with this string. Default value is based on locale. Overriding this property will defeat - // localization. - // type: String? - // choose a format type based on the locale from the following: - // decimal, scientific (not yet supported), percent, currency. decimal by default. - // locale: String? - // override the locale used to determine formatting rules - // strict: Boolean? - // strict parsing, false by default. Strict parsing requires input as produced by the format() method. - // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators - // places: Number|String? - // number of decimal places to accept: Infinity, a positive number, or - // a range "n,m". Defined by pattern or Infinity if pattern not provided. - this.pattern = pattern; - this.type = type; - this.locale = locale; - this.strict = strict; - this.places = places; -} + var _WidgetBase = dijit._WidgetBase; + var _Widget = dijit._Widget; + var _TemplatedMixin = dijit._TemplatedMixin; + var _LayoutWidget = dijit.layout._LayoutWidget; =====*/ -dojo.number.regexp = function(/*dojo.number.__RegexpOptions?*/options){ - // summary: - // Builds the regular needed to parse a number - // description: - // Returns regular expression with positive and negative match, group - // and decimal separators - return dojo.number._parseInfo(options).regexp; // String -}; -dojo.number._parseInfo = function(/*Object?*/options){ - options = options || {}; - var locale = dojo.i18n.normalizeLocale(options.locale), - bundle = dojo.i18n.getLocalization("dojo.cldr", "number", locale), - pattern = options.pattern || bundle[(options.type || "decimal") + "Format"], -//TODO: memoize? - group = bundle.group, - decimal = bundle.decimal, - factor = 1; +// module: +// dijit/layout/BorderContainer +// summary: +// Provides layout in up to 5 regions, a mandatory center with optional borders along its 4 sides. - if(pattern.indexOf('%') != -1){ - factor /= 100; - }else if(pattern.indexOf('\u2030') != -1){ - factor /= 1000; // per mille - }else{ - var isCurrency = pattern.indexOf('\u00a4') != -1; - if(isCurrency){ - group = bundle.currencyGroup || group; - decimal = bundle.currencyDecimal || decimal; - } - } +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 - //TODO: handle quoted escapes - var patternList = pattern.split(';'); - if(patternList.length == 1){ - patternList.push("-" + patternList[0]); - } +/*===== + // container: [const] dijit.layout.BorderContainer + // Pointer to the parent BorderContainer + container: null, - var re = dojo.regexp.buildGroupRE(patternList, function(pattern){ - pattern = "(?:"+dojo.regexp.escapeString(pattern, '.')+")"; - return pattern.replace(dojo.number._numberPatternRE, function(format){ - var flags = { - signed: false, - separator: options.strict ? group : [group,""], - fractional: options.fractional, - decimal: decimal, - exponent: false - }, + // child: [const] dijit.layout._LayoutWidget + // Pointer to the pane associated with this splitter + child: null, - parts = format.split('.'), - places = options.places; + // region: [const] String + // Region of pane associated with this splitter. + // "top", "bottom", "left", "right". + region: null, +=====*/ - // special condition for percent (factor != 1) - // allow decimal places even if not specified in pattern - if(parts.length == 1 && factor != 1){ - parts[1] = "###"; - } - if(parts.length == 1 || places === 0){ - flags.fractional = false; - }else{ - if(places === undefined){ places = options.pattern ? parts[1].lastIndexOf('0') + 1 : Infinity; } - if(places && options.fractional == undefined){flags.fractional = true;} // required fractional, unless otherwise specified - if(!options.places && (places < parts[1].length)){ places += "," + parts[1].length; } - flags.places = places; - } - var groups = parts[0].split(','); - if(groups.length > 1){ - flags.groupSize = groups.pop().length; - if(groups.length > 1){ - flags.groupSize2 = groups.pop().length; - } - } - return "("+dojo.number._realNumberRegexp(flags)+")"; - }); - }, true); + // 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, - if(isCurrency){ - // substitute the currency symbol for the placeholder in the pattern - re = re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g, function(match, before, target, after){ - var prop = ["symbol", "currency", "displayName"][target.length-1], - symbol = dojo.regexp.escapeString(options[prop] || options.currency || ""); - before = before ? "[\\s\\xa0]" : ""; - after = after ? "[\\s\\xa0]" : ""; - if(!options.strict){ - if(before){before += "*";} - if(after){after += "*";} - return "(?:"+before+symbol+after+")?"; - } - return before+symbol+after; - }); - } + 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>', -//TODO: substitute localized sign/percent/permille/etc.? + constructor: function(){ + this._handlers = []; + }, - // normalize whitespace and return - return {regexp: re.replace(/[\xa0 ]/g, "[\\s\\xa0]"), group: group, decimal: decimal, factor: factor}; // Object -}; + postMixInProperties: function(){ + this.inherited(arguments); -/*===== -dojo.number.__ParseOptions = function(){ - // pattern: String? - // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) - // with this string. Default value is based on locale. Overriding this property will defeat - // localization. Literal characters in patterns are not supported. - // type: String? - // choose a format type based on the locale from the following: - // decimal, scientific (not yet supported), percent, currency. decimal by default. - // locale: String? - // override the locale used to determine formatting rules - // strict: Boolean? - // strict parsing, false by default. Strict parsing requires input as produced by the format() method. - // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators - // fractional: Boolean?|Array? - // Whether to include the fractional portion, where the number of decimal places are implied by pattern - // or explicit 'places' parameter. The value [true,false] makes the fractional portion optional. - this.pattern = pattern; - this.type = type; - this.locale = locale; - this.strict = strict; - this.fractional = fractional; -} -=====*/ -dojo.number.parse = function(/*String*/expression, /*dojo.number.__ParseOptions?*/options){ - // summary: - // Convert a properly formatted string to a primitive Number, using - // locale-specific settings. - // description: - // Create a Number from a string using a known localized pattern. - // Formatting patterns are chosen appropriate to the locale - // and follow the syntax described by - // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) - // Note that literal characters in patterns are not supported. - // expression: - // A string representation of a Number - var info = dojo.number._parseInfo(options), - results = (new RegExp("^"+info.regexp+"$")).exec(expression); - if(!results){ - return NaN; //NaN - } - var absoluteMatch = results[1]; // match for the positive expression - if(!results[1]){ - if(!results[2]){ - return NaN; //NaN - } - // matched the negative pattern - absoluteMatch =results[2]; - info.factor *= -1; - } + this.horizontal = /top|bottom/.test(this.region); + this._factor = /top|left/.test(this.region) ? 1 : -1; + this._cookieName = this.container.id + "_" + this.region; + }, - // Transform it to something Javascript can parse as a number. Normalize - // decimal point and strip out group separators or alternate forms of whitespace - absoluteMatch = absoluteMatch. - replace(new RegExp("["+info.group + "\\s\\xa0"+"]", "g"), ""). - replace(info.decimal, "."); - // Adjust for negative sign, percent, etc. as necessary - return absoluteMatch * info.factor; //Number -}; + buildRendering: function(){ + this.inherited(arguments); -/*===== -dojo.number.__RealNumberRegexpFlags = function(){ - // places: Number? - // The integer number of decimal places or a range given as "n,m". If - // not given, the decimal part is optional and the number of places is - // unlimited. - // decimal: String? - // A string for the character used as the decimal point. Default - // is ".". - // fractional: Boolean?|Array? - // Whether decimal places are used. Can be true, false, or [true, - // false]. Default is [true, false] which means optional. - // exponent: Boolean?|Array? - // Express in exponential notation. Can be true, false, or [true, - // false]. Default is [true, false], (i.e. will match if the - // exponential part is present are not). - // eSigned: Boolean?|Array? - // The leading plus-or-minus sign on the exponent. Can be true, - // false, or [true, false]. Default is [true, false], (i.e. will - // match if it is signed or unsigned). flags in regexp.integer can be - // applied. - this.places = places; - this.decimal = decimal; - this.fractional = fractional; - this.exponent = exponent; - this.eSigned = eSigned; -} -=====*/ + domClass.add(this.domNode, "dijitSplitter" + (this.horizontal ? "H" : "V")); -dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*/flags){ - // summary: - // Builds a regular expression to match a real number in exponential - // notation + if(this.container.persist){ + // restore old size + var persistSize = cookie(this._cookieName); + if(persistSize){ + this.child.domNode.style[this.horizontal ? "height" : "width"] = persistSize; + } + } + }, - // assign default values to missing parameters - flags = flags || {}; - //TODO: use mixin instead? - if(!("places" in flags)){ flags.places = Infinity; } - if(typeof flags.decimal != "string"){ flags.decimal = "."; } - if(!("fractional" in flags) || /^0/.test(flags.places)){ flags.fractional = [true, false]; } - if(!("exponent" in flags)){ flags.exponent = [true, false]; } - if(!("eSigned" in flags)){ flags.eSigned = [true, false]; } + _computeMaxSize: function(){ + // summary: + // Return the maximum size that my corresponding pane can be set to - var integerRE = dojo.number._integerRegexp(flags), - decimalRE = dojo.regexp.buildGroupRE(flags.fractional, - function(q){ - var re = ""; - if(q && (flags.places!==0)){ - re = "\\" + flags.decimal; - if(flags.places == Infinity){ - re = "(?:" + re + "\\d+)?"; - }else{ - re += "\\d{" + flags.places + "}"; - } - } - return re; - }, - true - ); + 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 - var exponentRE = dojo.regexp.buildGroupRE(flags.exponent, - function(q){ - if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; } - return ""; + return Math.min(this.child.maxSize, childSize + spaceAvailable); + }, + + _startDrag: function(e){ + if(!this.cover){ + this.cover = win.doc.createElement('div'); + domClass.add(this.cover, "dijitSplitterCover"); + domConstruct.place(this.cover, this.child.domNode, "after"); } - ); + domClass.add(this.cover, "dijitSplitterCoverActive"); - var realRE = integerRE + decimalRE; - // allow for decimals without integers, e.g. .25 - if(decimalRE){realRE = "(?:(?:"+ realRE + ")|(?:" + decimalRE + "))";} - return realRE + exponentRE; // String -}; + // 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"); + } -/*===== -dojo.number.__IntegerRegexpFlags = function(){ - // signed: Boolean? - // The leading plus-or-minus sign. Can be true, false, or `[true,false]`. - // Default is `[true, false]`, (i.e. will match if it is signed - // or unsigned). - // separator: String? - // The character used as the thousands separator. Default is no - // separator. For more than one symbol use an array, e.g. `[",", ""]`, - // makes ',' optional. - // groupSize: Number? - // group size between separators - // groupSize2: Number? - // second grouping, where separators 2..n have a different interval than the first separator (for India) - this.signed = signed; - this.separator = separator; - this.groupSize = groupSize; - this.groupSize2 = groupSize2; -} -=====*/ - -dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags){ - // summary: - // Builds a regular expression that matches an integer - - // assign default values to missing parameters - flags = flags || {}; - if(!("signed" in flags)){ flags.signed = [true, false]; } - if(!("separator" in flags)){ - flags.separator = ""; - }else if(!("groupSize" in flags)){ - flags.groupSize = 3; - } + //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 = win.doc; - var signRE = dojo.regexp.buildGroupRE(flags.signed, - function(q){ return q ? "[-+]" : ""; }, - true - ); + 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); - var numberRE = dojo.regexp.buildGroupRE(flags.separator, - function(sep){ - if(!sep){ - return "(?:\\d+)"; - } + 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(win.body(), "selectstart", event.stop), + on(de, touch.release, lang.hitch(this, "_stopDrag")) + ]); + event.stop(e); + }, - sep = dojo.regexp.escapeString(sep); - if(sep == " "){ sep = "\\s"; } - else if(sep == "\xa0"){ sep = "\\s\\xa0"; } + _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); + }, - var grp = flags.groupSize, grp2 = flags.groupSize2; - //TODO: should we continue to enforce that numbers with separators begin with 1-9? See #6933 - if(grp2){ - var grp2RE = "(?:0|[1-9]\\d{0," + (grp2-1) + "}(?:[" + sep + "]\\d{" + grp2 + "})*[" + sep + "]\\d{" + grp + "})"; - return ((grp-grp2) > 0) ? "(?:" + grp2RE + "|(?:0|[1-9]\\d{0," + (grp-1) + "}))" : grp2RE; + _stopDrag: function(e){ + try{ + if(this.cover){ + domClass.remove(this.cover, "dijitSplitterCoverActive"); } - return "(?:0|[1-9]\\d{0," + (grp-1) + "}(?:[" + sep + "]\\d{" + grp + "})*)"; - }, - true - ); + 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; + } - return signRE + numberRE; // String -}; + 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(); } + }, -if(!dojo._hasResource["dijit.ProgressBar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.ProgressBar"] = true; -dojo.provide("dijit.ProgressBar"); + _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")); + } +}); -dojo.declare("dijit.ProgressBar", [dijit._Widget, dijit._Templated], { +var BorderContainer = declare("dijit.layout.BorderContainer", _LayoutWidget, { // summary: - // A progress indication widget, showing the amount completed - // (often the percentage completed) of a task. + // 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. // example: - // | <div dojoType="ProgressBar" - // | places="0" - // | value="..." maximum="..."> + // | <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> - // 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, + // 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", - // 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, + // 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, - // label: String? - // Label on progress bar. Defaults to percentage for determinate progress bar and - // blank for indeterminate progress bar. - label:"", + // liveSplitters: [const] Boolean + // Specifies whether splitters resize as you drag (true) or only upon mouseup (false) + liveSplitters: true, - // 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: '', + // persist: Boolean + // Save splitter positions in a cookie. + persist: false, - templateString: dojo.cache("dijit", "templates/ProgressBar.html", "<div class=\"dijitProgressBar dijitProgressBarEmpty\" role=\"progressbar\"\n\t><div dojoAttachPoint=\"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 dojoAttachPoint=\"labelNode\" class=\"dijitProgressBarLabel\" id=\"${id}_label\"></div\n\t><img dojoAttachPoint=\"indeterminateHighContrastImage\" class=\"dijitProgressBarIndeterminateHighContrastImage\" alt=\"\"\n/></div>\n"), + baseClass: "dijitBorderContainer", - // _indeterminateHighContrastImagePath: [private] dojo._URL - // URL to image to use for indeterminate progress bar when display is in high contrast mode - _indeterminateHighContrastImagePath: - dojo.moduleUrl("dijit", "themes/a11y/indeterminate_progress.gif"), + // _splitterClass: Function||String + // Optional hook to override the default Splitter widget used by BorderContainer + _splitterClass: _Splitter, postMixInProperties: function(){ - this.inherited(arguments); - if(!("value" in this.params)){ - this.value = this.indeterminate ? Infinity : this.progress; + // 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); }, - buildRendering: function(){ + startup: function(){ + if(this._started){ return; } + array.forEach(this.getChildren(), this._setupChild, this); 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 + _setupChild: function(/*dijit._Widget*/ child){ + // Override _LayoutWidget._setupChild(). - dojo.mixin(this, attributes || {}); - var tip = this.internalProgress, ap = this.domNode; - var percent = 1; - if(this.indeterminate){ - dijit.removeWaiState(ap, "valuenow"); - dijit.removeWaiState(ap, "valuemin"); - dijit.removeWaiState(ap, "valuemax"); - }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.progress / this.maximum; - } + var region = child.region; + if(region){ + this.inherited(arguments); - dijit.setWaiState(ap, "describedby", this.labelNode.id); - dijit.setWaiState(ap, "valuenow", this.progress); - dijit.setWaiState(ap, "valuemin", 0); - dijit.setWaiState(ap, "valuemax", this.maximum); - } - this.labelNode.innerHTML = this.report(percent); + domClass.add(child.domNode, this.baseClass+"Pane"); - dojo.toggleClass(this.domNode, "dijitProgressBarIndeterminate", this.indeterminate); - tip.style.width = (percent * 100) + "%"; - this.onChange(); - }, + var ltr = this.isLeftToRight(); + if(region == "leading"){ region = ltr ? "left" : "right"; } + if(region == "trailing"){ region = ltr ? "right" : "left"; } - _setValueAttr: function(v){ - this._set("value", v); - if(v == Infinity){ - this.update({indeterminate:true}); - }else{ - this.update({indeterminate:false, progress:v}); + // 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. } }, - _setLabelAttr: function(label){ - this._set("label", label); - this.update(); + layout: function(){ + // Implement _LayoutWidget.layout() virtual method. + this._layoutChildren(); }, - _setIndeterminateAttr: function(indeterminate){ - // Deprecated, use set("value", ...) instead - this.indeterminate = indeterminate; - this.update(); + addChild: function(/*dijit._Widget*/ child, /*Integer?*/ insertIndex){ + // Override _LayoutWidget.addChild(). + this.inherited(arguments); + if(this._started){ + this.layout(); //OPT + } }, - report: function(/*float*/percent){ - // summary: - // Generates message to show inside progress bar (normally indicating amount of task completed). - // May be overridden. - // tags: - // extension + removeChild: function(/*dijit._Widget*/ child){ + // Override _LayoutWidget.removeChild(). - return this.label ? this.label : - (this.indeterminate ? " " : dojo.number.format(percent, { type: "percent", places: this.places, locale: this.lang })); + 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"); }, - onChange: function(){ + 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: - // Callback fired when progress updates. + // Returns the widget responsible for rendering the splitter associated with region // tags: - // extension - } -}); - -} + // deprecated + return array.filter(this.getChildren(), function(child){ + return child.region == region; + })[0]._splitterWidget; + }, -if(!dojo._hasResource["dijit.ToolbarSeparator"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.ToolbarSeparator"] = true; -dojo.provide("dijit.ToolbarSeparator"); + 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); + }, -dojo.declare("dijit.ToolbarSeparator", - [ dijit._Widget, dijit._Templated ], - { + _layoutChildren: function(/*String?*/ changedChildId, /*Number?*/ changedChildSize){ // summary: - // A spacer between two `dijit.Toolbar` items - templateString: '<div class="dijitToolbarSeparator dijitInline" role="presentation"></div>', - buildRendering: function(){ - this.inherited(arguments); - dojo.setSelectable(this.domNode, false); - }, - isFocusable: function(){ - // summary: - // This widget isn't focusable, so pass along that fact. - // tags: - // protected - return false; - } + // 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; + }); -if(!dojo._hasResource["dijit.Toolbar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.Toolbar"] = true; -dojo.provide("dijit.Toolbar"); + // 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); + } +}); +// This argument can be specified for the children of a BorderContainer. +// 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.) +lang.extend(_WidgetBase, { + // region: [const] String + // Parameter for children of `dijit.layout.BorderContainer`. + // Values: "top", "bottom", "leading", "trailing", "left", "right", "center". + // See the `dijit.layout.BorderContainer` description for details. + region: '', -// Note: require of ToolbarSeparator is for back-compat, remove for 2.0 + // layoutPriority: [const] Number + // Parameter for children of `dijit.layout.BorderContainer`. + // Children with a higher layoutPriority will be placed closer to the BorderContainer center, + // between children with a lower layoutPriority. + layoutPriority: 0, -dojo.declare("dijit.Toolbar", - [dijit._Widget, dijit._Templated, dijit._KeyNavContainer], - { - // summary: - // A Toolbar widget, used to hold things like `dijit.Editor` buttons + // splitter: [const] Boolean + // Parameter for child of `dijit.layout.BorderContainer` 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, - templateString: - '<div class="dijit" role="toolbar" tabIndex="${tabIndex}" dojoAttachPoint="containerNode">' + - // '<table style="table-layout: fixed" class="dijitReset dijitToolbarTable">' + // factor out style - // '<tr class="dijitReset" dojoAttachPoint="containerNode"></tr>'+ - // '</table>' + - '</div>', + // minSize: [const] Number + // Parameter for children of `dijit.layout.BorderContainer`. + // Specifies a minimum size (in pixels) for this widget when resized by a splitter. + minSize: 0, - baseClass: "dijitToolbar", + // maxSize: [const] Number + // Parameter for children of `dijit.layout.BorderContainer`. + // Specifies a maximum size (in pixels) for this widget when resized by a splitter. + maxSize: Infinity +}); - postCreate: function(){ - this.inherited(arguments); +// For monkey patching +BorderContainer._Splitter = _Splitter; +BorderContainer._Gutter = _Gutter; - this.connectKeyNavHandlers( - this.isLeftToRight() ? [dojo.keys.LEFT_ARROW] : [dojo.keys.RIGHT_ARROW], - this.isLeftToRight() ? [dojo.keys.RIGHT_ARROW] : [dojo.keys.LEFT_ARROW] - ); - }, +return BorderContainer; +}); - startup: function(){ - if(this._started){ return; } +}, +'dojo/window':function(){ +define("dojo/window", ["./_base/lang", "./_base/sniff", "./_base/window", "./dom", "./dom-geometry", "./dom-style"], + function(lang, has, baseWindow, dom, geom, style) { - this.startupKeyNavChildren(); +// module: +// dojo/window +// summary: +// TODOC - this.inherited(arguments); - } -} -); +var window = lang.getObject("dojo.window", true); -} +/*===== +dojo.window = { + // summary: + // TODO +}; +window = dojo.window; +=====*/ -if(!dojo._hasResource["dojo.DeferredList"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.DeferredList"] = true; -dojo.provide("dojo.DeferredList"); +window.getBox = function(){ + // summary: + // Returns the dimensions and scroll position of the viewable area of a browser window + var + scrollRoot = (baseWindow.doc.compatMode == 'BackCompat') ? baseWindow.body() : baseWindow.doc.documentElement, + // get scroll position + scroll = geom.docScroll(), // scrollRoot.scrollTop/Left should work + w, h; + + if(has("touch")){ // if(scrollbars not supported) + var uiWindow = baseWindow.doc.parentWindow || baseWindow.doc.defaultView; // use UI window, not dojo.global window. baseWindow.doc.parentWindow probably not needed since it's not defined for webkit + // on mobile, scrollRoot.clientHeight <= uiWindow.innerHeight <= scrollRoot.offsetHeight, return uiWindow.innerHeight + w = uiWindow.innerWidth || scrollRoot.clientWidth; // || scrollRoot.clientXXX probably never evaluated + h = uiWindow.innerHeight || scrollRoot.clientHeight; + }else{ + // on desktops, scrollRoot.clientHeight <= scrollRoot.offsetHeight <= uiWindow.innerHeight, return scrollRoot.clientHeight + // uiWindow.innerWidth/Height includes the scrollbar and cannot be used + w = scrollRoot.clientWidth; + h = scrollRoot.clientHeight; + } + return { + l: scroll.x, + t: scroll.y, + w: w, + h: h + }; +}; -dojo.DeferredList = function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*Boolean?*/ fireOnOneErrback, /*Boolean?*/ consumeErrors, /*Function?*/ canceller){ +window.get = function(doc){ // summary: - // Provides event handling for a group of Deferred objects. - // description: - // DeferredList takes an array of existing deferreds and returns a new deferred of its own - // this new deferred will typically have its callback fired when all of the deferreds in - // the given list have fired their own deferreds. The parameters `fireOnOneCallback` and - // fireOnOneErrback, will fire before all the deferreds as appropriate - // - // list: - // The list of deferreds to be synchronizied with this DeferredList - // fireOnOneCallback: - // Will cause the DeferredLists callback to be fired as soon as any - // of the deferreds in its list have been fired instead of waiting until - // the entire list has finished - // fireonOneErrback: - // Will cause the errback to fire upon any of the deferreds errback - // canceller: - // A deferred canceller function, see dojo.Deferred - var resultList = []; - dojo.Deferred.call(this); - var self = this; - if(list.length === 0 && !fireOnOneCallback){ - this.resolve([0, []]); + // Get window object associated with document doc + + // In some IE versions (at least 6.0), document.parentWindow does not return a + // reference to the real window object (maybe a copy), so we must fix it as well + // We use IE specific execScript to attach the real window reference to + // document._parentWindow for later use + if(has("ie") && window !== document.parentWindow){ + /* + In IE 6, only the variable "window" can be used to connect events (others + may be only copies). + */ + doc.parentWindow.execScript("document._parentWindow = window;", "Javascript"); + //to prevent memory leak, unset it after use + //another possibility is to add an onUnload handler which seems overkill to me (liucougar) + var win = doc._parentWindow; + doc._parentWindow = null; + return win; // Window } - var finished = 0; - dojo.forEach(list, function(item, i){ - item.then(function(result){ - if(fireOnOneCallback){ - self.resolve([i, result]); + + return doc.parentWindow || doc.defaultView; // Window +}; + +window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){ + // summary: + // Scroll the passed node into view, if it is not already. + + // don't rely on node.scrollIntoView working just because the function is there + + try{ // catch unexpected/unrecreatable errors (#7808) since we can recover using a semi-acceptable native method + node = dom.byId(node); + var doc = node.ownerDocument || baseWindow.doc, + body = doc.body || baseWindow.body(), + html = doc.documentElement || body.parentNode, + isIE = has("ie"), isWK = has("webkit"); + // if an untested browser, then use the native method + if((!(has("mozilla") || isIE || isWK || has("opera")) || node == body || node == html) && (typeof node.scrollIntoView != "undefined")){ + node.scrollIntoView(false); // short-circuit to native if possible + return; + } + var backCompat = doc.compatMode == 'BackCompat', + clientAreaRoot = (isIE >= 9 && node.ownerDocument.parentWindow.frameElement) + ? ((html.clientHeight > 0 && html.clientWidth > 0 && (body.clientHeight == 0 || body.clientWidth == 0 || body.clientHeight > html.clientHeight || body.clientWidth > html.clientWidth)) ? html : body) + : (backCompat ? body : html), + scrollRoot = isWK ? body : clientAreaRoot, + rootWidth = clientAreaRoot.clientWidth, + rootHeight = clientAreaRoot.clientHeight, + rtl = !geom.isBodyLtr(), + nodePos = pos || geom.position(node), + el = node.parentNode, + isFixed = function(el){ + return ((isIE <= 6 || (isIE && backCompat))? false : (style.get(el, 'position').toLowerCase() == "fixed")); + }; + if(isFixed(node)){ return; } // nothing to do + + while(el){ + if(el == body){ el = scrollRoot; } + var elPos = geom.position(el), + fixedPos = isFixed(el); + + if(el == scrollRoot){ + elPos.w = rootWidth; elPos.h = rootHeight; + if(scrollRoot == html && isIE && rtl){ elPos.x += scrollRoot.offsetWidth-elPos.w; } // IE workaround where scrollbar causes negative x + if(elPos.x < 0 || !isIE){ elPos.x = 0; } // IE can have values > 0 + if(elPos.y < 0 || !isIE){ elPos.y = 0; } }else{ - addResult(true, result); + var pb = geom.getPadBorderExtents(el); + elPos.w -= pb.w; elPos.h -= pb.h; elPos.x += pb.l; elPos.y += pb.t; + var clientSize = el.clientWidth, + scrollBarSize = elPos.w - clientSize; + if(clientSize > 0 && scrollBarSize > 0){ + elPos.w = clientSize; + elPos.x += (rtl && (isIE || el.clientLeft > pb.l/*Chrome*/)) ? scrollBarSize : 0; + } + clientSize = el.clientHeight; + scrollBarSize = elPos.h - clientSize; + if(clientSize > 0 && scrollBarSize > 0){ + elPos.h = clientSize; + } } - },function(error){ - if(fireOnOneErrback){ - self.reject(error); - }else{ - addResult(false, error); + if(fixedPos){ // bounded by viewport, not parents + if(elPos.y < 0){ + elPos.h += elPos.y; elPos.y = 0; + } + if(elPos.x < 0){ + elPos.w += elPos.x; elPos.x = 0; + } + if(elPos.y + elPos.h > rootHeight){ + elPos.h = rootHeight - elPos.y; + } + if(elPos.x + elPos.w > rootWidth){ + elPos.w = rootWidth - elPos.x; + } } - if(consumeErrors){ - return null; + // calculate overflow in all 4 directions + var l = nodePos.x - elPos.x, // beyond left: < 0 + t = nodePos.y - Math.max(elPos.y, 0), // beyond top: < 0 + r = l + nodePos.w - elPos.w, // beyond right: > 0 + bot = t + nodePos.h - elPos.h; // beyond bottom: > 0 + if(r * l > 0){ + var s = Math[l < 0? "max" : "min"](l, r); + if(rtl && ((isIE == 8 && !backCompat) || isIE >= 9)){ s = -s; } + nodePos.x += el.scrollLeft; + el.scrollLeft += s; + nodePos.x -= el.scrollLeft; } - throw error; - }); - function addResult(succeeded, result){ - resultList[i] = [succeeded, result]; - finished++; - if(finished === list.length){ - self.resolve(resultList); + if(bot * t > 0){ + nodePos.y += el.scrollTop; + el.scrollTop += Math[t < 0? "max" : "min"](t, bot); + nodePos.y -= el.scrollTop; } - + el = (el != scrollRoot) && !fixedPos && el.parentNode; } - }); + }catch(error){ + console.error('scrollIntoView: ' + error); + node.scrollIntoView(false); + } }; -dojo.DeferredList.prototype = new dojo.Deferred(); -dojo.DeferredList.prototype.gatherResults= function(deferredList){ +return window; +}); + +}, +'dojo/number':function(){ +define("dojo/number", ["./_base/kernel", "./_base/lang", "./i18n", "./i18n!./cldr/nls/number", "./string", "./regexp"], + function(dojo, lang, i18n, nlsNumber, dstring, dregexp) { + + // module: + // dojo/number // summary: - // Gathers the results of the deferreds for packaging - // as the parameters to the Deferred Lists' callback + // TODOC - var d = new dojo.DeferredList(deferredList, false, true, false); - d.addCallback(function(results){ - var ret = []; - dojo.forEach(results, function(result){ - ret.push(result[1]); - }); - return ret; - }); - return d; -}; +lang.getObject("number", true, dojo); +/*===== +dojo.number = { + // summary: localized formatting and parsing routines for Number } -if(!dojo._hasResource["dijit.tree.TreeStoreModel"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.tree.TreeStoreModel"] = true; -dojo.provide("dijit.tree.TreeStoreModel"); +dojo.number.__FormatOptions = function(){ + // pattern: String? + // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) + // with this string. Default value is based on locale. Overriding this property will defeat + // localization. Literal characters in patterns are not supported. + // type: String? + // choose a format type based on the locale from the following: + // decimal, scientific (not yet supported), percent, currency. decimal by default. + // places: Number? + // fixed number of decimal places to show. This overrides any + // information in the provided pattern. + // round: Number? + // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1 + // means do not round. + // locale: String? + // override the locale used to determine formatting rules + // fractional: Boolean? + // If false, show no decimal places, overriding places and pattern settings. + this.pattern = pattern; + this.type = type; + this.places = places; + this.round = round; + this.locale = locale; + this.fractional = fractional; +} +=====*/ +dojo.number.format = function(/*Number*/value, /*dojo.number.__FormatOptions?*/options){ + // summary: + // Format a Number as a String, using locale-specific settings + // description: + // Create a string from a Number using a known localized pattern. + // Formatting patterns appropriate to the locale are chosen from the + // [Common Locale Data Repository](http://unicode.org/cldr) as well as the appropriate symbols and + // delimiters. + // If value is Infinity, -Infinity, or is not a valid JavaScript number, return null. + // value: + // the number to be formatted -dojo.declare( - "dijit.tree.TreeStoreModel", - null, - { - // summary: - // Implements dijit.Tree.model connecting to a store with a single - // root item. Any methods passed into the constructor will override - // the ones defined here. + options = lang.mixin({}, options || {}); + var locale = i18n.normalizeLocale(options.locale), + bundle = i18n.getLocalization("dojo.cldr", "number", locale); + options.customs = bundle; + var pattern = options.pattern || bundle[(options.type || "decimal") + "Format"]; + if(isNaN(value) || Math.abs(value) == Infinity){ return null; } // null + return dojo.number._applyPattern(value, pattern, options); // String +}; - // store: dojo.data.Store - // Underlying store - store: null, +//dojo.number._numberPatternRE = /(?:[#0]*,?)*[#0](?:\.0*#*)?/; // not precise, but good enough +dojo.number._numberPatternRE = /[#0,]*[#0](?:\.0*#*)?/; // not precise, but good enough - // childrenAttrs: String[] - // One or more attribute names (attributes in the dojo.data item) that specify that item's children - childrenAttrs: ["children"], +dojo.number._applyPattern = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatOptions?*/options){ + // summary: + // Apply pattern to format value as a string using options. Gives no + // consideration to local customs. + // value: + // the number to be formatted. + // pattern: + // a pattern string as described by + // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) + // options: dojo.number.__FormatOptions? + // _applyPattern is usually called via `dojo.number.format()` which + // populates an extra property in the options parameter, "customs". + // The customs object specifies group and decimal parameters if set. - // 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", + //TODO: support escapes + options = options || {}; + var group = options.customs.group, + decimal = options.customs.decimal, + patternList = pattern.split(';'), + positivePattern = patternList[0]; + pattern = patternList[(value < 0) ? 1 : 0] || ("-" + positivePattern); - // labelAttr: String - // If specified, get label for tree node from this attribute, rather - // than by calling store.getLabel() - labelAttr: "", + //TODO: only test against unescaped + if(pattern.indexOf('%') != -1){ + value *= 100; + }else if(pattern.indexOf('\u2030') != -1){ + value *= 1000; // per mille + }else if(pattern.indexOf('\u00a4') != -1){ + group = options.customs.currencyGroup || group;//mixins instead? + decimal = options.customs.currencyDecimal || decimal;// Should these be mixins instead? + pattern = pattern.replace(/\u00a4{1,3}/, function(match){ + var prop = ["symbol", "currency", "displayName"][match.length-1]; + return options[prop] || options.currency || ""; + }); + }else if(pattern.indexOf('E') != -1){ + throw new Error("exponential notation not supported"); + } - // root: [readonly] dojo.data.Item - // Pointer to the root item (read only, not a parameter) - root: null, + //TODO: support @ sig figs? + var numberPatternRE = dojo.number._numberPatternRE; + var numberPattern = positivePattern.match(numberPatternRE); + if(!numberPattern){ + throw new Error("unable to find a number expression in pattern: "+pattern); + } + if(options.fractional === false){ options.places = 0; } + return pattern.replace(numberPatternRE, + dojo.number._formatAbsolute(value, numberPattern[0], {decimal: decimal, group: group, places: options.places, round: options.round})); +}; - // 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, +dojo.number.round = function(/*Number*/value, /*Number?*/places, /*Number?*/increment){ + // summary: + // Rounds to the nearest value with the given number of decimal places, away from zero + // description: + // Rounds to the nearest value with the given number of decimal places, away from zero if equal. + // Similar to Number.toFixed(), but compensates for browser quirks. Rounding can be done by + // fractional increments also, such as the nearest quarter. + // NOTE: Subject to floating point errors. See dojox.math.round for experimental workaround. + // value: + // The number to round + // places: + // The number of decimal places where rounding takes place. Defaults to 0 for whole rounding. + // Must be non-negative. + // increment: + // Rounds next place to nearest value of increment/10. 10 by default. + // example: + // >>> dojo.number.round(-0.5) + // -1 + // >>> dojo.number.round(162.295, 2) + // 162.29 // note floating point error. Should be 162.3 + // >>> dojo.number.round(10.71, 0, 2.5) + // 10.75 + var factor = 10 / (increment || 10); + return (factor * +value).toFixed(places) / factor; // Number +}; - constructor: function(/* Object */ args){ - // summary: - // Passed the arguments listed above (store, etc) - // tags: - // private +if((0.9).toFixed() == 0){ + // (isIE) toFixed() bug workaround: Rounding fails on IE when most significant digit + // is just after the rounding place and is >=5 + var round = dojo.number.round; + dojo.number.round = function(v, p, m){ + var d = Math.pow(10, -p || 0), a = Math.abs(v); + if(!v || a >= d || a * Math.pow(10, p + 1) < 5){ + d = 0; + } + return round(v, p, m) + (v > 0 ? d : -d); + }; +} - dojo.mixin(this, args); +/*===== +dojo.number.__FormatAbsoluteOptions = function(){ + // decimal: String? + // the decimal separator + // group: String? + // the group separator + // places: Number?|String? + // number of decimal places. the range "n,m" will format to m places. + // round: Number? + // 5 rounds to nearest .5; 0 rounds to nearest whole (default). -1 + // means don't round. + this.decimal = decimal; + this.group = group; + this.places = places; + this.round = round; +} +=====*/ - this.connects = []; +dojo.number._formatAbsolute = function(/*Number*/value, /*String*/pattern, /*dojo.number.__FormatAbsoluteOptions?*/options){ + // summary: + // Apply numeric pattern to absolute value using options. Gives no + // consideration to local customs. + // value: + // the number to be formatted, ignores sign + // pattern: + // the number portion of a pattern (e.g. `#,##0.00`) + options = options || {}; + if(options.places === true){options.places=0;} + if(options.places === Infinity){options.places=6;} // avoid a loop; pick a limit - var store = this.store; - if(!store.getFeatures()['dojo.data.api.Identity']){ - throw new Error("dijit.Tree: store must support dojo.data.Identity"); - } + var patternParts = pattern.split("."), + comma = typeof options.places == "string" && options.places.indexOf(","), + maxPlaces = options.places; + if(comma){ + maxPlaces = options.places.substring(comma + 1); + }else if(!(maxPlaces >= 0)){ + maxPlaces = (patternParts[1] || []).length; + } + if(!(options.round < 0)){ + value = dojo.number.round(value, maxPlaces, options.round); + } - // if the store supports Notification, subscribe to the notification events - if(store.getFeatures()['dojo.data.api.Notification']){ - this.connects = this.connects.concat([ - dojo.connect(store, "onNew", this, "onNewItem"), - dojo.connect(store, "onDelete", this, "onDeleteItem"), - dojo.connect(store, "onSet", this, "onSetItem") - ]); - } - }, + var valueParts = String(Math.abs(value)).split("."), + fractional = valueParts[1] || ""; + if(patternParts[1] || options.places){ + if(comma){ + options.places = options.places.substring(0, comma); + } + // Pad fractional with trailing zeros + var pad = options.places !== undefined ? options.places : (patternParts[1] && patternParts[1].lastIndexOf("0") + 1); + if(pad > fractional.length){ + valueParts[1] = dstring.pad(fractional, pad, '0', true); + } - destroy: function(){ - dojo.forEach(this.connects, dojo.disconnect); - // TODO: should cancel any in-progress processing of getRoot(), getChildren() - }, + // Truncate fractional + if(maxPlaces < fractional.length){ + valueParts[1] = fractional.substr(0, maxPlaces); + } + }else{ + if(valueParts[1]){ valueParts.pop(); } + } - // ======================================================================= - // Methods for traversing hierarchy + // Pad whole with leading zeros + var patternDigits = patternParts[0].replace(',', ''); + pad = patternDigits.indexOf("0"); + if(pad != -1){ + pad = patternDigits.length - pad; + if(pad > valueParts[0].length){ + valueParts[0] = dstring.pad(valueParts[0], pad); + } - 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: dojo.hitch(this, function(items){ - if(items.length != 1){ - throw new Error(this.declaredClass + ": query " + dojo.toJson(this.query) + " returned " + items.length + - " items, but must return exactly one item"); - } - this.root = items[0]; - onItem(this.root); - }), - onError: onError - }); - } - }, + // Truncate whole + if(patternDigits.indexOf("#") == -1){ + valueParts[0] = valueParts[0].substr(valueParts[0].length - pad); + } + } - 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 dojo.some(this.childrenAttrs, function(attr){ - return this.store.hasAttribute(item, attr); - }, this); - }, + // Add group separators + var index = patternParts[0].lastIndexOf(','), + groupSize, groupSize2; + if(index != -1){ + groupSize = patternParts[0].length - index - 1; + var remainder = patternParts[0].substr(0, index); + index = remainder.lastIndexOf(','); + if(index != -1){ + groupSize2 = remainder.length - index - 1; + } + } + var pieces = []; + for(var whole = valueParts[0]; whole;){ + var off = whole.length - groupSize; + pieces.push((off > 0) ? whole.substr(off) : whole); + whole = (off > 0) ? whole.slice(0, off) : ""; + if(groupSize2){ + groupSize = groupSize2; + delete groupSize2; + } + } + valueParts[0] = pieces.reverse().join(options.group || ","); - 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. + return valueParts.join(options.decimal || "."); +}; - 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 = dojo.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); - } +/*===== +dojo.number.__RegexpOptions = function(){ + // pattern: String? + // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) + // with this string. Default value is based on locale. Overriding this property will defeat + // localization. + // type: String? + // choose a format type based on the locale from the following: + // decimal, scientific (not yet supported), percent, currency. decimal by default. + // locale: String? + // override the locale used to determine formatting rules + // strict: Boolean? + // strict parsing, false by default. Strict parsing requires input as produced by the format() method. + // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators + // places: Number|String? + // number of decimal places to accept: Infinity, a positive number, or + // a range "n,m". Defined by pattern or Infinity if pattern not provided. + this.pattern = pattern; + this.type = type; + this.locale = locale; + this.strict = strict; + this.places = places; +} +=====*/ +dojo.number.regexp = function(/*dojo.number.__RegexpOptions?*/options){ + // summary: + // Builds the regular needed to parse a number + // description: + // Returns regular expression with positive and negative match, group + // and decimal separators + return dojo.number._parseInfo(options).regexp; // String +}; - // count how many items need to be loaded - var _waitCount = 0; - if(!this.deferItemLoadingUntilExpand){ - dojo.forEach(childItems, function(item){ if(!store.isItemLoaded(item)){ _waitCount++; } }); - } +dojo.number._parseInfo = function(/*Object?*/options){ + options = options || {}; + var locale = i18n.normalizeLocale(options.locale), + bundle = i18n.getLocalization("dojo.cldr", "number", locale), + pattern = options.pattern || bundle[(options.type || "decimal") + "Format"], +//TODO: memoize? + group = bundle.group, + decimal = bundle.decimal, + factor = 1; - 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 - dojo.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 + if(pattern.indexOf('%') != -1){ + factor /= 100; + }else if(pattern.indexOf('\u2030') != -1){ + factor /= 1000; // per mille + }else{ + var isCurrency = pattern.indexOf('\u00a4') != -1; + if(isCurrency){ + group = bundle.currencyGroup || group; + decimal = bundle.currencyDecimal || decimal; + } + } - isItem: function(/* anything */ something){ - return this.store.isItem(something); // Boolean - }, + //TODO: handle quoted escapes + var patternList = pattern.split(';'); + if(patternList.length == 1){ + patternList.push("-" + patternList[0]); + } - fetchItemByIdentity: function(/* object */ keywordArgs){ - this.store.fetchItemByIdentity(keywordArgs); - }, + var re = dregexp.buildGroupRE(patternList, function(pattern){ + pattern = "(?:"+dregexp.escapeString(pattern, '.')+")"; + return pattern.replace(dojo.number._numberPatternRE, function(format){ + var flags = { + signed: false, + separator: options.strict ? group : [group,""], + fractional: options.fractional, + decimal: decimal, + exponent: false + }, - getIdentity: function(/* item */ item){ - return this.store.getIdentity(item); // Object - }, + parts = format.split('.'), + places = options.places; - 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 + // special condition for percent (factor != 1) + // allow decimal places even if not specified in pattern + if(parts.length == 1 && factor != 1){ + parts[1] = "###"; } - }, - - // ======================================================================= - // Write interface - - newItem: function(/* dojo.dnd.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. - // 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); - } - } - }}); + if(parts.length == 1 || places === 0){ + flags.fractional = false; }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){ - dojo.forEach(this.childrenAttrs, function(attr){ - if(store.containsValue(oldParentItem, attr, childItem)){ - if(!bCopy){ - var values = dojo.filter(store.getValues(oldParentItem, attr), function(x){ - return x != childItem; - }); - store.setValues(oldParentItem, attr, values); - } - parentAttr = attr; - } - }); + if(places === undefined){ places = options.pattern ? parts[1].lastIndexOf('0') + 1 : Infinity; } + if(places && options.fractional == undefined){flags.fractional = true;} // required fractional, unless otherwise specified + if(!options.places && (places < parts[1].length)){ places += "," + parts[1].length; } + flags.places = places; } - - // 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)); + var groups = parts[0].split(','); + if(groups.length > 1){ + flags.groupSize = groups.pop().length; + if(groups.length > 1){ + flags.groupSize2 = groups.pop().length; } } - }, + return "("+dojo.number._realNumberRegexp(flags)+")"; + }); + }, true); - // ======================================================================= - // Callbacks + if(isCurrency){ + // substitute the currency symbol for the placeholder in the pattern + re = re.replace(/([\s\xa0]*)(\u00a4{1,3})([\s\xa0]*)/g, function(match, before, target, after){ + var prop = ["symbol", "currency", "displayName"][target.length-1], + symbol = dregexp.escapeString(options[prop] || options.currency || ""); + before = before ? "[\\s\\xa0]" : ""; + after = after ? "[\\s\\xa0]" : ""; + if(!options.strict){ + if(before){before += "*";} + if(after){after += "*";} + return "(?:"+before+symbol+after+")?"; + } + return before+symbol+after; + }); + } - 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 - }, +//TODO: substitute localized sign/percent/permille/etc.? - onChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){ - // summary: - // Callback to do notifications about new, updated, or deleted items. - // tags: - // callback - }, + // normalize whitespace and return + return {regexp: re.replace(/[\xa0 ]/g, "[\\s\\xa0]"), group: group, decimal: decimal, factor: factor}; // Object +}; - onDelete: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){ - // 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 - }, +/*===== +dojo.number.__ParseOptions = function(){ + // pattern: String? + // override [formatting pattern](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) + // with this string. Default value is based on locale. Overriding this property will defeat + // localization. Literal characters in patterns are not supported. + // type: String? + // choose a format type based on the locale from the following: + // decimal, scientific (not yet supported), percent, currency. decimal by default. + // locale: String? + // override the locale used to determine formatting rules + // strict: Boolean? + // strict parsing, false by default. Strict parsing requires input as produced by the format() method. + // Non-strict is more permissive, e.g. flexible on white space, omitting thousands separators + // fractional: Boolean?|Array? + // Whether to include the fractional portion, where the number of decimal places are implied by pattern + // or explicit 'places' parameter. The value [true,false] makes the fractional portion optional. + this.pattern = pattern; + this.type = type; + this.locale = locale; + this.strict = strict; + this.fractional = fractional; +} +=====*/ +dojo.number.parse = function(/*String*/expression, /*dojo.number.__ParseOptions?*/options){ + // summary: + // Convert a properly formatted string to a primitive Number, using + // locale-specific settings. + // description: + // Create a Number from a string using a known localized pattern. + // Formatting patterns are chosen appropriate to the locale + // and follow the syntax described by + // [unicode.org TR35](http://www.unicode.org/reports/tr35/#Number_Format_Patterns) + // Note that literal characters in patterns are not supported. + // expression: + // A string representation of a Number + var info = dojo.number._parseInfo(options), + results = (new RegExp("^"+info.regexp+"$")).exec(expression); + if(!results){ + return NaN; //NaN + } + var absoluteMatch = results[1]; // match for the positive expression + if(!results[1]){ + if(!results[2]){ + return NaN; //NaN + } + // matched the negative pattern + absoluteMatch =results[2]; + info.factor *= -1; + } - // ======================================================================= - // Events from data store + // Transform it to something Javascript can parse as a number. Normalize + // decimal point and strip out group separators or alternate forms of whitespace + absoluteMatch = absoluteMatch. + replace(new RegExp("["+info.group + "\\s\\xa0"+"]", "g"), ""). + replace(info.decimal, "."); + // Adjust for negative sign, percent, etc. as necessary + return absoluteMatch * info.factor; //Number +}; - 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 +/*===== +dojo.number.__RealNumberRegexpFlags = function(){ + // places: Number? + // The integer number of decimal places or a range given as "n,m". If + // not given, the decimal part is optional and the number of places is + // unlimited. + // decimal: String? + // A string for the character used as the decimal point. Default + // is ".". + // fractional: Boolean?|Array? + // Whether decimal places are used. Can be true, false, or [true, + // false]. Default is [true, false] which means optional. + // exponent: Boolean?|Array? + // Express in exponential notation. Can be true, false, or [true, + // false]. Default is [true, false], (i.e. will match if the + // exponential part is present are not). + // eSigned: Boolean?|Array? + // The leading plus-or-minus sign on the exponent. Can be true, + // false, or [true, false]. Default is [true, false], (i.e. will + // match if it is signed or unsigned). flags in regexp.integer can be + // applied. + this.places = places; + this.decimal = decimal; + this.fractional = fractional; + this.exponent = exponent; + this.eSigned = eSigned; +} +=====*/ - // We only care about the new item if it has a parent that corresponds to a TreeNode - // we are currently displaying - if(!parentInfo){ - return; - } +dojo.number._realNumberRegexp = function(/*dojo.number.__RealNumberRegexpFlags?*/flags){ + // summary: + // Builds a regular expression to match a real number in exponential + // notation - // 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, dojo.hitch(this, function(children){ - this.onChildrenChange(parentInfo.item, children); - })); - }, + // assign default values to missing parameters + flags = flags || {}; + //TODO: use mixin instead? + if(!("places" in flags)){ flags.places = Infinity; } + if(typeof flags.decimal != "string"){ flags.decimal = "."; } + if(!("fractional" in flags) || /^0/.test(flags.places)){ flags.fractional = [true, false]; } + if(!("exponent" in flags)){ flags.exponent = [true, false]; } + if(!("eSigned" in flags)){ flags.eSigned = [true, false]; } - onDeleteItem: function(/*Object*/ item){ - // summary: - // Handler for delete notifications from underlying store - this.onDelete(item); + var integerRE = dojo.number._integerRegexp(flags), + decimalRE = dregexp.buildGroupRE(flags.fractional, + function(q){ + var re = ""; + if(q && (flags.places!==0)){ + re = "\\" + flags.decimal; + if(flags.places == Infinity){ + re = "(?:" + re + "\\d+)?"; + }else{ + re += "\\d{" + flags.places + "}"; + } + } + return re; }, + true + ); - onSetItem: function(/* item */ item, - /* attribute-name-string */ attribute, - /* object | array */ oldValue, - /* object | array */ 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. - // tags: - // extension - - if(dojo.indexOf(this.childrenAttrs, attribute) != -1){ - // item's children list changed - this.getChildren(item, dojo.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); - } + var exponentRE = dregexp.buildGroupRE(flags.exponent, + function(q){ + if(q){ return "([eE]" + dojo.number._integerRegexp({ signed: flags.eSigned}) + ")"; } + return ""; } - }); + ); + + var realRE = integerRE + decimalRE; + // allow for decimals without integers, e.g. .25 + if(decimalRE){realRE = "(?:(?:"+ realRE + ")|(?:" + decimalRE + "))";} + return realRE + exponentRE; // String +}; +/*===== +dojo.number.__IntegerRegexpFlags = function(){ + // signed: Boolean? + // The leading plus-or-minus sign. Can be true, false, or `[true,false]`. + // Default is `[true, false]`, (i.e. will match if it is signed + // or unsigned). + // separator: String? + // The character used as the thousands separator. Default is no + // separator. For more than one symbol use an array, e.g. `[",", ""]`, + // makes ',' optional. + // groupSize: Number? + // group size between separators + // groupSize2: Number? + // second grouping, where separators 2..n have a different interval than the first separator (for India) + this.signed = signed; + this.separator = separator; + this.groupSize = groupSize; + this.groupSize2 = groupSize2; } +=====*/ -if(!dojo._hasResource["dijit.tree.ForestStoreModel"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.tree.ForestStoreModel"] = true; -dojo.provide("dijit.tree.ForestStoreModel"); +dojo.number._integerRegexp = function(/*dojo.number.__IntegerRegexpFlags?*/flags){ + // summary: + // Builds a regular expression that matches an integer + // assign default values to missing parameters + flags = flags || {}; + if(!("signed" in flags)){ flags.signed = [true, false]; } + if(!("separator" in flags)){ + flags.separator = ""; + }else if(!("groupSize" in flags)){ + flags.groupSize = 3; + } + var signRE = dregexp.buildGroupRE(flags.signed, + function(q){ return q ? "[-+]" : ""; }, + true + ); -dojo.declare("dijit.tree.ForestStoreModel", dijit.tree.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 + var numberRE = dregexp.buildGroupRE(flags.separator, + function(sep){ + if(!sep){ + return "(?:\\d+)"; + } - // Parameters to constructor + sep = dregexp.escapeString(sep); + if(sep == " "){ sep = "\\s"; } + else if(sep == "\xa0"){ sep = "\\s\\xa0"; } - // rootId: String - // ID of fabricated root item - rootId: "$root$", + var grp = flags.groupSize, grp2 = flags.groupSize2; + //TODO: should we continue to enforce that numbers with separators begin with 1-9? See #6933 + if(grp2){ + var grp2RE = "(?:0|[1-9]\\d{0," + (grp2-1) + "}(?:[" + sep + "]\\d{" + grp2 + "})*[" + sep + "]\\d{" + grp + "})"; + return ((grp-grp2) > 0) ? "(?:" + grp2RE + "|(?:0|[1-9]\\d{0," + (grp-1) + "}))" : grp2RE; + } + return "(?:0|[1-9]\\d{0," + (grp-1) + "}(?:[" + sep + "]\\d{" + grp + "})*)"; + }, + true + ); - // rootLabel: String - // Label of fabricated root item - rootLabel: "ROOT", + return signRE + numberRE; // String +}; - // query: String - // Specifies the set of children of the root item. - // example: - // | {type:'continent'} - query: null, +return dojo.number; +}); - // End of parameters to constructor +}, +'dijit/_FocusMixin':function(){ +define("dijit/_FocusMixin", [ + "./focus", + "./_WidgetBase", + "dojo/_base/declare", // declare + "dojo/_base/lang" // lang.extend +], function(focus, _WidgetBase, declare, lang){ - constructor: function(params){ - // summary: - // Sets up variables, etc. - // tags: - // private +/*===== + var _WidgetBase = dijit._WidgetBase; +=====*/ - // Make dummy root item - this.root = { - store: this, - root: true, - id: params.rootId, - label: params.rootLabel, - children: params.rootChildren // optional param - }; - }, + // module: + // dijit/_FocusMixin + // summary: + // Mixin to widget to provide _onFocus() and _onBlur() methods that + // fire when a widget or it's descendants get/lose focus + + // 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 + }, - // ======================================================================= - // Methods for traversing hierarchy + 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 + }, - 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); - }, + _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(); + }, - 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: dojo.hitch(this, function(items){ - this.root.children = items; - callback(items); - }), - onError: onError - }); - } - }else{ - this.inherited(arguments); + _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(); } - }, + }); - // ======================================================================= - // Inspecting items + return declare("dijit._FocusMixin", null, { + // summary: + // Mixin to widget to provide _onFocus() and _onBlur() methods that + // fire when a widget or it's descendants get/lose focus - isItem: function(/* anything */ something){ - return (something === this.root) ? true : this.inherited(arguments); - }, + // flag that I want _onFocus()/_onBlur() notifications from focus manager + _focusManager: focus + }); - fetchItemByIdentity: function(/* object */ keywordArgs){ - if(keywordArgs.identity == this.root.id){ - var scope = keywordArgs.scope?keywordArgs.scope:dojo.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); - }, +}, +'dojo/data/util/filter':function(){ +define("dojo/data/util/filter", ["dojo/_base/lang"], function(lang) { + // module: + // dojo/data/util/filter + // summary: + // TODOC - getLabel: function(/* item */ item){ - return (item === this.root) ? this.root.label : this.inherited(arguments); - }, +var filter = lang.getObject("dojo.data.util.filter", true); - // ======================================================================= - // Write interface +filter.patternToRegExp = function(/*String*/pattern, /*boolean?*/ ignoreCase){ + // summary: + // Helper function to convert a simple pattern to a regular expression for matching. + // description: + // Returns a regular expression object that conforms to the defined conversion rules. + // For example: + // ca* -> /^ca.*$/ + // *ca* -> /^.*ca.*$/ + // *c\*a* -> /^.*c\*a.*$/ + // *c\*a?* -> /^.*c\*a..*$/ + // and so on. + // + // pattern: string + // A simple matching pattern to convert that follows basic rules: + // * Means match anything, so ca* means match anything starting with ca + // ? Means match single character. So, b?b will match to bob and bab, and so on. + // \ is an escape character. So for example, \* means do not treat * as a match, but literal character *. + // To use a \ as a character in the string, it must be escaped. So in the pattern it should be + // represented by \\ to be treated as an ordinary \ character instead of an escape. + // + // ignoreCase: + // An optional flag to indicate if the pattern matching should be treated as case-sensitive or not when comparing + // By default, it is assumed case sensitive. - newItem: function(/* dojo.dnd.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); + var rxp = "^"; + var c = null; + for(var i = 0; i < pattern.length; i++){ + c = pattern.charAt(i); + switch(c){ + case '\\': + rxp += c; + i++; + rxp += pattern.charAt(i); + break; + case '*': + rxp += ".*"; break; + case '?': + rxp += "."; break; + case '$': + case '^': + case '/': + case '+': + case '.': + case '|': + case '(': + case ')': + case '{': + case '}': + case '[': + case ']': + rxp += "\\"; //fallthrough + default: + rxp += c; } - }, - - onNewRootItem: function(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 - }, + } + rxp += "$"; + if(ignoreCase){ + return new RegExp(rxp,"mi"); //RegExp + }else{ + return new RegExp(rxp,"m"); //RegExp + } - 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); - } - } - dijit.tree.TreeStoreModel.prototype.pasteItem.call(this, 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 +return filter; +}); - 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"); - }, +}, +'dijit/_WidgetsInTemplateMixin':function(){ +define("dijit/_WidgetsInTemplateMixin", [ + "dojo/_base/array", // array.forEach + "dojo/_base/declare", // declare + "dojo/parser", // parser.parse + "dijit/registry" // registry.findWidgets +], function(array, declare, parser, registry){ + + // module: + // dijit/_WidgetsInTemplateMixin + // summary: + // Mixin to supplement _TemplatedMixin when template contains widgets - onLeaveRoot: function(/* item */ item){ + return declare("dijit._WidgetsInTemplateMixin", null, { // 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"); - }, + // Mixin to supplement _TemplatedMixin when template contains widgets - // ======================================================================= - // Events from data store + // _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, - _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: dojo.hitch(this, function(newChildren){ - this.root.children = newChildren; + // 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, - // If the list of children or the order of children has changed... - if(oldChildren.length != newChildren.length || - dojo.some(oldChildren, function(item, idx){ return newChildren[idx] != item;})){ - this.onChildrenChange(this.root, newChildren); - } - }) - }); - }, + _beforeFillContent: function(){ + if(this.widgetsInTemplate){ + // Before copying over content, instantiate widgets in template + var node = this.domNode; - onNewItem: function(/* dojo.data.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(); + 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 + })); - this.inherited(arguments); - }, + this._supportingWidgets = registry.findWidgets(node); - onDeleteItem: function(/*Object*/ item){ - // summary: - // Handler for delete notifications from underlying store + this._attachTemplateNodes(cw, function(n,p){ + return n[p]; + }); + } + }, - // check if this was a child of root, and if so send notification that root's children - // have changed - if(dojo.indexOf(this.root.children, item) != -1){ - this._requeryTop(); + startup: function(){ + array.forEach(this._startupWidgets, function(w){ + if(w && !w._started && w.startup){ + w.startup(); + } + }); + this.inherited(arguments); } - - 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); - } - + }); }); -} - -if(!dojo._hasResource["dojo.dnd.Container"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.dnd.Container"] = true; -dojo.provide("dojo.dnd.Container"); - - - - -/* - Container states: - "" - normal state - "Over" - mouse over a container - Container item states: - "" - normal state - "Over" - mouse over a container item -*/ - -/*===== -dojo.declare("dojo.dnd.__ContainerArgs", [], { - creator: function(){ - // summary: - // a creator function, which takes a data item, and returns an object like that: - // {node: newNode, data: usedData, type: arrayOfStrings} - }, - - // skipForm: Boolean - // don't start the drag operation, if clicked on form elements - skipForm: false, - - // dropParent: Node||String - // node or node's id to use as the parent node for dropped items - // (must be underneath the 'node' parameter in the DOM) - dropParent: null, +}, +'dojo/fx/Toggler':function(){ +define("dojo/fx/Toggler", ["../_base/lang","../_base/declare","../_base/fx", "../_base/connect"], + function(lang, declare, baseFx, connectUtil) { + // module: + // dojo/fx/Toggler + // summary: + // TODOC - // _skipStartup: Boolean - // skip startup(), which collects children, for deferred initialization - // (this is used in the markup mode) - _skipStartup: false -}); - -dojo.dnd.Item = function(){ +return declare("dojo.fx.Toggler", null, { // summary: - // Represents (one of) the source node(s) being dragged. - // Contains (at least) the "type" and "data" attributes. - // type: String[] - // Type(s) of this item, by default this is ["text"] - // data: Object - // Logical representation of the object being dragged. - // If the drag object's type is "text" then data is a String, - // if it's another type then data could be a different Object, - // perhaps a name/value hash. - - this.type = type; - this.data = data; -} -=====*/ + // A simple `dojo.Animation` toggler API. + // + // description: + // class constructor for an animation toggler. It accepts a packed + // set of arguments about what type of animation to use in each + // direction, duration, etc. All available members are mixed into + // these animations from the constructor (for example, `node`, + // `showDuration`, `hideDuration`). + // + // example: + // | var t = new dojo.fx.Toggler({ + // | node: "nodeId", + // | showDuration: 500, + // | // hideDuration will default to "200" + // | showFunc: dojo.fx.wipeIn, + // | // hideFunc will default to "fadeOut" + // | }); + // | t.show(100); // delay showing for 100ms + // | // ...time passes... + // | t.hide(); + + // node: DomNode + // the node to target for the showing and hiding animations + node: null, + + // showFunc: Function + // The function that returns the `dojo.Animation` to show the node + showFunc: baseFx.fadeIn, + + // hideFunc: Function + // The function that returns the `dojo.Animation` to hide the node + hideFunc: baseFx.fadeOut, + + // showDuration: + // Time in milliseconds to run the show Animation + showDuration: 200, + + // hideDuration: + // Time in milliseconds to run the hide Animation + hideDuration: 200, + + // FIXME: need a policy for where the toggler should "be" the next + // time show/hide are called if we're stopped somewhere in the + // middle. + // FIXME: also would be nice to specify individual showArgs/hideArgs mixed into + // each animation individually. + // FIXME: also would be nice to have events from the animations exposed/bridged -dojo.declare("dojo.dnd.Container", null, { - // summary: - // a Container object, which knows when mouse hovers over it, - // and over which element it hovers - - // object attributes (for markup) - skipForm: false, - /*===== - // current: DomNode - // The DOM node the mouse is currently hovered over - current: null, - - // map: Hash<String, dojo.dnd.Item> - // Map from an item's id (which is also the DOMNode's id) to - // the dojo.dnd.Item itself. - map: {}, + _showArgs: null, + _showAnim: null, + + _hideArgs: null, + _hideAnim: null, + + _isShowing: false, + _isHiding: false, =====*/ - - constructor: function(node, params){ - // summary: - // a constructor of the Container - // node: Node - // node or node's id to build the container on - // params: dojo.dnd.__ContainerArgs - // a dictionary of parameters - this.node = dojo.byId(node); - if(!params){ params = {}; } - this.creator = params.creator || null; - this.skipForm = params.skipForm; - this.parent = params.dropParent && dojo.byId(params.dropParent); - - // class-specific variables - this.map = {}; - this.current = null; - // states - this.containerState = ""; - dojo.addClass(this.node, "dojoDndContainer"); - - // mark up children - if(!(params && params._skipStartup)){ - this.startup(); - } + constructor: function(args){ + var _t = this; - // set up events - this.events = [ - dojo.connect(this.node, "onmouseover", this, "onMouseOver"), - dojo.connect(this.node, "onmouseout", this, "onMouseOut"), - // cancel text selection and text dragging - dojo.connect(this.node, "ondragstart", this, "onSelectStart"), - dojo.connect(this.node, "onselectstart", this, "onSelectStart") - ]; - }, - - // object attributes (for markup) - creator: function(){ - // summary: - // creator function, dummy at the moment - }, - - // abstract access to the map - getItem: function(/*String*/ key){ - // summary: - // returns a data item by its key (id) - return this.map[key]; // dojo.dnd.Item - }, - setItem: function(/*String*/ key, /*dojo.dnd.Item*/ data){ - // summary: - // associates a data item with its key (id) - this.map[key] = data; - }, - delItem: function(/*String*/ key){ - // summary: - // removes a data item from the map by its key (id) - delete this.map[key]; - }, - forInItems: function(/*Function*/ f, /*Object?*/ o){ - // summary: - // iterates over a data map skipping members that - // are present in the empty object (IE and/or 3rd-party libraries). - o = o || dojo.global; - var m = this.map, e = dojo.dnd._empty; - for(var i in m){ - if(i in e){ continue; } - f.call(o, m[i], i, this); - } - return o; // Object - }, - clearItems: function(){ - // summary: - // removes all data items from the map - this.map = {}; - }, - - // methods - getAllNodes: function(){ - // summary: - // returns a list (an array) of all valid child nodes - return dojo.query("> .dojoDndItem", this.parent); // NodeList - }, - sync: function(){ - // summary: - // sync up the node list with the data map - var map = {}; - this.getAllNodes().forEach(function(node){ - if(node.id){ - var item = this.getItem(node.id); - if(item){ - map[node.id] = item; - return; - } - }else{ - node.id = dojo.dnd.getUniqueId(); - } - var type = node.getAttribute("dndType"), - data = node.getAttribute("dndData"); - map[node.id] = { - data: data || node.innerHTML, - type: type ? type.split(/\s*,\s*/) : ["text"] - }; - }, this); - this.map = map; - return this; // self - }, - insertNodes: function(data, before, anchor){ - // summary: - // inserts an array of new nodes before/after an anchor node - // data: Array - // a list of data items, which should be processed by the creator function - // before: Boolean - // insert before the anchor, if true, and after the anchor otherwise - // anchor: Node - // the anchor node to be used as a point of insertion - if(!this.parent.firstChild){ - anchor = null; - }else if(before){ - if(!anchor){ - anchor = this.parent.firstChild; - } - }else{ - if(anchor){ - anchor = anchor.nextSibling; - } - } - if(anchor){ - for(var i = 0; i < data.length; ++i){ - var t = this._normalizedCreator(data[i]); - this.setItem(t.node.id, {data: t.data, type: t.type}); - this.parent.insertBefore(t.node, anchor); - } - }else{ - for(var i = 0; i < data.length; ++i){ - var t = this._normalizedCreator(data[i]); - this.setItem(t.node.id, {data: t.data, type: t.type}); - this.parent.appendChild(t.node); - } - } - return this; // self - }, - destroy: function(){ - // summary: - // prepares this object to be garbage-collected - dojo.forEach(this.events, dojo.disconnect); - this.clearItems(); - this.node = this.parent = this.current = null; - }, + lang.mixin(_t, args); + _t.node = args.node; + _t._showArgs = lang.mixin({}, args); + _t._showArgs.node = _t.node; + _t._showArgs.duration = _t.showDuration; + _t.showAnim = _t.showFunc(_t._showArgs); - // markup methods - markupFactory: function(params, node){ - params._skipStartup = true; - return new dojo.dnd.Container(node, params); - }, - startup: function(){ - // summary: - // collects valid child items and populate the map - - // set up the real parent node - if(!this.parent){ - // use the standard algorithm, if not assigned - this.parent = this.node; - if(this.parent.tagName.toLowerCase() == "table"){ - var c = this.parent.getElementsByTagName("tbody"); - if(c && c.length){ this.parent = c[0]; } - } - } - this.defaultCreator = dojo.dnd._defaultCreator(this.parent); + _t._hideArgs = lang.mixin({}, args); + _t._hideArgs.node = _t.node; + _t._hideArgs.duration = _t.hideDuration; + _t.hideAnim = _t.hideFunc(_t._hideArgs); - // process specially marked children - this.sync(); + connectUtil.connect(_t.showAnim, "beforeBegin", lang.hitch(_t.hideAnim, "stop", true)); + connectUtil.connect(_t.hideAnim, "beforeBegin", lang.hitch(_t.showAnim, "stop", true)); }, - // mouse events - onMouseOver: function(e){ - // summary: - // event processor for onmouseover - // e: Event - // mouse event - var n = e.relatedTarget; - while(n){ - if(n == this.node){ break; } - try{ - n = n.parentNode; - }catch(x){ - n = null; - } - } - if(!n){ - this._changeState("Container", "Over"); - this.onOverEvent(); - } - n = this._getChildByEvent(e); - if(this.current == n){ return; } - if(this.current){ this._removeItemClass(this.current, "Over"); } - if(n){ this._addItemClass(n, "Over"); } - this.current = n; - }, - onMouseOut: function(e){ - // summary: - // event processor for onmouseout - // e: Event - // mouse event - for(var n = e.relatedTarget; n;){ - if(n == this.node){ return; } - try{ - n = n.parentNode; - }catch(x){ - n = null; - } - } - if(this.current){ - this._removeItemClass(this.current, "Over"); - this.current = null; - } - this._changeState("Container", ""); - this.onOutEvent(); - }, - onSelectStart: function(e){ - // summary: - // event processor for onselectevent and ondragevent - // e: Event - // mouse event - if(!this.skipForm || !dojo.dnd.isFormElement(e)){ - dojo.stopEvent(e); - } - }, - - // utilities - onOverEvent: function(){ - // summary: - // this function is called once, when mouse is over our container - }, - onOutEvent: function(){ - // summary: - // this function is called once, when mouse is out of our container - }, - _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"; - //dojo.replaceClass(this.node, prefix + newState, prefix + this[state]); - dojo.replaceClass(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 - dojo.addClass(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 - dojo.removeClass(node, "dojoDndItem" + type); - }, - _getChildByEvent: function(e){ - // summary: - // gets a child, which is under the mouse at the moment, or null - // e: Event - // a mouse event - var node = e.target; - if(node){ - for(var parent = node.parentNode; parent; node = parent, parent = node.parentNode){ - if(parent == this.parent && dojo.hasClass(node, "dojoDndItem")){ return node; } - } - } - return null; + show: function(delay){ + // summary: Toggle the node to showing + // delay: Integer? + // Ammount of time to stall playing the show animation + return this.showAnim.play(delay || 0); }, - _normalizedCreator: function(/*dojo.dnd.Item*/ item, /*String*/ hint){ - // summary: - // adds all necessary data to the output of the user-supplied creator function - var t = (this.creator || this.defaultCreator).call(this, item, hint); - if(!dojo.isArray(t.type)){ t.type = ["text"]; } - if(!t.node.id){ t.node.id = dojo.dnd.getUniqueId(); } - dojo.addClass(t.node, "dojoDndItem"); - return t; + + hide: function(delay){ + // summary: Toggle the node to hidden + // delay: Integer? + // Ammount of time to stall playing the hide animation + return this.hideAnim.play(delay || 0); } }); -dojo.dnd._createNode = function(tag){ - // summary: - // returns a function, which creates an element of given tag - // (SPAN by default) and sets its innerHTML to given text - // tag: String - // a tag name or empty for SPAN - if(!tag){ return dojo.dnd._createSpan; } - return function(text){ // Function - return dojo.create(tag, {innerHTML: text}); // Node - }; -}; - -dojo.dnd._createTrTd = function(text){ - // summary: - // creates a TR/TD structure with given text as an innerHTML of TD - // text: String - // a text for TD - var tr = dojo.create("tr"); - dojo.create("td", {innerHTML: text}, tr); - return tr; // Node -}; +}); -dojo.dnd._createSpan = function(text){ - // summary: - // creates a SPAN element with given text as its innerHTML - // text: String - // a text for SPAN - return dojo.create("span", {innerHTML: text}); // Node -}; +}, +'dijit/form/FilteringSelect':function(){ +define("dijit/form/FilteringSelect", [ + "dojo/data/util/filter", // filter.patternToRegExp + "dojo/_base/declare", // declare + "dojo/_base/Deferred", // Deferred.when + "dojo/_base/lang", // lang.mixin + "./MappedTextBox", + "./ComboBoxMixin" +], function(filter, declare, Deferred, lang, MappedTextBox, ComboBoxMixin){ -// dojo.dnd._defaultCreatorNodes: Object -// a dictionary that maps container tag names to child tag names -dojo.dnd._defaultCreatorNodes = {ul: "li", ol: "li", div: "div", p: "div"}; +/*===== + var MappedTextBox = dijit.form.MappedTextBox; + var ComboBoxMixin = dijit.form.ComboBoxMixin; +=====*/ -dojo.dnd._defaultCreator = function(node){ + // module: + // dijit/form/FilteringSelect // summary: - // takes a parent node, and returns an appropriate creator function - // node: Node - // a container node - var tag = node.tagName.toLowerCase(); - var c = tag == "tbody" || tag == "thead" ? dojo.dnd._createTrTd : - dojo.dnd._createNode(dojo.dnd._defaultCreatorNodes[tag]); - return function(item, hint){ // Function - var isObj = item && dojo.isObject(item), data, type, n; - if(isObj && item.tagName && item.nodeType && item.getAttribute){ - // process a DOM node - data = item.getAttribute("dndData") || item.innerHTML; - type = item.getAttribute("dndType"); - type = type ? type.split(/\s*,\s*/) : ["text"]; - n = item; // this node is going to be moved rather than copied - }else{ - // process a DnD item object or a string - data = (isObj && item.data) ? item.data : item; - type = (isObj && item.type) ? item.type : ["text"]; - n = (hint == "avatar" ? dojo.dnd._createSpan : c)(String(data)); - } - if(!n.id){ - n.id = dojo.dnd.getUniqueId(); - } - return {node: n, data: data, type: type}; - }; -}; + // An enhanced version of the HTML SELECT tag, populated dynamically -} - -if(!dojo._hasResource["dijit.tree._dndContainer"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.tree._dndContainer"] = true; -dojo.provide("dijit.tree._dndContainer"); + 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: "", -dojo.getObject("tree", true, dojo); + _isValidSubset: function(){ + return this._opened; + }, -dijit.tree._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"); - } -}; + isValid: function(){ + // Overrides ValidationTextBox.isValid() + return !!this.item || (!this.required && this.get('displayedValue') == ""); // #5974 + }, -dojo.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, - =====*/ + _refreshState: function(){ + if(!this.searchTimer){ // state will be refreshed after results are returned + this.inherited(arguments); + } + }, - constructor: function(tree, params){ + _callbackSetLabel: function( + /*Array*/ result, + /*Object*/ query, + /*Object*/ options, + /*Boolean?*/ priorityChange){ // summary: - // A constructor of the Container - // tree: Node - // Node or node's id to build the container on - // params: dijit.tree.__SourceArgs - // 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 - dojo.mixin(this, params); + // Callback from dojo.store after lookup of user entered value finishes - // class-specific variables - this.map = {}; - this.current = null; // current TreeNode's DOM node - - // states - this.containerState = ""; - dojo.addClass(this.node, "dojoDndContainer"); - - // set up events - this.events = [ - // container level events - dojo.connect(this.node, "onmouseenter", this, "onOverEvent"), - dojo.connect(this.node, "onmouseleave", this, "onOutEvent"), - - // switching between TreeNodes - dojo.connect(this.tree, "_onNodeMouseEnter", this, "onMouseOver"), - dojo.connect(this.tree, "_onNodeMouseLeave", this, "onMouseOut"), - - // cancel text selection and text dragging - dojo.connect(this.node, "ondragstart", dojo, "stopEvent"), - dojo.connect(this.node, "onselectstart", dojo, "stopEvent") - ]; + // 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); + } }, - getItem: function(/*String*/ key){ - // summary: - // Returns the dojo.dnd.Item (representing a dragged node) by it's key (id). - // Called by dojo.dnd.Source.checkAcceptance(). - // tags: - // protected + _openResultList: function(/*Object*/ results, /*Object*/ query, /*Object*/ options){ + // Callback when a data store query completes. + // Overrides ComboBox._openResultList() - var widget = this.selection[key], - ret = { - data: widget, - type: ["treeNode"] - }; + // #3285: tap into search callback to see if user's query resembles a match + if(query[this.searchAttr] !== this._lastQuery){ + return; + } + this.inherited(arguments); - return ret; // dojo.dnd.Item + 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); + } }, - destroy: function(){ + _getValueAttr: function(){ // summary: - // Prepares this object to be garbage-collected + // Hook for get('value') to work. - dojo.forEach(this.events, dojo.disconnect); - // this.clearItems(); - this.node = this.parent = null; + // 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; }, - // mouse events - onMouseOver: function(/*TreeNode*/ widget, /*Event*/ evt){ - // summary: - // Called when mouse is moved over a TreeNode - // tags: - // protected - this.current = widget; + _getValueField: function(){ + // Overrides ComboBox._getValueField() + return "value"; }, - onMouseOut: function(/*TreeNode*/ widget, /*Event*/ evt){ + _setValueAttr: function(/*String*/ value, /*Boolean?*/ priorityChange, /*String?*/ displayedValue, /*item?*/ item){ // summary: - // Called when mouse is moved away from a TreeNode - // tags: - // protected - this.current = null; - }, + // 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; } - _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"; - //dojo.replaceClass(this.node, prefix + newState, prefix + this[state]); - dojo.replaceClass(this.node, prefix + newState, prefix + this[state]); - this[state] = newState; - }, + if(item === undefined){ + if(value === null || value === ''){ + value = ''; + if(!lang.isString(displayedValue)){ + this._setDisplayedValueAttr(displayedValue||'', priorityChange); + return; + } + } - _addItemClass: function(node, type){ - // summary: - // Adds a class with prefix "dojoDndItem" - // node: Node - // A node - // type: String - // A variable suffix for a class name - dojo.addClass(node, "dojoDndItem" + type); + var self = this; + this._lastQuery = value; + Deferred.when(this.store.get(value), function(item){ + self._callbackSetLabel(item? [item] : [], undefined, undefined, priorityChange); + }); + }else{ + this.valueNode.value = value; + this.inherited(arguments); + } }, - _removeItemClass: function(node, type){ + _setItemAttr: function(/*item*/ item, /*Boolean?*/ priorityChange, /*String?*/ displayedValue){ // summary: - // Removes a class with prefix "dojoDndItem" - // node: Node - // A node - // type: String - // A variable suffix for a class name - dojo.removeClass(node, "dojoDndItem" + type); + // 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; }, - onOverEvent: function(){ - // summary: - // This function is called once, when mouse is over our container - // tags: - // protected - this._changeState("Container", "Over"); + _getDisplayQueryString: function(/*String*/ text){ + return text.replace(/([\\\*\?])/g, "\\$1"); }, - onOutEvent: function(){ + _setDisplayedValueAttr: function(/*String*/ label, /*Boolean?*/ priorityChange){ // summary: - // This function is called once, when mouse is out of our container - // tags: - // protected - this._changeState("Container", ""); - } -}); - -} + // 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(!dojo._hasResource["dijit.tree._dndSelector"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.tree._dndSelector"] = true; -dojo.provide("dijit.tree._dndSelector"); + 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; -dojo.declare("dijit.tree._dndSelector", - dijit.tree._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 + // 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); + Deferred.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()); + } + }); + } + }, - /*===== - // selection: Hash<String, DomNode> - // (id, DomNode) map for every TreeNode that's currently selected. - // The DOMNode is the TreeNode.rowNode. - selection: {}, - =====*/ + undo: function(){ + this.set('displayedValue', this._lastDisplayedValue); + } + }); +}); - constructor: function(tree, params){ - // summary: - // Initialization - // tags: - // private +}, +'dojo/data/util/sorter':function(){ +define("dojo/data/util/sorter", ["dojo/_base/lang"], function(lang) { + // module: + // dojo/data/util/sorter + // summary: + // TODOC - this.selection={}; - this.anchor = null; +var sorter = lang.getObject("dojo.data.util.sorter", true); - dijit.setWaiState(this.tree.domNode, "multiselect", !this.singular); +sorter.basicComparator = function( /*anything*/ a, + /*anything*/ b){ + // summary: + // Basic comparision function that compares if an item is greater or less than another item + // description: + // returns 1 if a > b, -1 if a < b, 0 if equal. + // 'null' values (null, undefined) are treated as larger values so that they're pushed to the end of the list. + // And compared to each other, null is equivalent to undefined. - this.events.push( - dojo.connect(this.tree.domNode, "onmousedown", this,"onMouseDown"), - dojo.connect(this.tree.domNode, "onmouseup", this,"onMouseUp"), - dojo.connect(this.tree.domNode, "onmousemove", this,"onMouseMove") - ); - }, + //null is a problematic compare, so if null, we set to undefined. + //Makes the check logic simple, compact, and consistent + //And (null == undefined) === true, so the check later against null + //works for undefined and is less bytes. + var r = -1; + if(a === null){ + a = undefined; + } + if(b === null){ + b = undefined; + } + if(a == b){ + r = 0; + }else if(a > b || a == null){ + r = 1; + } + return r; //int {-1,0,1} +}; - // 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, +sorter.createSortFunction = function( /* attributes array */sortSpec, /*dojo.data.core.Read*/ store){ + // summary: + // Helper function to generate the sorting function based off the list of sort attributes. + // description: + // The sort function creation will look for a property on the store called 'comparatorMap'. If it exists + // it will look in the mapping for comparisons function for the attributes. If one is found, it will + // use it instead of the basic comparator, which is typically used for strings, ints, booleans, and dates. + // Returns the sorting function for this particular list of attributes and sorting directions. + // + // sortSpec: array + // A JS object that array that defines out what attribute names to sort on and whether it should be descenting or asending. + // The objects should be formatted as follows: + // { + // attribute: "attributeName-string" || attribute, + // descending: true|false; // Default is false. + // } + // store: object + // The datastore object to look up item values from. + // + var sortFunctions=[]; - // 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]); + function createSortFunction(attr, dir, comp, s){ + //Passing in comp and s (comparator and store), makes this + //function much faster. + return function(itemA, itemB){ + var a = s.getValue(itemA, attr); + var b = s.getValue(itemB, attr); + return dir * comp(a,b); //int + }; + } + var sortAttribute; + var map = store.comparatorMap; + var bc = sorter.basicComparator; + for(var i = 0; i < sortSpec.length; i++){ + sortAttribute = sortSpec[i]; + var attr = sortAttribute.attribute; + if(attr){ + var dir = (sortAttribute.descending) ? -1 : 1; + var comp = bc; + if(map){ + if(typeof attr !== "string" && ("toString" in attr)){ + attr = attr.toString(); + } + comp = map[attr] || bc; } - return nodes; - }, - - selectNone: function(){ - // summary: - // Unselects all items - // tags: - // private + sortFunctions.push(createSortFunction(attr, + dir, comp, store)); + } + } + return function(rowA, rowB){ + var i=0; + while(i < sortFunctions.length){ + var ret = sortFunctions[i++](rowA, rowB); + if(ret !== 0){ + return ret;//int + } + } + return 0; //int + }; // Function +}; - this.setSelection([]); - return this; // self - }, +return sorter; +}); - destroy: function(){ - // summary: - // Prepares the object to be garbage-collected - this.inherited(arguments); - this.selection = this.anchor = null; - }, - addTreeNode: function(/*dijit._TreeNode*/node, /*Boolean?*/isAnchor){ - // summary - // add node to current selection - // node: Node - // node to add - // isAnchor: Boolean - // Whether the node should become anchor. +}, +'dijit/form/_ButtonMixin':function(){ +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 +// summary: +// A mixin to add a thin standard API wrapper to a normal HTML button - this.setSelection(this.getSelectedTreeNodes().concat( [node] )); - if(isAnchor){ this.anchor = node; } - return node; - }, - removeTreeNode: function(/*dijit._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._TreeNode*/node){ - // summary - // return true if node is currently selected - // node: Node - // the node to check whether it's in the current selection +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 dijit.form.Button({label: "hello world", onClick: foo}); + // | dojo.body().appendChild(button1.domNode); - return node.id && !!this.selection[node.id]; - }, - setSelection: function(/*dijit._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(); - dojo.forEach(this._setDifference(oldSelection, newSelection), dojo.hitch(this, function(node){ - node.setSelected(false); - if(this.anchor == node){ - delete this.anchor; - } - delete this.selection[node.id]; - })); - dojo.forEach(this._setDifference(newSelection, oldSelection), dojo.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. - - dojo.forEach(ys, function(y){ y.__exclude__ = true; }); - var ret = dojo.filter(xs, function(x){ return !x.__exclude__; }); + // label: HTML String + // Content to display in button. + label: "", - // clean up after ourselves. - dojo.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 = []; - dojo.forEach(selected, function(node) { - nodes.push(node); - paths.push(node.getTreePath()); - }); - var items = dojo.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); - }, - // mouse events - onMouseDown: function(e){ - // summary: - // Event processor for onmousedown - // e: Event - // mouse event - // tags: - // protected + // type: [const] String + // Type of button (submit, reset, button, checkbox, radio) + type: "button", - // ignore click on expando node - if(!this.current || this.tree.isExpandoNode( e.target, this.current)){ return; } + _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; + }, - if(e.button == dojo.mouseButtons.RIGHT){ return; } // ignore right-click + postCreate: function(){ + this.inherited(arguments); + dom.setSelectable(this.focusNode, false); + }, - dojo.stopEvent(e); + 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 + }, - var treeNode = this.current, - copy = dojo.isCopyKey(e), id = treeNode.id; + _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; + } +}); - // 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 - // e: Event - // mouse event - // tags: - // protected +}, +'dojo/colors':function(){ +define("dojo/colors", ["./_base/kernel", "./_base/lang", "./_base/Color", "./_base/array"], function(dojo, lang, Color, ArrayUtil) { + // module: + // dojo/colors + // summary: + // TODOC - // _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, dojo.isCopyKey( e ), e.shiftKey); - }, - onMouseMove: function(e){ - // summary - // event processor for onmousemove - // e: Event - // mouse event - this._doDeselect = false; - }, + var ColorExt = lang.getObject("dojo.colors", true); - 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 +//TODO: this module appears to break naming conventions - if(this.singular){ - if(this.anchor == node && multi){ - this.selectNone(); - }else{ - this.setSelection([node]); - this.anchor = node; - } - }else{ - if(range && this.anchor){ - var cr = dijit.tree._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; - } - nodes = []; - //add everything betweeen begin and end inclusively - while(begin != end) { - nodes.push(begin) - begin = this.tree._getNextNode(begin); - } - nodes.push(end) +/*===== + lang.mixin(dojo, { + colors: { + // summary: Color utilities, extending Base dojo.Color + } + }); +=====*/ - 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; - } + // 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; + }; + // Override base Color.fromRgb with the impl in this module + dojo.colorFromRgb = Color.fromRgb = 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], a; + if((t == "rgb" && l == 3) || (t == "rgba" && l == 4)){ + var r = c[0]; + if(r.charAt(r.length - 1) == "%"){ + // 3 rgb percentage values + a = ArrayUtil.map(c, function(x){ + return parseFloat(x) * 2.56; + }); + if(l == 4){ a[3] = c[3]; } + return Color.fromArray(a, obj); // dojo.Color } + return Color.fromArray(c, obj); // dojo.Color } - }, - - forInSelectedItems: function(/*Function*/ f, /*Object?*/ o){ - // summary: - // Iterates over selected items; - // see `dojo.dnd.Container.forInItems()` for details - o = o || dojo.global; - for(var id in this.selection){ - // console.log("selected item id: " + id); - f.call(o, this.getItem(id), id, this); + 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 Color.fromArray(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 + }; -if(!dojo._hasResource["dijit.Tree"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.Tree"] = true; -dojo.provide("dijit.Tree"); + 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 + }; + ColorExt.makeGrey = Color.makeGrey = function(/*Number*/ g, /*Number?*/ a){ + // summary: creates a greyscale color with an optional alpha + return Color.fromArray([g, g, g, a]); // dojo.Color + }; + // mixin all CSS3 named colors not already in _base, along with SVG 1.0 variant spellings + lang.mixin(Color.named, { + "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], + "turquoise": [64,224,208], + "violet": [238,130,238], + "wheat": [245,222,179], + "whitesmoke": [245,245,245], + "yellowgreen": [154,205,50] + }); + return Color; +}); +}, +'dijit/registry':function(){ +define("dijit/registry", [ + "dojo/_base/array", // array.forEach array.map + "dojo/_base/sniff", // has("ie") + "dojo/_base/unload", // unload.addOnWindowUnload + "dojo/_base/window", // win.body + "." // dijit._scopeName +], function(array, has, unload, win, dijit){ + + // module: + // dijit/registry + // summary: + // Registry of existing widget on page, plus some utility methods. + // Must be accessed through AMD api, ex: + // require(["dijit/registry"], function(registry){ registry.byId("foo"); }) + var _widgetTypeCtr = {}, hash = {}; + var registry = { + // summary: + // A set of widgets indexed by id + length: 0, + add: function(/*dijit._Widget*/ widget){ + // summary: + // Add a widget to the registry. If a duplicate ID is detected, a error is thrown. + // + // widget: dijit._Widget + // Any dijit._Widget 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._Widget + }, + byNode: function(/*DOMNode*/ node){ + // summary: + // Returns the widget corresponding to the given DOMNode + return hash[node.getAttribute("widgetId")]; // dijit._Widget + }, + toArray: function(){ + // summary: + // Convert registry into a true Array + // + // example: + // Work with the widget .domNodes in a real Array + // | array.map(dijit.registry.toArray(), function(w){ return w.domNode; }); -dojo.declare( - "dijit._TreeNode", - [dijit._Widget, dijit._Templated, dijit._Container, dijit._Contained, dijit._CssStateMixin], -{ - // summary: - // Single node within a tree. This class is used internally - // by Tree and should not be accessed directly. - // tags: - // private + var ar = []; + for(var id in hash){ + ar.push(hash[id]); + } + return ar; // dijit._Widget[] + }, - // item: [const] dojo.data.Item - // the dojo.data entry this tree represents - item: null, + getUniqueId: function(/*String*/widgetType){ + // summary: + // Generates a unique id for a given widgetType - // isTreeNode: [protected] Boolean - // Indicates that this is a TreeNode. Used by `dijit.Tree` only, - // should not be accessed directly. - isTreeNode: true, + 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 + }, - // label: String - // Text of this tree node - label: "", + findWidgets: function(/*DomNode*/ root){ + // summary: + // Search subtree under root returning widgets found. + // Doesn't search for nested widgets (ie, widgets inside other widgets). + + 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{ + getChildrenHelper(node); + } + } + } + } - // isExpandable: [private] Boolean - // This node has children, so show the expando node (+ sign) - isExpandable: null, + getChildrenHelper(root); + return outAry; + }, - // isExpanded: [readonly] Boolean - // This node is currently expanded (ie, opened) - isExpanded: false, + _destroyAll: function(){ + // summary: + // Code to destroy all widgets and do other cleanup on page unload - // 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", + // 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(); + } + } + }); + }, - templateString: dojo.cache("dijit", "templates/TreeNode.html", "<div class=\"dijitTreeNode\" role=\"presentation\"\n\t><div dojoAttachPoint=\"rowNode\" class=\"dijitTreeRow\" role=\"presentation\" dojoAttachEvent=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\n\t\t><img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"expandoNode\" class=\"dijitTreeExpando\" role=\"presentation\"\n\t\t/><span dojoAttachPoint=\"expandoNodeText\" class=\"dijitExpandoText\" role=\"presentation\"\n\t\t></span\n\t\t><span dojoAttachPoint=\"contentNode\"\n\t\t\tclass=\"dijitTreeContent\" role=\"presentation\">\n\t\t\t<img src=\"${_blankGif}\" alt=\"\" dojoAttachPoint=\"iconNode\" class=\"dijitIcon dijitTreeIcon\" role=\"presentation\"\n\t\t\t/><span dojoAttachPoint=\"labelNode\" class=\"dijitTreeLabel\" role=\"treeitem\" tabindex=\"-1\" aria-selected=\"false\" dojoAttachEvent=\"onfocus:_onLabelFocus\"></span>\n\t\t</span\n\t></div>\n\t<div dojoAttachPoint=\"containerNode\" class=\"dijitTreeContainer\" role=\"presentation\" style=\"display: none;\"></div>\n</div>\n"), + 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.getAttribute && node.getAttribute("widgetId"); + if(id){ + return hash[id]; + } + node = node.parentNode; + } + return null; + }, - baseClass: "dijitTreeNode", + // In case someone needs to access hash. + // Actually, this is accessed from WidgetSet back-compatibility code + _hash: hash + }; - // For hover effect for tree node, and focus effect for label - cssStateNodes: { - rowNode: "dijitTreeRow", - labelNode: "dijitTreeLabel" - }, + if(has("ie")){ + // Only run _destroyAll() for IE because we think it's only necessary in that case, + // and because it causes problems on FF. See bug #3531 for details. + unload.addOnWindowUnload(function(){ + registry._destroyAll(); + }); + } - attributeMap: dojo.delegate(dijit._Widget.prototype.attributeMap, { - label: {node: "labelNode", type: "innerText"}, - tooltip: {node: "rowNode", type: "attribute", attribute: "title"} - }), + /*===== + dijit.registry = { + // summary: + // A list of widgets on a page. + }; + =====*/ + dijit.registry = registry; - buildRendering: function(){ - this.inherited(arguments); + return registry; +}); - // set expand icon for leaf - this._setExpando(); +}, +'dijit/tree/_dndContainer':function(){ +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.getObject lang.mixin lang.hitch + "dojo/mouse", // mouse.enter, mouse.leave + "dojo/on" +], function(aspect, declare, domClass, event, lang, mouse, on){ + + // module: + // dijit/tree/_dndContainer + // 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`. - // set icon and label class based on item - this._updateItemClasses(this.item); + return declare("dijit.tree._dndContainer", null, { - if(this.isExpandable){ - dijit.setWaiState(this.labelNode, "expanded", this.isExpanded); - } + // 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 - //aria-selected should be false on all selectable elements. - this.setSelected(false); - }, + /*===== + // 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, + =====*/ - _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. + constructor: function(tree, params){ + // summary: + // A constructor of the Container + // tree: Node + // Node or node's id to build the container on + // params: dijit.tree.__SourceArgs + // 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); - // Math.max() is to prevent negative padding on hidden root node (when indent == -1) - var pixels = (Math.max(indent, 0) * this.tree._nodePixelIndent) + "px"; + // class-specific variables + this.current = null; // current TreeNode's DOM node - dojo.style(this.domNode, "backgroundPosition", pixels + " 0px"); - dojo.style(this.rowNode, this.isLeftToRight() ? "paddingLeft" : "paddingRight", pixels); + // states + this.containerState = ""; + domClass.add(this.node, "dojoDndContainer"); - dojo.forEach(this.getChildren(), function(child){ - child.set("indent", indent+1); - }); - - this._set("indent", indent); - }, + // set up events + this.events = [ + // container level events + on(this.node, mouse.enter, lang.hitch(this, "onOverEvent")), + on(this.node, mouse.leave, lang.hitch(this, "onOutEvent")), - markProcessing: function(){ - // summary: - // Visually denote that tree is loading data, etc. - // tags: - // private - this.state = "LOADING"; - this._setExpando(true); - }, + // switching between TreeNodes + aspect.after(this.tree, "_onNodeMouseEnter", lang.hitch(this, "onMouseOver"), true), + aspect.after(this.tree, "_onNodeMouseLeave", lang.hitch(this, "onMouseOut"), true), - unmarkProcessing: function(){ - // summary: - // Clear markup from markProcessing() call - // tags: - // private - this._setExpando(false); - }, + // cancel text selection and text dragging + on(this.node, "dragstart", lang.hitch(event, "stop")), + on(this.node, "selectstart", lang.hitch(event, "stop")) + ]; + }, - _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"); - }, + destroy: function(){ + // summary: + // Prepares this object to be garbage-collected - _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 h; + while(h = this.events.pop()){ h.remove(); } - var clsName = "_" + lower + "Class"; - var nodeName = lower + "Node"; - var oldCls = this[clsName]; + // this.clearItems(); + this.node = this.parent = null; + }, - this[clsName] = this.tree["get" + upper + "Class"](item, this.isExpanded); - dojo.replaceClass(this[nodeName], this[clsName] || "", oldCls || ""); - - dojo.style(this[nodeName], this.tree["get" + upper + "Style"](item, this.isExpanded) || {}); - }, + // mouse events + onMouseOver: function(widget /*===== , evt =====*/){ + // summary: + // Called when mouse is moved over a TreeNode + // widget: TreeNode + // evt: Event + // tags: + // protected + this.current = widget; + }, - _updateLayout: function(){ - // summary: - // Set appropriate CSS classes for this.domNode - // tags: - // private - var parent = this.getParent(); - if(!parent || parent.rowNode.style.display == "none"){ - /* if we are hiding the root node then make every first level child look like a root node */ - dojo.addClass(this.domNode, "dijitTreeIsRoot"); - }else{ - dojo.toggleClass(this.domNode, "dijitTreeIsLast", !this.getNextSibling()); - } - }, + onMouseOut: function(/*===== widget, evt =====*/){ + // summary: + // Called when mouse is moved away from a TreeNode + // widget: TreeNode + // evt: Event + // tags: + // protected + this.current = null; + }, - _setExpando: function(/*Boolean*/ processing){ - // summary: - // Set the right image for the expando node - // tags: - // private + _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; + }, - var styles = ["dijitTreeExpandoLoading", "dijitTreeExpandoOpened", - "dijitTreeExpandoClosed", "dijitTreeExpandoLeaf"], - _a11yStates = ["*","-","+","*"], - idx = processing ? 0 : (this.isExpandable ? (this.isExpanded ? 1 : 2) : 3); + _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); + }, - // apply the appropriate class to the expando node - dojo.replaceClass(this.expandoNode, styles[idx], styles); + _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); + }, - // provide a non-image based indicator for images-off mode - this.expandoNodeText.innerHTML = _a11yStates[idx]; + 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", ""); + } + }); +}); - expand: function(){ - // summary: - // Show my children - // returns: - // Deferred that fires when expansion is complete +}, +'url:dijit/templates/InlineEditBox.html':"<span data-dojo-attach-point=\"editNode\" role=\"presentation\" style=\"position: absolute; visibility:hidden\" class=\"dijitReset dijitInline\"\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", +'dijit/_base/wai':function(){ +define("dijit/_base/wai", [ + "dojo/dom-attr", // domAttr.attr + "dojo/_base/lang", // lang.mixin + "..", // 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 + // summary: + // Deprecated methods for setting/getting wai roles and states. + // New code should call setAttribute()/getAttribute() directly. + // + // Also loads hccss to apply dijit_a11y class to root node if machine is in high-contrast mode. - // If there's already an expand in progress or we are already expanded, just return - if(this._expandDeferred){ - return this._expandDeferred; // dojo.Deferred - } + lang.mixin(dijit, { + 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); + }, - // cancel in progress collapse operation - this._wipeOut && this._wipeOut.stop(); + 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:","")); + }, - // All the state information for when a node is expanded, maybe this should be - // set when the animation completes instead - this.isExpanded = true; - dijit.setWaiState(this.labelNode, "expanded", "true"); - if(this.tree.showRoot || this !== this.tree.rootNode){ - dijit.setWaiRole(this.containerNode, "group"); - } - dojo.addClass(this.contentNode,'dijitTreeContentExpanded'); - this._setExpando(); - this._updateItemClasses(this.item); - if(this == this.tree.rootNode){ - dijit.setWaiState(this.tree.domNode, "expanded", "true"); - } + setWaiRole: function(/*Element*/ elem, /*String*/ role){ + // summary: + // Sets the role on an element. + // description: + // Replace existing role attribute with new role. - var def, - wipeIn = dojo.fx.wipeIn({ - node: this.containerNode, duration: dijit.defaultDuration, - onEnd: function(){ - def.callback(true); - } - }); + domAttr.set(elem, "role", role); + }, - // Deferred that fires when expand is complete - def = (this._expandDeferred = new dojo.Deferred(function(){ - // Canceller - wipeIn.stop(); - })); + 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"); + } + }, - wipeIn.play(); + 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 def; // dojo.Deferred - }, + return elem.hasAttribute ? elem.hasAttribute("aria-"+state) : !!elem.getAttribute("aria-"+state); + }, - collapse: function(){ - // summary: - // Collapse this node (if it's expanded) + 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. - if(!this.isExpanded){ return; } + return elem.getAttribute("aria-"+state) || ""; + }, - // cancel in progress expand operation - if(this._expandDeferred){ - this._expandDeferred.cancel(); - delete this._expandDeferred; - } + setWaiState: function(/*Element*/ elem, /*String*/ state, /*String*/ value){ + // summary: + // Sets a state on an element. + // description: + // Sets an attribute called "aria-"+state. - this.isExpanded = false; - dijit.setWaiState(this.labelNode, "expanded", "false"); - if(this == this.tree.rootNode){ - dijit.setWaiState(this.tree.domNode, "expanded", "false"); - } - dojo.removeClass(this.contentNode,'dijitTreeContentExpanded'); - this._setExpando(); - this._updateItemClasses(this.item); + elem.setAttribute("aria-"+state, value); + }, - if(!this._wipeOut){ - this._wipeOut = dojo.fx.wipeOut({ - node: this.containerNode, duration: dijit.defaultDuration - }); + removeWaiState: function(/*Element*/ elem, /*String*/ state){ + // summary: + // Removes a state from an element. + // description: + // Sets an attribute called "aria-"+state. + + elem.removeAttribute("aria-"+state); } - this._wipeOut.play(); - }, + }); - // indent: Integer - // Levels from this node to the root node - indent: 0, + return dijit; +}); - 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). +}, +'dijit/form/_FormSelectWidget':function(){ +define("dijit/form/_FormSelectWidget", [ + "dojo/_base/array", // array.filter array.forEach array.map array.some + "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 + "./_FormValueWidget" +], function(array, aspect, sorter, declare, dom, domClass, kernel, lang, query, _FormValueWidget){ - var tree = this.tree, - model = tree.model, - defs = []; // list of deferreds that need to fire before I am complete +/*===== + var _FormValueWidget = dijit.form._FormValueWidget; +=====*/ +// module: +// dijit/form/_FormSelectWidget +// summary: +// Extends _FormValueWidget in order to provide "select-specific" +// values - i.e., those values that are unique to <select> elements. - // 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. - dojo.forEach(this.getChildren(), function(child){ - dijit._Container.prototype.removeChild.call(this, child); - }, this); - this.state = "LOADED"; +/*===== +dijit.form.__SelectOption = function(){ + // 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 + this.value = value; + this.label = label; + this.selected = selected; + this.disabled = disabled; +} +=====*/ - if(items && items.length > 0){ - this.isExpandable = true; +return 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. - // 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 - dojo.forEach(items, function(item){ - 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), - dir: tree.dir, - lang: tree.lang, - indent: this.indent + 1 - }); - if(existingNodes){ - existingNodes.push(node); - }else{ - tree._itemNodesMap[id] = [node]; - } - } - this.addChild(node); + // multiple: [const] Boolean + // Whether or not we are multi-valued + multiple: false, - // 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(item)){ - defs.push(tree._expandNode(node)); - } - }, this); + // options: dijit.form.__SelectOption[] + // The set of options for our select item. Roughly corresponds to + // the html <option> tag. + options: null, - // note that updateLayout() needs to be called on each child after - // _all_ the children exist - dojo.forEach(this.getChildren(), function(child, idx){ - child._updateLayout(); - }); - }else{ - this.isExpandable=false; - } + // store: dojo.data.api.Identity + // A store which, at the very least implements dojo.data.api.Identity + // to use for getting our list of options - rather than reading them + // from the <option> html tags. + store: null, - if(this._setExpando){ - // change expando to/from dot or + icon, as appropriate - this._setExpando(false); - } + // query: object + // A query to use when fetching items from our store + query: null, - // Set leaf icon or folder icon, as appropriate - this._updateItemClasses(this.item); + // queryOptions: object + // Query options to use when fetching from the store + queryOptions: null, - // 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"); - } - } + // 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, - return new dojo.DeferredList(defs); // dojo.Deferred - }, + // sortByLabel: Boolean + // Flag to sort the options returned from a store by the label of + // the store. + sortByLabel: true, - 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; - }, + // 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, - getIdentity: function() { - return this.tree.model.getIdentity(this.item); - }, + 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.__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.__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.__SelectOption is passed in which is not a part of the select - removeChild: function(/* treeNode */ node){ - this.inherited(arguments); + // NOTE: the compare for passing in a dijit.form.__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; - var children = this.getChildren(); - if(children.length == 0){ - this.isExpandable = false; - this.collapse(); + if(lookupValue === undefined){ + return opts; // dijit.form.__SelectOption[] } - - dojo.forEach(children, function(child){ - child._updateLayout(); - }); + if(lang.isArray(lookupValue)){ + return array.map(lookupValue, "return this.getOptions(item);", this); // dijit.form.__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]; // dijit.form.__SelectOption + } + return null; // null }, - makeExpandable: function(){ + addOption: function(/*dijit.form.__SelectOption|dijit.form.__SelectOption[]*/ option){ // 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); + // 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(); }, - _onLabelFocus: function(evt){ + removeOption: function(/*String|dijit.form.__SelectOption|Number|Array*/ valueOrIdx){ // summary: - // Called when this row is focused (possibly programatically) - // Note that we aren't using _onFocus() builtin to dijit - // because it's called when focus is moved to a descendant TreeNode. - // tags: - // private - this.tree._onNodeFocus(this); + // 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(); }, - setSelected: function(/*Boolean*/ selected){ + updateOption: function(/*dijit.form.__SelectOption|dijit.form.__SelectOption[]*/ newOption){ // 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). - dijit.setWaiState(this.labelNode, "selected", selected); - dojo.toggleClass(this.rowNode, "dijitTreeRowSelected", selected); + // 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(); }, - setFocusable: function(/*Boolean*/ selected){ + setStore: function(/*dojo.data.api.Identity*/ store, + /*anything?*/ selectedValue, + /*Object?*/ fetchArgs){ // 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). + // 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.data.api.Identity + // The store you would like to use - 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? + // The arguments that will be passed to the store's fetch() function + var oStore = this.store; + fetchArgs = fetchArgs || {}; + if(oStore !== store){ + // Our store has changed, so update our notifications + var h; + while(h = this._notifyConnections.pop()){ h.remove(); } - this.labelNode.setAttribute("tabIndex", selected ? "0" : "-1"); - }, + if(store && 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); + } - _onClick: function(evt){ - // summary: - // Handler for onclick event on a node - // tags: - // private - this.tree._onClick(this, evt); - }, - _onDblClick: function(evt){ - // summary: - // Handler for ondblclick event on a node - // tags: - // private - this.tree._onDblClick(this, evt); - }, + // Turn off change notifications while we make all these changes + this._onChangeActive = false; - _onMouseEnter: function(evt){ - // summary: - // Handler for onmouseenter event on a node - // tags: - // private - this.tree._onNodeMouseEnter(this, evt); - }, - - _onMouseLeave: function(evt){ - // summary: - // Handler for onmouseenter event on a node - // tags: - // private - this.tree._onNodeMouseLeave(this, evt); - } -}); + // Remove existing options (if there are any) + if(this.options && this.options.length){ + this.removeOption(this.options); + } -dojo.declare( - "dijit.Tree", - [dijit._Widget, dijit._Templated], -{ - // summary: - // This widget displays hierarchical data from a store. + // Add our new options + if(store){ + this._loadingStore = true; + store.fetch(lang.delegate(fetchArgs, { + onComplete: function(items, opts){ + if(this.sortByLabel && !fetchArgs.sort && items.length){ + items.sort(sorter.createSortFunction([{ + attribute: store.getLabelAttributes(items[0])[0] + }], store)); + } - // store: [deprecated] String||dojo.data.Store - // Deprecated. Use "model" parameter instead. - // The store to get data to display in the tree. - store: null, + if(fetchArgs.onFetch){ + items = fetchArgs.onFetch.call(this, items, opts); + } + // TODO: Add these guys as a batch, instead of separately + array.forEach(items, function(i){ + this._addOptionForItem(i); + }, this); - // 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, + // 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; - // 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, + if(!this.loadChildrenOnOpen){ + this._loadChildren(); + }else{ + this._pseudoLoadChildren(items); + } + this._fetchedWith = opts; + this._lastValueReported = this.multiple ? [] : null; + this._onChangeActive = true; + this.onSetStore(); + this._handleOnChange(this.value); + }, + scope: this + })); + }else{ + delete this._fetchedWith; + } + return oStore; // dojo.data.api.Identity + }, - // 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: "", + // 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) - // showRoot: [const] Boolean - // Should the root node be displayed, or hidden? - showRoot: true, + _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._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); - // 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"], + // 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; }); - // 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 ofwaiting 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: [], + this._set("value", this.multiple ? val : val[0]); + this._setDisplay(this.multiple ? disp : disp[0]); + this._updateSelection(); + this._handleOnChange(this.value, priorityChange); + }, - // 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, + _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]; + }, - // selectedItem: [readonly] Item - // Backward compatible singular variant of selectedItems. - selectedItem: null, + _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); - // openOnClick: Boolean - // If true, clicking a folder node's label will open it, rather than calling onClick() - openOnClick: false, + // Update states + this._updateSelection(); + }, - // openOnDblClick: Boolean - // If true, double-clicking a folder node's label will open it, rather than calling onDblClick() - openOnDblClick: false, + _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 + "SelectedOption", isSelected); + child.domNode.setAttribute("aria-selected", isSelected); + }, this); + } + }, - templateString: dojo.cache("dijit", "templates/Tree.html", "<div class=\"dijitTree dijitTreeContainer\" role=\"tree\"\n\tdojoAttachEvent=\"onkeypress:_onKeyPress\">\n\t<div class=\"dijitInline dijitTreeIndent\" style=\"position: absolute; top: -9999px\" dojoAttachPoint=\"indentDetector\"></div>\n</div>\n"), + _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 ""; + }, - // persist: Boolean - // Enables/disables use of cookies for state saving. - persist: true, + // 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)); + }, - // autoExpand: Boolean - // Fully expand the tree on load. Overrides `persist`. - autoExpand: false, + _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. If the item contains + // children, the children value of the item will be set + var store = this.store, label = store.getLabel(item), + value = (label ? store.getIdentity(item) : null); + return {value: value, label: label, item:item}; // dijit.form.__SelectOption + }, - // dndController: [protected] String - // Class name to use as as the dnd controller. Specifying this class enables DnD. - // Generally you should specify this as "dijit.tree.dndSource". - // Default of "dijit.tree._dndSelector" handles selection only (no actual DnD). - dndController: "dijit.tree._dndSelector", + _addOptionForItem: function(/*item*/ item){ + // summary: + // Creates (and adds) the option for the given item + var store = this.store; + if(!store.isItemLoaded(item)){ + // We are not loaded - so let's load it and add later + store.loadItem({item: item, onItem: function(i){ + this._addOptionForItem(i); + }, + scope: this}); + return; + } + var newOpt = this._getOptionObjForItem(item); + this.addOption(newOpt); + }, - // parameters to pull off of the tree and pass on to the dndController as its params - dndParams: ["onDndDrop","itemCreator","onDndCancel","checkAcceptance", "checkItemAcceptance", "dragThreshold", "betweenThreshold"], + constructor: function(/*Object*/ keywordArgs){ + // summary: + // 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 = (keywordArgs || {}).value || null; + this._notifyConnections = []; + }, - //declare the above items so they can be pulled from the tree's markup + buildRendering: function(){ + this.inherited(arguments); + dom.setSelectable(this.focusNode, false); + }, - // onDndDrop: [protected] Function - // Parameter to dndController, see `dijit.tree.dndSource.onDndDrop`. - // Generally this doesn't need to be set. - onDndDrop: null, - - /*===== - itemCreator: function(nodes, target, source){ + _fillContent: function(){ // 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[] - // 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 [{}]; + // Loads our options and sets up our dropdown correctly. We + // don't want any content, so we don't call any inherit chain + // function. + var opts = this.options; + if(!opts){ + opts = 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(",")); + } }, - =====*/ - itemCreator: null, - - // 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){ + postCreate: function(){ // 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 + // 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"); + this.connect(this, "startup", "_loadChildren"); + + this._setValueAttr(this.value, null); }, -=====*/ - checkAcceptance: null, -/*===== - checkItemAcceptance: function(target, source, position){ + startup: function(){ // 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; // Boolean + // Connects in our store, if we have one defined + this.inherited(arguments); + var store = this.store, fetchArgs = {}; + array.forEach(["query", "queryOptions", "onFetch"], function(i){ + if(this[i]){ + fetchArgs[i] = this[i]; + } + delete this[i]; + }, this); + if(store && 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, fetchArgs); + } }, -=====*/ - 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, + destroy: function(){ + // summary: + // Clean up our connections + var h; + while(h = this._notifyConnections.pop()){ h.remove(); } + this.inherited(arguments); + }, - // _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, + _addOptionItem: function(/*dijit.form.__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. + }, - _publish: function(/*String*/ topicName, /*Object*/ message){ + _removeOptionItem: function(/*dijit.form.__SelectOption*/ /*===== option =====*/){ // summary: - // Publish a message for this widget/topic - dojo.publish(this.id, [dojo.mixin({tree: this, event: topicName}, message || {})]); + // User-overridable function which, for the given option, removes + // its item from the select. }, - postMixInProperties: function(){ - this.tree = this; + _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) + }, - 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; - } + _getChildren: function(){ + // summary: + // Overridable function to return the children that this widget contains. + return []; + }, - this._itemNodesMap={}; + _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")); + }, - if(!this.cookieName){ - this.cookieName = this.id + "SaveStateCookie"; - } + _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 + }, - this._loadDeferred = new dojo.Deferred(); + 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 + } +}); - this.inherited(arguments); - }, +}); - postCreate: function(){ - this._initState(); +}, +'dijit/form/Select':function(){ +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=\"combobox\" aria-haspopup=\"true\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" role=\"presentation\"\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\" data-dojo-attach-point=\"containerNode,_popupStateNode\"></span\n\t\t\t><input type=\"hidden\" ${!nameAttrSetting} data-dojo-attach-point=\"valueNode\" value=\"${value}\" aria-hidden=\"true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdata-dojo-attach-point=\"titleNode\" role=\"presentation\"\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></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-construct", // domConstruct.create + "dojo/dom-geometry", // domGeometry.setMarginBox + "dojo/_base/event", // event.stop + "dojo/i18n", // i18n.getLocalization + "dojo/_base/lang", // lang.hitch + "./_FormSelectWidget", + "../_HasDropDown", + "../Menu", + "../MenuItem", + "../MenuSeparator", + "../Tooltip", + "dojo/text!./templates/Select.html", + "dojo/i18n!./nls/validate" +], function(array, declare, domAttr, domClass, domConstruct, domGeometry, event, i18n, lang, + _FormSelectWidget, _HasDropDown, Menu, MenuItem, MenuSeparator, Tooltip, template){ - // Create glue between store and Tree, if not specified directly by user - if(!this.model){ - this._store2model(); - } +/*===== + var _FormSelectWidget = dijit.form._FormSelectWidget; + var _HasDropDown = dijit._HasDropDown; + var _FormSelectWidget = dijit._FormSelectWidget; + var Menu = dijit.Menu; + var MenuItem = dijit.MenuItem; + var MenuSeparator = dijit.MenuSeparator; + var Tooltip = dijit.Tooltip; +=====*/ - // monitor changes to items - this.connect(this.model, "onChange", "_onItemChange"); - this.connect(this.model, "onChildrenChange", "_onItemChildrenChange"); - this.connect(this.model, "onDelete", "_onItemDelete"); +// module: +// dijit/form/Select +// summary: +// This is a "styleable" select box - it is basically a DropDownButton which +// can take a <select> as its input. - this._load(); +var _SelectMenu = declare("dijit.form._SelectMenu", Menu, { + // summary: + // An internally-used menu for dropdown that allows us a vertical scrollbar + 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); - - if(this.dndController){ - if(dojo.isString(this.dndController)){ - this.dndController = dojo.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); + var o = (this.menuTableNode = this.domNode); + var n = (this.domNode = domConstruct.create("div", {style: {overflowX: "hidden", overflowY: "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); }, - _store2model: function(){ + postCreate: function(){ // summary: - // User specified a store&query rather than model, so create model from store/query - this._v10Compat = true; - dojo.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 = dojo.hitch(this, "mayHaveChildren"); - } + // stop mousemove from selecting text on IE to be consistent with other browsers - if(this.params.getItemChildren){ - modelParams.getChildren = dojo.hitch(this, function(item, onComplete, onError){ - this.getItemChildren((this._v10Compat && item === this.model.root) ? null : item, onComplete, onError); - }); - } - this.model = new dijit.tree.ForestStoreModel(modelParams); + this.inherited(arguments); - // 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); + this.connect(this.domNode, "onmousemove", event.stop); }, - onLoad: function(){ + resize: function(/*Object*/ mb){ // 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 - }, + // 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%"; + } + } + } +}); - _load: function(){ - // summary: - // Initial load of the tree. - // Load root node (possibly hidden) and it's children. - this.model.getRoot( - dojo.hitch(this, function(item){ - var rn = (this.rootNode = this.tree._createTreeNode({ - item: item, - tree: this, - isExpandable: true, - label: this.label || this.getLabel(item), - 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 - dijit.setWaiRole(this.domNode, 'presentation'); - - dijit.setWaiRole(rn.labelNode, 'presentation'); - dijit.setWaiRole(rn.containerNode, 'tree'); - } - 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]; - } +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. - rn._updateLayout(); // sets "dijitTreeIsRoot" CSS classname + baseClass: "dijitSelect", - // load top level children and then fire onLoad() event - this._expandNode(rn).addCallback(dojo.hitch(this, function(){ - this._loadDeferred.callback(true); - this.onLoad(); - })); - }), - function(err){ - console.error(this, ": error loading root: ", err); - } - ); - }, + templateString: template, - getNodesByItem: function(/*dojo.data.Item or id*/ item){ - // summary: - // Returns all tree nodes that refer to an item - // returns: - // Array of tree nodes that refer to passed item + // required: Boolean + // Can be true or false, default is false. + required: false, - if(!item){ return []; } - var identity = dojo.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]); - }, + // state: [readonly] String + // "Incomplete" if this select is required but unset (i.e. blank value), "" otherwise + state: "", - _setSelectedItemAttr: function(/*dojo.data.Item or id*/ item){ - this.set('selectedItems', [item]); + // 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"}); + domClass.add(this.dropDown.domNode, this.baseClass + "Menu"); }, - _setSelectedItemsAttr: function(/*dojo.data.Items or ids*/ items){ + _getMenuItemForOption: function(/*dijit.form.__SelectOption*/ option){ // 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; - this._loadDeferred.addCallback( dojo.hitch(this, function(){ - var identities = dojo.map(items, function(item){ - return (!item || dojo.isString(item)) ? item : tree.model.getIdentity(item); - }); - var nodes = []; - dojo.forEach(identities, function(id){ - nodes = nodes.concat(tree._itemNodesMap[id] || []); + // 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(); + }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, + disabled: option.disabled || false }); - this.set('selectedNodes', nodes); - })); + item.focusNode.setAttribute("role", "listitem"); + return item; + } }, - _setPathAttr: function(/*Item[] || String[]*/ path){ + _addOptionItem: function(/*dijit.form.__SelectOption*/ option){ // 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", []); + // 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)); } }, - - _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; - // We may need to wait for some nodes to expand, so setting - // each path will involve a Deferred. We bring those deferreds - // together witha DeferredList. - return new dojo.DeferredList(dojo.map(paths, function(path){ - var d = new dojo.Deferred(); - - // normalize path to use identity - path = dojo.map(path, function(item){ - return dojo.isString(item) ? item : tree.model.getIdentity(item); - }); + _getChildren: function(){ + if(!this.dropDown){ + return []; + } + return this.dropDown.getChildren(); + }, - if(path.length){ - // Wait for the tree to load, if it hasn't already. - tree._loadDeferred.addCallback(function(){ selectPath(path, [tree.rootNode], d); }); - }else{ - d.errback("Empty path"); - } - return d; - })).addCallback(setNodes); + _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. - function selectPath(path, nodes, def){ - // Traverse path; the next path component should be among "nodes". - var nextPath = path.shift(); - var nextNode = dojo.filter(nodes, function(node){ - return node.getIdentity() == nextPath; - })[0]; - if(!!nextNode){ - if(path.length){ - tree._expandNode(nextNode).addCallback(function(){ selectPath(path, nextNode.getChildren(), def); }); - }else{ - //Successfully reached the end of this path - def.callback(nextNode); - } - } else { - def.errback("Could not expand path at " + nextPath); + 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({label: " "}); + this.dropDown.addChild(item); + } + }else{ + this._updateSelection(); } - - function setNodes(newNodes){ - //After all expansion is finished, set the selection to - //the set of nodes successfully found. - tree.set("selectedNodes", dojo.map( - dojo.filter(newNodes,function(x){return x[0];}), - function(x){return x[1];})); + + 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); } }, - _setSelectedNodeAttr: function(node){ - this.set('selectedNodes', [node]); - }, - _setSelectedNodesAttr: function(nodes){ - this._loadDeferred.addCallback( dojo.hitch(this, function(){ - this.dndController.setSelection(nodes); - })); + _setValueAttr: function(value){ + this.inherited(arguments); + domAttr.set(this.valueNode, "value", this.get("value")); + this.validate(this.focused); // to update this.state }, + _setDisabledAttr: function(/*Boolean*/ value){ + this.inherited(arguments); + this.validate(this.focused); // to update this.state + }, - ////////////// Data store related functions ////////////////////// - // These just get passed to the model; they are here for back-compat + _setRequiredAttr: function(/*Boolean*/ value){ + this._set("required", value); + this.focusNode.setAttribute("aria-required", value); + this.validate(this.focused); // to update this.state + }, - mayHaveChildren: function(/*dojo.data.Item*/ item){ + _setDisplay: function(/*String*/ newDisplay){ // 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 + // sets the display for the given value (or values) + var lbl = newDisplay || this.emptyLabel; + this.containerNode.innerHTML = '<span class="dijitReset dijitInline ' + this.baseClass + 'Label">' + lbl + '</span>'; + this.focusNode.setAttribute("aria-valuetext", lbl); }, - getItemChildren: function(/*dojo.data.Item*/ parentItem, /*function(items)*/ onComplete){ + validate: function(/*Boolean*/ isFocused){ // 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 + // 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 ? "" : "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; }, - /////////////////////////////////////////////////////// - // Functions for converting an item to a TreeNode - getLabel: function(/*dojo.data.Item*/ item){ + isValid: function(/*Boolean*/ /*===== isFocused =====*/){ // summary: - // Overridable function to get the label for a tree node (given the item) - // tags: - // extension - return this.model.getLabel(item); // String + // 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 }, - getIconClass: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){ + reset: function(){ // summary: - // Overridable function to return CSS class name to display icon - // tags: - // extension - return (!item || this.model.mayHaveChildren(item)) ? (opened ? "dijitFolderOpened" : "dijitFolderClosed") : "dijitLeaf" + // Overridden so that the state will be cleared. + this.inherited(arguments); + Tooltip.hide(this.domNode); + this.validate(this.focused); // to update this.state }, - getLabelClass: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){ + postMixInProperties: function(){ // summary: - // Overridable function to return CSS class name to display label - // tags: - // extension + // set the missing message + this.inherited(arguments); + this._missingMsg = i18n.getLocalization("dijit.form", "validate", + this.lang).missingMessage; }, - getRowClass: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){ + postCreate: function(){ // summary: - // Overridable function to return CSS class name to display row - // tags: - // extension - }, + // stop mousemove from selecting text on IE to be consistent with other browsers - getIconStyle: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){ - // summary: - // Overridable function to return CSS styles to display icon - // returns: - // Object suitable for input to dojo.style() like {backgroundImage: "url(...)"} - // tags: - // extension + this.inherited(arguments); + + this.connect(this.domNode, "onmousemove", event.stop); }, - getLabelStyle: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){ - // summary: - // Overridable function to return CSS styles to display label - // returns: - // Object suitable for input to dojo.style() like {color: "red", background: "green"} - // tags: - // extension + _setStyleAttr: function(/*String||Object*/ value){ + this.inherited(arguments); + domClass.toggle(this.domNode, this.baseClass + "FixedWidth", !!this.domNode.style.width); }, - getRowStyle: function(/*dojo.data.Item*/ item, /*Boolean*/ opened){ - // summary: - // Overridable function to return CSS styles to display row - // returns: - // Object suitable for input to dojo.style() like {background-color: "#bbb"} - // tags: - // extension + isLoaded: function(){ + return this._isLoaded; }, - getTooltip: function(/*dojo.data.Item*/ item){ + loadDropDown: function(/*Function*/ loadCallback){ // summary: - // Overridable function to get the tooltip for a tree node (given the item) - // tags: - // extension - return ""; // String + // populates the menu + this._loadChildren(true); + this._isLoaded = true; + loadCallback(); }, - /////////// Keyboard and Mouse handlers //////////////////// - - _onKeyPress: function(/*Event*/ e){ - // summary: - // Translates keypress events into commands for the controller - if(e.altKey){ return; } - var dk = dojo.keys; - var treeNode = dijit.getEnclosingWidget(e.target); - if(!treeNode){ return; } + closeDropDown: function(){ + // overriding _HasDropDown.closeDropDown() + this.inherited(arguments); - var key = e.charOrCode; - if(typeof key == "string" && key != " "){ // handle printables (letter navigation) - // Check for key navigation. - if(!e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey){ - this._onLetterKeyNav( { node: treeNode, key: key.toLowerCase() } ); - dojo.stopEvent(e); - } - }else{ // handle non-printables (arrow keys) - // 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){ - clearTimeout(this._curSearch.timer); - delete this._curSearch; - } + 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 = ""; + } + }, - var map = this._keyHandlerMap; - if(!map){ - // setup table mapping keys to events - map = {}; - map[dk.ENTER]="_onEnterKey"; - //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. - map[dk.SPACE]= map[" "] = "_onEnterKey"; - map[this.isLeftToRight() ? dk.LEFT_ARROW : dk.RIGHT_ARROW]="_onLeftArrow"; - map[this.isLeftToRight() ? dk.RIGHT_ARROW : dk.LEFT_ARROW]="_onRightArrow"; - map[dk.UP_ARROW]="_onUpArrow"; - map[dk.DOWN_ARROW]="_onDownArrow"; - map[dk.HOME]="_onHomeKey"; - map[dk.END]="_onEndKey"; - this._keyHandlerMap = map; - } - if(this._keyHandlerMap[key]){ - this[this._keyHandlerMap[key]]( { node: treeNode, item: treeNode.item, evt: e } ); - dojo.stopEvent(e); - } + uninitialize: function(preserveDom){ + if(this.dropDown && !this.dropDown._destroyed){ + this.dropDown.destroyRecursive(preserveDom); + delete this.dropDown; } + this.inherited(arguments); }, - _onEnterKey: function(/*Object*/ message){ - this._publish("execute", { item: message.item, node: message.node } ); - this.dndController.userSelect(message.node, dojo.isCopyKey( message.evt ), message.evt.shiftKey); - this.onClick(message.item, message.node, message.evt); + _onFocus: function(){ + this.validate(true); // show tooltip if second focus of required tooltip, but no selection + this.inherited(arguments); }, - _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); + _onBlur: function(){ + Tooltip.hide(this.domNode); + this.inherited(arguments); + } +}); + +Select._Menu = _SelectMenu; // for monkey patching + +return Select; +}); + +}, +'dojo/store/util/QueryResults':function(){ +define("dojo/store/util/QueryResults", ["../../_base/array", "../../_base/lang", "../../_base/Deferred" +], function(array, lang, Deferred) { + // module: + // dojo/store/util/QueryResults + // summary: + // The module defines a query results wrapper + +var util = lang.getObject("dojo.store.util", true); + +util.QueryResults = function(results){ + // summary: + // A function that wraps the results of a store query with additional + // methods. + // + // description: + // QueryResults is a basic wrapper that allows for array-like iteration + // over any kind of returned data from a query. While the simplest store + // will return a plain array of data, other stores may return deferreds or + // promises; this wrapper makes sure that *all* results can be treated + // the same. + // + // Additional methods include `forEach`, `filter` and `map`. + // + // returns: Object + // An array-like object that can be used for iterating over. + // + // example: + // Query a store and iterate over the results. + // + // | store.query({ prime: true }).forEach(function(item){ + // | // do something + // | }); + + if(!results){ + return results; + } + // if it is a promise it may be frozen + if(results.then){ + results = lang.delegate(results); + } + function addIterativeMethod(method){ + if(!results[method]){ + results[method] = function(){ + var args = arguments; + return Deferred.when(results, function(results){ + Array.prototype.unshift.call(args, results); + return util.QueryResults(array[method].apply(array, args)); + }); + }; } - }, + } + addIterativeMethod("forEach"); + addIterativeMethod("filter"); + addIterativeMethod("map"); + if(!results.total){ + results.total = Deferred.when(results, function(results){ + return results.length; + }); + } + return results; +}; - _onUpArrow: function(/*Object*/ message){ - // summary: - // Up arrow pressed; move to previous visible node +return util.QueryResults; +}); - var node = message.node; +}, +'dijit/form/_ListBase':function(){ +define("dijit/form/_ListBase", [ + "dojo/_base/declare", // declare + "dojo/window" // winUtils.scrollIntoView +], function(declare, winUtils){ + +// module: +// dijit/form/_ListBase +// summary: +// Focus-less menu to handle UI events consistently - // 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; - } +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, + + _getTarget: function(/*Event*/ evt){ + var tgt = evt.target; + var container = this.containerNode; + if(tgt == container || tgt == this.domNode){ return null; } + while(tgt && tgt.parentNode != container){ + // recurse to the top + tgt = tgt.parentNode; } + return tgt; + }, - if(node && node.isTreeNode){ - this.focusNode(node); + 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); }, - _onRightArrow: function(/*Object*/ message){ + selectLastNode: function(){ // summary: - // Right arrow pressed; go to child node - var node = message.node; + // 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); + }, - // 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); + selectNextNode: function(){ + // summary: + // Select the item just below the current selection. + // If nothing selected, select first node. + var selectedNode = this._getSelectedAttr(); + 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); } } }, - _onLeftArrow: function(/*Object*/ message){ + selectPreviousNode: function(){ // summary: - // Left arrow pressed. - // If not collapsed, collapse, else move to parent. - - var node = message.node; - - if(node.isExpandable && node.isExpanded){ - this._collapseNode(node); + // 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._getSelectedAttr(); + if(!selectedNode){ + this.selectLastNode(); }else{ - var parent = node.getParent(); - if(parent && parent.isTreeNode && !(!this.showRoot && parent === this.rootNode)){ - this.focusNode(parent); + var prev = selectedNode.previousSibling; + while(prev && prev.style.display == "none"){ + prev = prev.previousSibling; + } + if(!prev){ + this.selectLastNode(); + }else{ + this._setSelectedAttr(prev); } } }, - _onHomeKey: function(){ + _setSelectedAttr: function(/*DomNode*/ node){ // summary: - // Home key pressed; get first visible node, and set focus there - var node = this._getRootOrFirstNode(); - if(node){ - this.focusNode(node); + // Does the actual select. + if(this.selected != node){ + var selectedNode = this._getSelectedAttr(); + if(selectedNode){ + this.onDeselect(selectedNode); + this.selected = null; + } + if(node && node.parentNode == this.containerNode){ + this.selected = node; + winUtils.scrollIntoView(node); + this.onSelect(node); + } + }else if(node){ + this.onSelect(node); } }, - _onEndKey: function(/*Object*/ message){ + _getSelectedAttr: function(){ // summary: - // End key pressed; go to last visible node. + // Returns the selected node. + var v = this.selected; + return (v && v.parentNode == this.containerNode) ? v : (this.selected = null); + } +}); - var node = this.rootNode; - while(node.isExpanded){ - var c = node.getChildren(); - node = c[c.length - 1]; - } +}); - if(node && node.isTreeNode){ - this.focusNode(node); - } - }, +}, +'dijit/form/_FormWidget':function(){ +define("dijit/form/_FormWidget", [ + "dojo/_base/declare", // declare + "dojo/_base/kernel", // kernel.deprecated + "dojo/ready", + "../_Widget", + "../_CssStateMixin", + "../_TemplatedMixin", + "./_FormWidgetMixin" +], function(declare, kernel, ready, _Widget, _CssStateMixin, _TemplatedMixin, _FormWidgetMixin){ - // 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, +/*===== +var _Widget = dijit._Widget; +var _TemplatedMixin = dijit._TemplatedMixin; +var _CssStateMixin = dijit._CssStateMixin; +var _FormWidgetMixin = dijit.form._FormWidgetMixin; +=====*/ - _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. +// module: +// dijit/form/_FormWidget +// summary: +// FormWidget - // 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; - clearTimeout(cs.timer); - }else{ - // We are starting a new search - cs = this._curSearch = { - pattern: message.key, - startNode: message.node - }; - } - // set/reset timer to forget recent keystrokes - var self = this; - cs.timer = setTimeout(function(){ - delete self._curSearch; - }, this.multiCharSearchDuration); +// Back compat w/1.6, remove for 2.0 +if(!kernel.isAsync){ + ready(0, function(){ + var requires = ["dijit/form/_FormValueWidget"]; + require(requires); // use indirection so modules not rolled into a build + }); +} - // 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); - } - } - }, +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._Widget.attr`. + // + // They also share some common methods. - isExpandoNode: function(node, widget){ + setDisabled: function(/*Boolean*/ disabled){ // summary: - // check whether a dom node is the expandoNode for a particular TreeNode widget - return dojo.isDescendant(node, widget.expandoNode); + // Deprecated. Use set('disabled', ...) instead. + kernel.deprecated("setDisabled("+disabled+") is deprecated. Use set('disabled',"+disabled+") instead.", "", "2.0"); + this.set('disabled', disabled); }, - _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); - } - dojo.stopEvent(e); - }, - _onDblClick: function(/*TreeNode*/ nodeWidget, /*Event*/ e){ + setValue: function(/*String*/ value){ // 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); - } - dojo.stopEvent(e); + // 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); }, - _onExpandoClick: function(/*Object*/ message){ + getValue: function(){ // 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); - } + // Deprecated. Use get('value') instead. + kernel.deprecated(this.declaredClass+"::getValue() is deprecated. Use get('value') instead.", "", "2.0"); + return this.get('value'); }, - onClick: function(/* dojo.data */ item, /*TreeNode*/ node, /*Event*/ evt){ - // summary: - // Callback when a tree node is clicked - // tags: - // callback - }, - onDblClick: function(/* dojo.data */ item, /*TreeNode*/ node, /*Event*/ evt){ - // summary: - // Callback when a tree node is double-clicked - // tags: - // callback - }, - onOpen: function(/* dojo.data */ item, /*TreeNode*/ node){ - // summary: - // Callback when a node is opened - // tags: - // callback - }, - onClose: function(/* dojo.data */ item, /*TreeNode*/ node){ - // summary: - // Callback when a node is closed - // tags: - // callback + 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); }, - _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; - } - }, + // 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 +}); - _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 +}, +'dojo/DeferredList':function(){ +define("dojo/DeferredList", ["./_base/kernel", "./_base/Deferred", "./_base/array"], function(dojo, Deferred, darray) { + // module: + // dojo/DeferredList + // summary: + // TODOC - if(node._expandNodeDeferred){ - delete node._expandNodeDeferred; - } - if(node.isExpandable){ - if(node.state == "LOADING"){ - // ignore clicks while we are in the process of loading data - return; +dojo.DeferredList = function(/*Array*/ list, /*Boolean?*/ fireOnOneCallback, /*Boolean?*/ fireOnOneErrback, /*Boolean?*/ consumeErrors, /*Function?*/ canceller){ + // summary: + // Provides event handling for a group of Deferred objects. + // description: + // DeferredList takes an array of existing deferreds and returns a new deferred of its own + // this new deferred will typically have its callback fired when all of the deferreds in + // the given list have fired their own deferreds. The parameters `fireOnOneCallback` and + // fireOnOneErrback, will fire before all the deferreds as appropriate + // + // list: + // The list of deferreds to be synchronizied with this DeferredList + // fireOnOneCallback: + // Will cause the DeferredLists callback to be fired as soon as any + // of the deferreds in its list have been fired instead of waiting until + // the entire list has finished + // fireonOneErrback: + // Will cause the errback to fire upon any of the deferreds errback + // canceller: + // A deferred canceller function, see dojo.Deferred + var resultList = []; + Deferred.call(this); + var self = this; + if(list.length === 0 && !fireOnOneCallback){ + this.resolve([0, []]); + } + var finished = 0; + darray.forEach(list, function(item, i){ + item.then(function(result){ + if(fireOnOneCallback){ + self.resolve([i, result]); + }else{ + addResult(true, result); } - - node.collapse(); - this.onClose(node.item, node); - - if(node.item){ - this._state(node.item,false); - this._saveState(); + },function(error){ + if(fireOnOneErrback){ + self.reject(error); + }else{ + addResult(false, error); + } + if(consumeErrors){ + return null; + } + throw error; + }); + function addResult(succeeded, result){ + resultList[i] = [succeeded, result]; + finished++; + if(finished === list.length){ + self.resolve(resultList); } - } - }, - - _expandNode: function(/*_TreeNode*/ node, /*Boolean?*/ recursive){ - // summary: - // Called when the user has requested to expand the node - // recursive: - // Internal flag used when _expandNode() calls itself, don't set. - // returns: - // Deferred that fires when the node is loaded and opened and (if persist=true) all it's descendants - // that were previously opened too - if(node._expandNodeDeferred && !recursive){ - // there's already an expand in progress (or completed), so just return - return node._expandNodeDeferred; // dojo.Deferred } + }); +}; +dojo.DeferredList.prototype = new Deferred(); - var model = this.model, - item = node.item, - _this = this; +dojo.DeferredList.prototype.gatherResults = function(deferredList){ + // summary: + // Gathers the results of the deferreds for packaging + // as the parameters to the Deferred Lists' callback + // deferredList: dojo.DeferredList + // The deferred list from which this function gathers results. + // returns: dojo.DeferredList + // The newly created deferred list which packs results as + // parameters to its callback. - switch(node.state){ - case "UNCHECKED": - // need to load all the children, and then expand - node.markProcessing(); + var d = new dojo.DeferredList(deferredList, false, true, false); + d.addCallback(function(results){ + var ret = []; + darray.forEach(results, function(result){ + ret.push(result[1]); + }); + return ret; + }); + return d; +}; - // 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. - var def = (node._expandNodeDeferred = new dojo.Deferred()); +return dojo.DeferredList; +}); - // Get the children - model.getChildren( - item, - function(items){ - node.unmarkProcessing(); +}, +'dojo/dnd/common':function(){ +define("dojo/dnd/common", ["../main"], function(dojo) { + // module: + // dojo/dnd/common + // summary: + // TODOC - // 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. - var scid = node.setChildItems(items); - - // Call _expandNode() again but this time it will just to do the animation (default branch). - // The returned Deferred will fire when the animation completes. - // TODO: seems like I can avoid recursion and just use a deferred to sequence the events? - var ed = _this._expandNode(node, true); +dojo.getObject("dnd", true, dojo); - // After the above two tasks (setChildItems() and recursive _expandNode()) finish, - // signal that I am done. - scid.addCallback(function(){ - ed.addCallback(function(){ - def.callback(); - }) - }); - }, - function(err){ - console.error(_this, ": error loading root children: ", err); - } - ); - break; +dojo.dnd.getCopyKeyState = dojo.isCopyKey; - default: // "LOADED" - // data is already loaded; just expand node - def = (node._expandNodeDeferred = node.expand()); +dojo.dnd._uniqueId = 0; +dojo.dnd.getUniqueId = function(){ + // summary: + // returns a unique string for use with any DOM element + var id; + do{ + id = dojo._scopeName + "Unique" + (++dojo.dnd._uniqueId); + }while(dojo.byId(id)); + return id; +}; - this.onOpen(node.item, node); +dojo.dnd._empty = {}; - if(item){ - this._state(item, true); - this._saveState(); - } - } +dojo.dnd.isFormElement = function(/*Event*/ e){ + // summary: + // returns true if user clicked on a form element + var t = e.target; + if(t.nodeType == 3 /*TEXT_NODE*/){ + t = t.parentNode; + } + return " button textarea input select option ".indexOf(" " + t.tagName.toLowerCase() + " ") >= 0; // Boolean +}; - return def; // dojo.Deferred - }, +return dojo.dnd; +}); - ////////////////// Miscellaneous functions //////////////// +}, +'dijit/_base/place':function(){ +define("dijit/_base/place", [ + "dojo/_base/array", // array.forEach + "dojo/_base/lang", // lang.isArray + "dojo/window", // windowUtils.getBox + "../place", + ".." // export to dijit namespace +], function(array, lang, windowUtils, place, dijit){ + + // module: + // dijit/_base/place + // summary: + // Back compatibility module, new code should use dijit/place directly instead of using this module. - focusNode: function(/* _tree.Node */ node){ + dijit.getViewport = function(){ // summary: - // Focus on the specified node (which must be visible) - // tags: - // protected + // Deprecated method to return the dimensions and scroll position of the viewable area of a browser window. + // New code should use windowUtils.getBox() - // set focus so that the label will be voiced using screen readers - dijit.focus(node.labelNode); - }, + return windowUtils.getBox(); + }; - _onNodeFocus: function(/*dijit._Widget*/ node){ + /*===== + dijit.placeOnScreen = function(node, pos, corners, padding){ // 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. + // Positions one of the node's corners at specified position + // such that node is fully visible in viewport. + // Deprecated, new code should use dijit.place.at() instead. + }; + =====*/ + dijit.placeOnScreen = place.at; - 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); + /*===== + dijit.placeOnScreenAroundElement = function(node, aroundElement, 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. + }; + ====*/ + dijit.placeOnScreenAroundElement = function(node, aroundNode, aroundCorners, layoutNode){ + // 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]}); } - - // mark that the new node is the currently selected one - node.setFocusable(true); - this.lastFocused = node; } - }, - _onNodeMouseEnter: function(/*dijit._Widget*/ node){ - // summary: - // Called when mouse is over a node (onmouseenter event), - // this is monitored by the DND code - }, + return place.around(node, aroundNode, positions, true, layoutNode); + }; - _onNodeMouseLeave: function(/*dijit._Widget*/ node){ + /*===== + dijit.placeOnScreenAroundNode = function(node, aroundNode, aroundCorners, layoutNode){ // summary: - // Called when mouse leaves a node (onmouseleave event), - // this is monitored by the DND code - }, - - //////////////// Events from the model ////////////////////////// + // 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. + }; + =====*/ + dijit.placeOnScreenAroundNode = dijit.placeOnScreenAroundElement; - _onItemChange: function(/*Item*/ item){ + /*===== + dijit.placeOnScreenAroundRectangle = function(node, aroundRect, aroundCorners, layoutNode){ // 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); - dojo.forEach(nodes, function(node){ - node.set({ - item: item, // theoretically could be new JS Object representing same item - label: label, - tooltip: tooltip - }); - node._updateItemClasses(item); - }); - } - }, + // 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. + }; + =====*/ + dijit.placeOnScreenAroundRectangle = dijit.placeOnScreenAroundElement; - _onItemChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){ + dijit.getPopupAroundAlignment = function(/*Array*/ position, /*Boolean*/ leftToRight){ // 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){ - dojo.forEach(parentNodes,function(parentNode){ - parentNode.setChildItems(newChildrenList); - }); - } - }, + // 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.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; + }; - _onItemDelete: function(/*Item*/ item){ - // summary: - // Processes notification of a deletion of an item - var model = this.model, - identity = model.getIdentity(item), - nodes = this._itemNodesMap[identity]; + return dijit; +}); - if(nodes){ - dojo.forEach(nodes,function(node){ - // Remove node from set of selected nodes (if it's selected) - this.dndController.removeTreeNode(node); +}, +'dijit/MenuSeparator':function(){ +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){ - 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]; - } - }, +/*===== + var _WidgetBase = dijit._WidgetBase; + var _TemplatedMixin = dijit._TemplatedMixin; + var _Contained = dijit._Contained; +=====*/ - /////////////// Miscellaneous funcs + // module: + // dijit/MenuSeparator + // summary: + // A line between two menu items - _initState: function(){ - // summary: - // Load in which nodes should be opened automatically - if(this.persist){ - var cookie = dojo.cookie(this.cookieName); - this._openedItemIds = {}; - if(cookie){ - dojo.forEach(cookie.split(','), function(item){ - this._openedItemIds[item] = true; - }, this); - } - } - }, - _state: function(item,expanded){ - // summary: - // Query or set expanded state for an item, - if(!this.persist){ - return false; - } - var id=this.model.getIdentity(item); - if(arguments.length === 1){ - return this._openedItemIds[id]; - } - if(expanded){ - this._openedItemIds[id] = true; - }else{ - delete this._openedItemIds[id]; - } - }, - _saveState: function(){ + return declare("dijit.MenuSeparator", [_WidgetBase, _TemplatedMixin, _Contained], { // summary: - // Create and save a cookie with the currently expanded nodes identifiers - if(!this.persist){ - return; - } - var ary = []; - for(var id in this._openedItemIds){ - ary.push(id); - } - dojo.cookie(this.cookieName, ary.join(","), {expires:365}); - }, - - destroy: function(){ - if(this._curSearch){ - clearTimeout(this._curSearch.timer); - delete this._curSearch; - } - if(this.rootNode){ - this.rootNode.destroyRecursive(); - } - if(this.dndController && !dojo.isString(this.dndController)){ - this.dndController.destroy(); - } - this.rootNode = null; - this.inherited(arguments); - }, + // A line between two menu items - 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(); - }, + templateString: template, - resize: function(changeSize){ - if(changeSize){ - dojo.marginBox(this.domNode, changeSize); - } + buildRendering: function(){ + this.inherited(arguments); + dom.setSelectable(this.domNode, false); + }, - // The only 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) - this._nodePixelIndent = dojo._getMarginSize(this.tree.indentDetector).w; + isFocusable: function(){ + // summary: + // Override to always return false + // tags: + // protected - if(this.tree.rootNode){ - // If tree has already loaded, then reset indent for all the nodes - this.tree.rootNode.set('indent', this.showRoot ? 0 : -1); + return false; // Boolean } - }, - - _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 dijit._TreeNode(args); - } + }); }); -// For back-compat. TODO: remove in 2.0 +}, +'dijit/form/_ComboBoxMenu':function(){ +define("dijit/form/_ComboBoxMenu", [ + "dojo/_base/declare", // declare + "dojo/dom-class", // domClass.add domClass.remove + "dojo/dom-construct", // domConstruct.create + "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, domConstruct, domStyle, keys, + _WidgetBase, _TemplatedMixin, _ComboBoxMenuMixin, _ListMouseMixin){ -} +/*===== + var _WidgetBase = dijit._WidgetBase; + var _TemplatedMixin = dijit._TemplatedMixin; + var _ComboBoxMenuMixin = dijit.form._ComboBoxMenuMixin; + var _ListMouseMixin = dijit.form._ListMouseMixin; +=====*/ -if(!dojo._hasResource["dojo.dnd.Avatar"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.dnd.Avatar"] = true; -dojo.provide("dojo.dnd.Avatar"); + // module: + // dijit/form/_ComboBoxMenu + // summary: + // Focus-less menu for internal use in `dijit.form.ComboBox` + 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;'>" + +"<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>", -dojo.declare("dojo.dnd.Avatar", null, { - // summary: - // Object that represents transferred DnD items visually - // manager: Object - // a DnD manager object + baseClass: "dijitComboBoxMenu", - constructor: function(manager){ - this.manager = manager; - this.construct(); - }, + postCreate: function(){ + this.inherited(arguments); + if(!this.isLeftToRight()){ + domClass.add(this.previousButton, "dijitMenuItemRtl"); + domClass.add(this.nextButton, "dijitMenuItemRtl"); + } + }, - // methods - construct: function(){ - // summary: - // constructor function; - // it is separate so it can be (dynamically) overwritten in case of need - this.isA11y = dojo.hasClass(dojo.body(),"dijit_a11y"); - var a = dojo.create("table", { - "class": "dojoDndAvatar", - style: { - position: "absolute", - zIndex: "1999", - margin: "0px" - } - }), - source = this.manager.source, node, - b = dojo.create("tbody", null, a), - tr = dojo.create("tr", null, b), - td = dojo.create("td", null, tr), - icon = this.isA11y ? dojo.create("span", { - id : "a11yIcon", - innerHTML : this.manager.copy ? '+' : "<" - }, td) : null, - span = dojo.create("span", { - innerHTML: source.generateText ? this._generateText() : "" - }, td), - k = Math.min(5, this.manager.nodes.length), i = 0; - // we have to set the opacity on IE only after the node is live - dojo.attr(tr, { - "class": "dojoDndAvatarHeader", - style: {opacity: 0.9} - }); - for(; i < k; ++i){ - if(source.creator){ - // create an avatar representation of the node - node = source._normalizedCreator(source.getItem(this.manager.nodes[i].id).data, "avatar").node; - }else{ - // or just clone the node and hope it works - node = this.manager.nodes[i].cloneNode(true); - if(node.tagName.toLowerCase() == "tr"){ - // insert extra table nodes - var table = dojo.create("table"), - tbody = dojo.create("tbody", null, table); - tbody.appendChild(node); - node = table; + _createMenuItem: function(){ + return domConstruct.create("div", { + "class": "dijitReset dijitMenuItem" +(this.isLeftToRight() ? "" : " dijitMenuItemRtl"), + role: "option" + }); + }, + + 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; } - node.id = ""; - tr = dojo.create("tr", null, b); - td = dojo.create("td", null, tr); - td.appendChild(node); - dojo.attr(tr, { - "class": "dojoDndAvatarItem", - style: {opacity: (9 - i) / 10} - }); - } - this.node = a; - }, - destroy: function(){ - // summary: - // destructor for the avatar; called to remove all references so it can be garbage-collected - dojo.destroy(this.node); - this.node = false; - }, - update: function(){ - // summary: - // updates the avatar to reflect the current DnD state - dojo[(this.manager.canDropFlag ? "add" : "remove") + "Class"](this.node, "dojoDndAvatarCanDrop"); - if (this.isA11y){ - var icon = dojo.byId("a11yIcon"); - var text = '+'; // assume canDrop && copy - if (this.manager.canDropFlag && !this.manager.copy) { - text = '< '; // canDrop && move - }else if (!this.manager.canDropFlag && !this.manager.copy) { - text = "o"; //!canDrop && move - }else if(!this.manager.canDropFlag){ - text = 'x'; // !canDrop && copy + }, + + 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.charOrCode){ + 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; } - icon.innerHTML=text; } - // replace text - dojo.query(("tr.dojoDndAvatarHeader td span" +(this.isA11y ? " span" : "")), this.node).forEach( - function(node){ - node.innerHTML = this._generateText(); - }, this); - }, - _generateText: function(){ - // summary: generates a proper text to reflect copying or moving of items - return this.manager.nodes.length.toString(); - } + }); }); -} +}, +'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>", +'dijit/Dialog':function(){ +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<span data-dojo-attach-point=\"titleNode\" class=\"dijitDialogTitle\" id=\"${id}_title\"></span>\n\t<span data-dojo-attach-point=\"closeButtonNode\" class=\"dijitDialogCloseIcon\" data-dojo-attach-event=\"ondijitclick: onCancel\" title=\"${buttonCancel}\" role=\"button\" tabIndex=\"-1\">\n\t\t<span data-dojo-attach-point=\"closeText\" class=\"closeText\" title=\"${buttonCancel}\">x</span>\n\t</span>\n\t</div>\n\t\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/_base/kernel", // kernel.isAsync + "dojo/keys", + "dojo/_base/lang", // lang.mixin lang.hitch + "dojo/on", + "dojo/ready", + "dojo/_base/sniff", // has("ie") has("opera") + "dojo/_base/window", // win.body + "dojo/window", // winUtils.getBox + "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", + ".", // 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, kernel, keys, lang, on, ready, has, win, winUtils, + Moveable, TimedMoveable, focus, manager, _Widget, _TemplatedMixin, _CssStateMixin, _FormMixin, _DialogMixin, + DialogUnderlay, ContentPane, template, dijit){ + +/*===== + var _Widget = dijit._Widget; + var _TemplatedMixin = dijit._TemplatedMixin; + var _CssStateMixin = dijit._CssStateMixin; + var _FormMixin = dijit.form._FormMixin; + var _DialogMixin = dijit._DialogMixin; +=====*/ -if(!dojo._hasResource["dojo.dnd.Manager"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.dnd.Manager"] = true; -dojo.provide("dojo.dnd.Manager"); + // module: + // dijit/Dialog + // summary: + // A modal dialog Widget + /*===== + 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], { + // 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 dijit.Dialog({ title: "test dialog", content: "test content" }; + // | dojo.body().appendChild(foo.domNode); + // | foo.startup(); -dojo.declare("dojo.dnd.Manager", null, { - // summary: - // the manager of DnD operations (usually a singleton) - constructor: function(){ - this.avatar = null; - this.source = null; - this.nodes = []; - this.copy = true; - this.target = null; - this.canDropFlag = false; - this.events = []; - }, + templateString: template, - // avatar's offset from the mouse - OFFSET_X: 16, - OFFSET_Y: 16, - - // methods - overSource: function(source){ - // summary: - // called when a source detected a mouse-over condition - // source: Object - // the reporter - if(this.avatar){ - this.target = (source && source.targetState != "Disabled") ? source : null; - this.canDropFlag = Boolean(this.target); - this.avatar.update(); - } - dojo.publish("/dnd/source/over", [source]); - }, - outSource: function(source){ - // summary: - // called when a source detected a mouse-out condition - // source: Object - // the reporter - if(this.avatar){ - if(this.target == source){ - this.target = null; - this.canDropFlag = false; - this.avatar.update(); - dojo.publish("/dnd/source/over", [null]); - } - }else{ - dojo.publish("/dnd/source/over", [null]); - } - }, - startDrag: function(source, nodes, copy){ - // summary: - // called to initiate the DnD operation - // source: Object - // the source which provides items - // nodes: Array - // the list of transferred items - // copy: Boolean - // copy items, if true, move items otherwise - this.source = source; - this.nodes = nodes; - this.copy = Boolean(copy); // normalizing to true boolean - this.avatar = this.makeAvatar(); - dojo.body().appendChild(this.avatar.node); - dojo.publish("/dnd/start", [source, nodes, this.copy]); - this.events = [ - dojo.connect(dojo.doc, "onmousemove", this, "onMouseMove"), - dojo.connect(dojo.doc, "onmouseup", this, "onMouseUp"), - dojo.connect(dojo.doc, "onkeydown", this, "onKeyDown"), - dojo.connect(dojo.doc, "onkeyup", this, "onKeyUp"), - // cancel text selection and text dragging - dojo.connect(dojo.doc, "ondragstart", dojo.stopEvent), - dojo.connect(dojo.body(), "onselectstart", dojo.stopEvent) - ]; - var c = "dojoDnd" + (copy ? "Copy" : "Move"); - dojo.addClass(dojo.body(), c); - }, - canDrop: function(flag){ - // summary: - // called to notify if the current target can accept items - var canDropFlag = Boolean(this.target && flag); - if(this.canDropFlag != canDropFlag){ - this.canDropFlag = canDropFlag; - this.avatar.update(); - } - }, - stopDrag: function(){ - // summary: - // stop the DnD in progress - dojo.removeClass(dojo.body(), ["dojoDndCopy", "dojoDndMove"]); - dojo.forEach(this.events, dojo.disconnect); - this.events = []; - this.avatar.destroy(); - this.avatar = null; - this.source = this.target = null; - this.nodes = []; - }, - makeAvatar: function(){ - // summary: - // makes the avatar; it is separate to be overwritten dynamically, if needed - return new dojo.dnd.Avatar(this); - }, - updateAvatar: function(){ - // summary: - // updates the avatar; it is separate to be overwritten dynamically, if needed - this.avatar.update(); - }, - - // mouse event processors - onMouseMove: function(e){ - // summary: - // event processor for onmousemove - // e: Event - // mouse event - var a = this.avatar; - if(a){ - dojo.dnd.autoScrollNodes(e); - //dojo.dnd.autoScroll(e); - var s = a.node.style; - s.left = (e.pageX + this.OFFSET_X) + "px"; - s.top = (e.pageY + this.OFFSET_Y) + "px"; - var copy = Boolean(this.source.copyState(dojo.isCopyKey(e))); - if(this.copy != copy){ - this._setCopyStatus(copy); - } - } - }, - onMouseUp: function(e){ - // summary: - // event processor for onmouseup - // e: Event - // mouse event - if(this.avatar){ - if(this.target && this.canDropFlag){ - var copy = Boolean(this.source.copyState(dojo.isCopyKey(e))), - params = [this.source, this.nodes, copy, this.target, e]; - dojo.publish("/dnd/drop/before", params); - dojo.publish("/dnd/drop", params); - }else{ - dojo.publish("/dnd/cancel"); - } - this.stopDrag(); - } - }, - - // keyboard event processors - onKeyDown: function(e){ - // summary: - // event processor for onkeydown: - // watching for CTRL for copy/move status, watching for ESCAPE to cancel the drag - // e: Event - // keyboard event - if(this.avatar){ - switch(e.keyCode){ - case dojo.keys.CTRL: - var copy = Boolean(this.source.copyState(true)); - if(this.copy != copy){ - this._setCopyStatus(copy); - } - break; - case dojo.keys.ESCAPE: - dojo.publish("/dnd/cancel"); - this.stopDrag(); - break; - } - } - }, - onKeyUp: function(e){ - // summary: - // event processor for onkeyup, watching for CTRL for copy/move status - // e: Event - // keyboard event - if(this.avatar && e.keyCode == dojo.keys.CTRL){ - var copy = Boolean(this.source.copyState(false)); - if(this.copy != copy){ - this._setCopyStatus(copy); - } - } - }, - - // utilities - _setCopyStatus: function(copy){ - // summary: - // changes the copy status - // copy: Boolean - // the copy status - this.copy = copy; - this.source._markDndStatus(this.copy); - this.updateAvatar(); - dojo.replaceClass(dojo.body(), - "dojoDnd" + (this.copy ? "Copy" : "Move"), - "dojoDnd" + (this.copy ? "Move" : "Copy")); - } -}); + baseClass: "dijitDialog", -// dojo.dnd._manager: -// The manager singleton variable. Can be overwritten if needed. -dojo.dnd._manager = null; + cssStateNodes: { + closeButtonNode: "dijitDialogCloseIcon" + }, -dojo.dnd.manager = function(){ - // summary: - // Returns the current DnD manager. Creates one if it is not created yet. - if(!dojo.dnd._manager){ - dojo.dnd._manager = new dojo.dnd.Manager(); - } - return dojo.dnd._manager; // Object -}; + // 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, -if(!dojo._hasResource["dijit.tree.dndSource"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dijit.tree.dndSource"] = true; -dojo.provide("dijit.tree.dndSource"); + // 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, -/*===== -dijit.tree.__SourceArgs = function(){ - // 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 - this.isSource = isSource; - this.accept = accept; - this.autoSync = autoSync; - this.copyOnly = copyOnly; - this.dragThreshold = dragThreshold; - this.betweenThreshold = betweenThreshold; -} -=====*/ + // _lastFocusItem: [private readonly] DomNode + // The pointer to which node has focus prior to our dialog. + // Set by `dijit._DialogMixin._getFocusItems`. + _lastFocusItem: null, -dojo.declare("dijit.tree.dndSource", dijit.tree._dndSelector, { - // summary: - // Handles drag and drop operations (as a source or a target) for `dijit.Tree` + // 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, - // isSource: [private] Boolean - // Can be used as a DnD source. - isSource: true, + // 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, - // accept: String[] - // List of accepted types (text strings) for the Tree; defaults to - // ["text"] - accept: ["text", "treeNode"], + //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":"", - // copyOnly: [private] Boolean - // Copy items, if true, use a state of Ctrl key otherwise - copyOnly: false, + postMixInProperties: function(){ + var _nlsResources = i18n.getLocalization("dijit", "common"); + lang.mixin(this, _nlsResources); + this.inherited(arguments); + }, - // dragThreshold: Number - // The move delay in pixels before detecting a drag; 5 by default - dragThreshold: 5, + postCreate: function(){ + domStyle.set(this.domNode, { + display: "none", + position:"absolute" + }); + win.body().appendChild(this.domNode); - // betweenThreshold: Integer - // Distance from upper/lower edge of node to allow drop to reorder nodes - betweenThreshold: 0, + this.inherited(arguments); - constructor: function(/*dijit.Tree*/ tree, /*dijit.tree.__SourceArgs*/ params){ - // summary: - // a constructor of the Tree DnD Source - // tags: - // private - if(!params){ params = {}; } - dojo.mixin(this, params); - this.isSource = typeof params.isSource == "undefined" ? true : params.isSource; - 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; - } - } + this.connect(this, "onExecute", "hide"); + this.connect(this, "onCancel", "hide"); + this._modalconnects = []; + }, - // 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; + 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 - // states - this.sourceState = ""; - if(this.isSource){ - dojo.addClass(this.node, "dojoDndSource"); - } - this.targetState = ""; - if(this.accept){ - dojo.addClass(this.node, "dojoDndTarget"); - } + // 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); + }, - // set up events - this.topics = [ - dojo.subscribe("/dnd/source/over", this, "onDndSourceOver"), - dojo.subscribe("/dnd/start", this, "onDndStart"), - dojo.subscribe("/dnd/drop", this, "onDndDrop"), - dojo.subscribe("/dnd/cancel", this, "onDndCancel") - ]; - }, + _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(); + 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(); + }, - // 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 - }, + _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 - 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("destroy",arguments); - dojo.forEach(this.topics, dojo.unsubscribe); - this.targetAnchor = null; - }, + var node = this.domNode; - _onDragMouse: function(e){ - // summary: - // Helper method for processing onmousemove/onmouseover events while drag is in progress. - // Keeps track of current drop target. + 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"); + } - var m = dojo.dnd.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) + this.underlayAttrs = { + dialogId: this.id, + "class": array.map(this["class"].split(/\s/), function(s){ return s+"_underlay"; }).join(" ") + }; + }, - // 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 = dojo.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"; - } - } + _size: function(){ + // summary: + // If necessary, shrink dialog contents so dialog fits in viewport + // tags: + // private - if(newTarget != oldTarget || newDropPosition != oldDropPosition){ - if(oldTarget){ - this._removeItemClass(oldTarget.rowNode, oldDropPosition); - } - if(newTarget){ - this._addItemClass(newTarget.rowNode, newDropPosition); + 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(this._singleChildOriginalStyle){ + this._singleChild.domNode.style.cssText = this._singleChildOriginalStyle; + } + delete this._singleChildOriginalStyle; + }else{ + domStyle.set(this.containerNode, { + width:"auto", + height:"auto" + }); } - // 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 if(m.source == this && (newTarget.id in this.selection)){ - // Guard against dropping onto yourself (TODO: guard against dropping onto your descendant, #7140) - m.canDrop(false); - }else if(this.checkItemAcceptance(newTarget.rowNode, m.source, newDropPosition.toLowerCase()) - && !this._isParentChildDrop(m.source, newTarget.rowNode)){ - m.canDrop(true); + var bb = domGeometry.position(this.domNode); + var viewport = winUtils.getBox(); + if(bb.w >= viewport.w || bb.h >= viewport.h){ + // Reduce size of dialog contents so that dialog fits in viewport + + var w = Math.min(bb.w, Math.floor(viewport.w * 0.75)), + h = Math.min(bb.h, Math.floor(viewport.h * 0.75)); + + if(this._singleChild && this._singleChild.resize){ + 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{ - m.canDrop(false); + if(this._singleChild && this._singleChild.resize){ + this._singleChild.resize(); + } } + }, - this.targetAnchor = newTarget; - this.dropPosition = newDropPosition; - } - }, + _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(win.body(), "dojoMove")){ // don't do anything if called during auto-scroll + var node = this.domNode, + viewport = winUtils.getBox(), + 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" + }); + } + }, - onMouseMove: function(e){ - // summary: - // Called for any onmousemove events over the Tree - // e: Event - // onmousemouse event - // tags: - // private - if(this.isDragging && this.targetState == "Disabled"){ return; } - this.inherited(arguments); - var m = dojo.dnd.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; - } + _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 } - //this node does not have any ancestors selected, add it - r.push(n); } - nodes = r; + 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*/ } } - nodes = dojo.map(nodes, function(n){return n.domNode}); - m.startDrag(this, nodes, this.copyState(dojo.isCopyKey(e))); } } - } - }, + }, - onMouseDown: function(e){ - // summary: - // Event processor for onmousedown - // e: Event - // onmousedown event - // tags: - // private - this.mouseDown = true; - this.mouseButton = e.button; - this._lastX = e.pageX; - this._lastY = e.pageY; - this.inherited(arguments); - }, + show: function(){ + // summary: + // Display the dialog + // returns: dojo.Deferred + // Deferred object that resolves when the display animation is complete - onMouseUp: function(e){ - // summary: - // Event processor for onmouseup - // e: Event - // onmouseup event - // tags: - // private - if(this.mouseDown){ - this.mouseDown = false; - this.inherited(arguments); - } - }, + if(this.open){ return; } - onMouseOut: function(){ - // summary: - // Event processor for when mouse is moved away from a TreeNode - // tags: - // private - this.inherited(arguments); - this._unmarkTargetAnchor(); - }, + if(!this._started){ + this.startup(); + } - 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; - }, + // first time we show the dialog, there's some initialization stuff to do + if(!this._alreadyInitialized){ + this._setup(); + this._alreadyInitialized=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 = dojo.dnd.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._fadeOutDeferred){ + this._fadeOutDeferred.cancel(); + } - if(this.isSource){ - this._changeState("Source", this == source ? (copy ? "Copied" : "Moved") : ""); - } - var accepted = this.checkAcceptance(source, nodes); + this._modalconnects.push(on(window, "scroll", lang.hitch(this, "layout"))); + this._modalconnects.push(on(window, "resize", lang.hitch(this, function(){ + // IE gives spurious resize events and can actually get stuck + // in an infinite loop if we don't ignore them + var viewport = winUtils.getBox(); + if(!this._oldViewport || + viewport.h != this._oldViewport.h || + viewport.w != this._oldViewport.w){ + this.layout(); + this._oldViewport = viewport; + } + }))); + this._modalconnects.push(on(this.domNode, connect._keypress, lang.hitch(this, "_onKey"))); - this._changeState("Target", accepted ? "" : "Disabled"); + domStyle.set(this.domNode, { + opacity:0, + display:"" + }); - if(this == source){ - dojo.dnd.manager().overSource(this); - } + this._set("open", true); + this._onShow(); // lazy load trigger - this.isDragging = true; - }, + this._size(); + this._position(); - itemCreator: function(/*DomNode[]*/ nodes, target, /*dojo.dnd.Source*/ 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. - // 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 + // fade-in Animation object, setup below + var fadeIn; - // TODO: for 2.0 refactor so itemCreator() is called once per drag node, and - // make signature itemCreator(sourceItem, node, target) (or similar). + this._fadeInDeferred = new Deferred(lang.hitch(this, function(){ + fadeIn.stop(); + delete this._fadeInDeferred; + })); - return dojo.map(nodes, function(node){ - return { - "id": node.id, - "name": node.textContent || node.innerText || "" - }; - }); // Object[] - }, + 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.callback(true); + delete this._fadeInDeferred; + }) + }).play(); - 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, - requeryRoot = false; // set to true iff top level items change + return this._fadeInDeferred; + }, - this.isDragging = false; + hide: function(){ + // summary: + // Hide the dialog + // returns: dojo.Deferred + // Deferred object that resolves when the hide animation is complete - // Compute the new parent item - var targetWidget = target; - var newParentItem; - var insertIndex; - newParentItem = (targetWidget && targetWidget.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 = (targetWidget.getParent() && targetWidget.getParent().item) || tree.item; - // Compute the insert index for reordering - insertIndex = targetWidget.getIndexInParent(); - if(this.dropPosition == "After"){ - insertIndex = targetWidget.getIndexInParent() + 1; - } - }else{ - newParentItem = (targetWidget && targetWidget.item) || tree.item; + // if we haven't been initialized yet then we aren't showing and we can just return + if(!this._alreadyInitialized){ + return; + } + if(this._fadeInDeferred){ + this._fadeInDeferred.cancel(); } - // 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; + // fade-in Animation object, setup below + var fadeOut; - dojo.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); + 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')); - // 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(dojo.indexOf(sourceItem.type, "treeNode") != -1){ - var childTreeNode = sourceItem.data, - childItem = childTreeNode.item, - oldParentItem = childTreeNode.getParent().item; - } + fadeOut = fx.fadeOut({ + node: this.domNode, + duration: this.duration, + onEnd: lang.hitch(this, function(){ + this.domNode.style.display = "none"; + DialogLevelManager.hide(this); + this._fadeOutDeferred.callback(true); + delete this._fadeOutDeferred; + }) + }).play(); - 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(this._scrollConnected){ + this._scrollConnected = false; + } + var h; + while(h = this._modalconnects.pop()){ + h.remove(); + } - if(typeof insertIndex == "number"){ - if(newParentItem == oldParentItem && childTreeNode.getIndexInParent() < insertIndex){ - insertIndex -= 1; - } - } - model.pasteItem(childItem, oldParentItem, newParentItem, copy, insertIndex); - }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); - }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); - } + if(this._relativePosition){ + delete this._relativePosition; + } + this._set("open", false); - // Create new item in the tree, based on the drag source. - model.newItem(newItemsParams[idx], newParentItem, insertIndex); + return this._fadeOutDeferred; + }, + + layout: function(){ + // summary: + // Position the Dialog and the underlay + // tags: + // private + if(this.domNode.style.display != "none"){ + if(dijit._underlay){ // avoid race condition during show() + dijit._underlay.layout(); } - }, this); + this._position(); + } + }, - // 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(targetWidget); + 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); } - 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", ""); - }, + var Dialog = declare("dijit.Dialog", [ContentPane, _DialogBase], {}); + Dialog._DialogBase = _DialogBase; // for monkey patching - // When focus moves in/out of the entire Tree - onOverEvent: function(){ + var DialogLevelManager = Dialog._DialogLevelManager = { // summary: - // This method is called when mouse is moved over our container (like onmouseenter) - // tags: - // private - this.inherited(arguments); - dojo.dnd.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 = dojo.dnd.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 + // 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. - // 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; - } + _beginZIndex: 950, + show: function(/*dijit._Widget*/ 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. - var root = source.tree.domNode; - var ids = source.selection; + // Save current focus + ds[ds.length-1].focus = focus.curNode; - var node = targetRow.parentNode; + // Display the underlay, or if already displayed then adjust for this new dialog + var underlay = dijit._underlay; + if(!underlay || underlay._destroyed){ + underlay = dijit._underlay = new DialogUnderlay(underlayAttrs); + }else{ + underlay.set(dialog.underlayAttrs); + } - // 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; - } + // 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(dijit._underlay.domNode, 'zIndex', zIndex - 1); - return node.id && ids[node.id]; - }, + // Dialog + domStyle.set(dialog.domNode, 'zIndex', zIndex); - _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; - }, + ds.push({dialog: dialog, underlayAttrs: underlayAttrs, zIndex: zIndex}); + }, - _markDndStatus: function(copy){ - // summary: - // Changes source's state based on "copy" status - this._changeState("Source", copy ? "Copied" : "Moved"); - } -}); + hide: function(/*dijit._Widget*/ 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 -if(!dojo._hasResource["dojo.data.ItemFileReadStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.data.ItemFileReadStore"] = true; -dojo.provide("dojo.data.ItemFileReadStore"); + ds.pop(); + var pd = ds[ds.length-1]; // the new active dialog (or the base page itself) + // Adjust underlay + if(ds.length == 1){ + // Returning to original page. + // Hide the underlay, unless the underlay widget has already been destroyed + // because we are being called during page unload (when all widgets are destroyed) + if(!dijit._underlay._destroyed){ + dijit._underlay.hide(); + } + }else{ + // Popping back to previous dialog, adjust underlay + domStyle.set(dijit._underlay.domNode, 'zIndex', pd.zIndex - 1); + dijit._underlay.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); + } + } + }, -dojo.declare("dojo.data.ItemFileReadStore", null,{ - // summary: - // The ItemFileReadStore implements the dojo.data.api.Read API and reads - // data from JSON files that have contents in this format -- - // { items: [ - // { name:'Kermit', color:'green', age:12, friends:['Gonzo', {_reference:{name:'Fozzie Bear'}}]}, - // { name:'Fozzie Bear', wears:['hat', 'tie']}, - // { name:'Miss Piggy', pets:'Foo-Foo'} - // ]} - // Note that it can also contain an 'identifer' property that specified which attribute on the items - // in the array of items that acts as the unique identifier for that item. - // - constructor: function(/* Object */ keywordParameters){ - // summary: constructor - // keywordParameters: {url: String} - // keywordParameters: {data: jsonObject} - // keywordParameters: {typeMap: object) - // The structure of the typeMap object is as follows: - // { - // type0: function || object, - // type1: function || object, - // ... - // typeN: function || object - // } - // Where if it is a function, it is assumed to be an object constructor that takes the - // value of _value as the initialization parameters. If it is an object, then it is assumed - // to be an object of general form: - // { - // type: function, //constructor. - // deserialize: function(value) //The function that parses the value and constructs the object defined by type appropriately. - // } - - this._arrayOfAllItems = []; - this._arrayOfTopLevelItems = []; - this._loadFinished = false; - this._jsonFileUrl = keywordParameters.url; - this._ccUrl = keywordParameters.url; - this.url = keywordParameters.url; - this._jsonData = keywordParameters.data; - this.data = null; - this._datatypeMap = keywordParameters.typeMap || {}; - if(!this._datatypeMap['Date']){ - //If no default mapping for dates, then set this as default. - //We use the dojo.date.stamp here because the ISO format is the 'dojo way' - //of generically representing dates. - this._datatypeMap['Date'] = { - type: Date, - deserialize: function(value){ - return dojo.date.stamp.fromISOString(value); - } - }; - } - this._features = {'dojo.data.api.Read':true, 'dojo.data.api.Identity':true}; - this._itemsByIdentity = null; - this._storeRefPropName = "_S"; // Default name for the store reference to attach to every item. - this._itemNumPropName = "_0"; // Default Item Id for isItem to attach to every item. - this._rootItemPropName = "_RI"; // Default Item Id for isItem to attach to every item. - this._reverseRefMap = "_RRM"; // Default attribute for constructing a reverse reference map for use with reference integrity - this._loadInProgress = false; //Got to track the initial load to prevent duelling loads of the dataset. - this._queuedFetches = []; - if(keywordParameters.urlPreventCache !== undefined){ - this.urlPreventCache = keywordParameters.urlPreventCache?true:false; - } - if(keywordParameters.hierarchical !== undefined){ - this.hierarchical = keywordParameters.hierarchical?true:false; - } - if(keywordParameters.clearOnClose){ - this.clearOnClose = true; - } - if("failOk" in keywordParameters){ - this.failOk = keywordParameters.failOk?true:false; + isTop: function(/*dijit._Widget*/ dialog){ + // summary: + // Returns true if specified Dialog is the top in the task + return ds[ds.length-1].dialog == dialog; } - }, - - url: "", // use "" rather than undefined for the benefit of the parser (#3539) + }; - //Internal var, crossCheckUrl. Used so that setting either url or _jsonFileUrl, can still trigger a reload - //when clearOnClose and close is used. - _ccUrl: "", + // 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(!kernel.isAsync){ + ready(0, function(){ + var requires = ["dijit/TooltipDialog"]; + require(requires); // use indirection so modules not rolled into a build + }); + } - data: null, // define this so that the parser can populate it + return Dialog; +}); - typeMap: null, //Define so parser can populate. - - //Parameter to allow users to specify if a close call should force a reload or not. - //By default, it retains the old behavior of not clearing if close is called. But - //if set true, the store will be reset to default state. Note that by doing this, - //all item handles will become invalid and a new fetch must be issued. - clearOnClose: false, +}, +'dijit/_base/focus':function(){ +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", + ".." // for exporting symbols to dijit +], function(array, dom, lang, topic, win, focus, dijit){ + + // module: + // dijit/_base/focus + // summary: + // Deprecated module to monitor currently focused node and stack of currently focused widgets. + // New code should access dijit/focus directly. - //Parameter to allow specifying if preventCache should be passed to the xhrGet call or not when loading data from a url. - //Note this does not mean the store calls the server on each fetch, only that the data load has preventCache set as an option. - //Added for tracker: #6072 - urlPreventCache: false, - - //Parameter for specifying that it is OK for the xhrGet call to fail silently. - failOk: false, + lang.mixin(dijit, { + // _curFocus: DomNode + // Currently focused item on screen + _curFocus: null, - //Parameter to indicate to process data from the url as hierarchical - //(data items can contain other data items in js form). Default is true - //for backwards compatibility. False means only root items are processed - //as items, all child objects outside of type-mapped objects and those in - //specific reference format, are left straight JS data objects. - hierarchical: true, + // _prevFocus: DomNode + // Previously focused item on screen + _prevFocus: null, - _assertIsItem: function(/* item */ item){ - // summary: - // This function tests whether the item passed in is indeed an item in the store. - // item: - // The item to test for being contained by the store. - if(!this.isItem(item)){ - throw new Error("dojo.data.ItemFileReadStore: Invalid item argument."); - } - }, + isCollapsed: function(){ + // summary: + // Returns true if there is no text selected + return dijit.getBookmark().isCollapsed; + }, - _assertIsAttribute: function(/* attribute-name-string */ attribute){ - // summary: - // This function tests whether the item passed in is indeed a valid 'attribute' like type for the store. - // attribute: - // The attribute to test for being contained by the store. - if(typeof attribute !== "string"){ - throw new Error("dojo.data.ItemFileReadStore: Invalid attribute argument."); - } - }, + 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 = {}; - getValue: function( /* item */ item, - /* attribute-name-string */ attribute, - /* value? */ defaultValue){ - // summary: - // See dojo.data.api.Read.getValue() - var values = this.getValues(item, attribute); - return (values.length > 0)?values[0]:defaultValue; // mixed - }, + //'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 + }, - getValues: function(/* item */ item, - /* attribute-name-string */ attribute){ - // summary: - // See dojo.data.api.Read.getValues() + 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(); + } + } + }, - this._assertIsItem(item); - this._assertIsAttribute(attribute); - // Clone it before returning. refs: #10474 - return (item[attribute] || []).slice(0); // Array - }, + 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._Widget or {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 + }, - getAttributes: function(/* item */ item){ - // summary: - // See dojo.data.api.Read.getAttributes() - this._assertIsItem(item); - var attributes = []; - for(var key in item){ - // Save off only the real item attributes, not the special id marks for O(1) isItem. - if((key !== this._storeRefPropName) && (key !== this._itemNumPropName) && (key !== this._rootItemPropName) && (key !== this._reverseRefMap)){ - attributes.push(key); - } - } - return attributes; // Array - }, + // _activeStack: dijit._Widget[] + // List of currently active widgets (focused widget and it's ancestors) + _activeStack: [], - hasAttribute: function( /* item */ item, - /* attribute-name-string */ attribute){ - // summary: - // See dojo.data.api.Read.hasAttribute() - this._assertIsItem(item); - this._assertIsAttribute(attribute); - return (attribute in item); - }, + 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); + }, - containsValue: function(/* item */ item, - /* attribute-name-string */ attribute, - /* anything */ value){ - // summary: - // See dojo.data.api.Read.containsValue() - var regexp = undefined; - if(typeof value === "string"){ - regexp = dojo.data.util.filter.patternToRegExp(value, false); - } - return this._containsValue(item, attribute, value, regexp); //boolean. - }, + 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() - _containsValue: function( /* item */ item, - /* attribute-name-string */ attribute, - /* anything */ value, - /* RegExp?*/ regexp){ - // summary: - // Internal function for looking at the values contained by the item. - // description: - // Internal function for looking at the values contained by the item. This - // function allows for denoting if the comparison should be case sensitive for - // strings or not (for handling filtering cases where string case should not matter) - // - // item: - // The data item to examine for attribute values. - // attribute: - // The attribute to inspect. - // value: - // The value to match. - // regexp: - // Optional regular expression generated off value if value was of string type to handle wildcarding. - // If present and attribute values are string, then it can be used for comparison instead of 'value' - return dojo.some(this.getValues(item, attribute), function(possibleValue){ - if(possibleValue !== null && !dojo.isObject(possibleValue) && regexp){ - if(possibleValue.toString().match(regexp)){ - return true; // Boolean - } - }else if(value === possibleValue){ - return true; // Boolean - } - }); - }, + handle && handle.remove(); + }, - isItem: function(/* anything */ something){ - // summary: - // See dojo.data.api.Read.isItem() - if(something && something[this._storeRefPropName] === this){ - if(this._arrayOfAllItems[something[this._itemNumPropName]] === something){ - return true; - } + 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(); } - return false; // Boolean - }, + }); - isItemLoaded: function(/* anything */ something){ - // summary: - // See dojo.data.api.Read.isItemLoaded() - return this.isItem(something); //boolean - }, + // 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 - loadItem: function(/* object */ keywordArgs){ - // summary: - // See dojo.data.api.Read.loadItem() - this._assertIsItem(keywordArgs.item); - }, + if(!handle){ return; } - getFeatures: function(){ - // summary: - // See dojo.data.api.Read.getFeatures() - return this._features; //Object - }, + 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; - getLabel: function(/* item */ item){ - // summary: - // See dojo.data.api.Read.getLabel() - if(this._labelAttr && this.isItem(item)){ - return this.getValue(item,this._labelAttr); //String + // 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); } - return undefined; //undefined - }, - getLabelAttributes: function(/* item */ item){ - // summary: - // See dojo.data.api.Read.getLabelAttributes() - if(this._labelAttr){ - return [this._labelAttr]; //array + // 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 */ + } } - return null; //null - }, + }; - _fetchItems: function( /* Object */ keywordArgs, - /* Function */ findCallback, - /* Function */ errorCallback){ - // summary: - // See dojo.data.util.simpleFetch.fetch() - var self = this, - filter = function(requestArgs, arrayOfItems){ - var items = [], - i, key; - if(requestArgs.query){ - var value, - ignoreCase = requestArgs.queryOptions ? requestArgs.queryOptions.ignoreCase : false; + // 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; + }); - //See if there are any string values that can be regexp parsed first to avoid multiple regexp gens on the - //same value for each item examined. Much more efficient. - var regexpList = {}; - for(key in requestArgs.query){ - value = requestArgs.query[key]; - if(typeof value === "string"){ - regexpList[key] = dojo.data.util.filter.patternToRegExp(value, ignoreCase); - }else if(value instanceof RegExp){ - regexpList[key] = value; - } - } - for(i = 0; i < arrayOfItems.length; ++i){ - var match = true; - var candidateItem = arrayOfItems[i]; - if(candidateItem === null){ - match = false; - }else{ - for(key in requestArgs.query){ - value = requestArgs.query[key]; - if(!self._containsValue(candidateItem, key, value, regexpList[key])){ - match = false; - } - } - } - if(match){ - items.push(candidateItem); - } - } - findCallback(items, requestArgs); - }else{ - // We want a copy to pass back in case the parent wishes to sort the array. - // We shouldn't allow resort of the internal list, so that multiple callers - // can get lists and sort without affecting each other. We also need to - // filter out any null values that have been left as a result of deleteItem() - // calls in ItemFileWriteStore. - for(i = 0; i < arrayOfItems.length; ++i){ - var item = arrayOfItems[i]; - if(item !== null){ - items.push(item); - } - } - findCallback(items, requestArgs); - } - }; + 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 + }); - if(this._loadFinished){ - filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions)); - }else{ - //Do a check on the JsonFileUrl and crosscheck it. - //If it doesn't match the cross-check, it needs to be updated - //This allows for either url or _jsonFileUrl to he changed to - //reset the store load location. Done this way for backwards - //compatibility. People use _jsonFileUrl (even though officially - //private. - if(this._jsonFileUrl !== this._ccUrl){ - dojo.deprecated("dojo.data.ItemFileReadStore: ", - "To change the url, set the url property of the store," + - " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0"); - this._ccUrl = this._jsonFileUrl; - this.url = this._jsonFileUrl; - }else if(this.url !== this._ccUrl){ - this._jsonFileUrl = this.url; - this._ccUrl = this.url; - } + return dijit; +}); - //See if there was any forced reset of data. - if(this.data != null){ - this._jsonData = this.data; - this.data = null; - } +}, +'dijit/tree/dndSource':function(){ +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` - if(this._jsonFileUrl){ - //If fetches come in before the loading has finished, but while - //a load is in progress, we have to defer the fetching to be - //invoked in the callback. - if(this._loadInProgress){ - this._queuedFetches.push({args: keywordArgs, filter: filter}); - }else{ - this._loadInProgress = true; - var getArgs = { - url: self._jsonFileUrl, - handleAs: "json-comment-optional", - preventCache: this.urlPreventCache, - failOk: this.failOk - }; - var getHandler = dojo.xhrGet(getArgs); - getHandler.addCallback(function(data){ - try{ - self._getItemsFromLoadedData(data); - self._loadFinished = true; - self._loadInProgress = false; - - filter(keywordArgs, self._getItemsArray(keywordArgs.queryOptions)); - self._handleQueuedFetches(); - }catch(e){ - self._loadFinished = true; - self._loadInProgress = false; - errorCallback(e, keywordArgs); - } - }); - getHandler.addErrback(function(error){ - self._loadInProgress = false; - errorCallback(error, keywordArgs); - }); +/*===== +dijit.tree.__SourceArgs = function(){ + // 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 + this.isSource = isSource; + this.accept = accept; + this.autoSync = autoSync; + this.copyOnly = copyOnly; + this.dragThreshold = dragThreshold; + this.betweenThreshold = betweenThreshold; +} +=====*/ - //Wire up the cancel to abort of the request - //This call cancel on the deferred if it hasn't been called - //yet and then will chain to the simple abort of the - //simpleFetch keywordArgs - var oldAbort = null; - if(keywordArgs.abort){ - oldAbort = keywordArgs.abort; - } - keywordArgs.abort = function(){ - var df = getHandler; - if(df && df.fired === -1){ - df.cancel(); - df = null; - } - if(oldAbort){ - oldAbort.call(keywordArgs); - } - }; - } - }else if(this._jsonData){ - try{ - this._loadFinished = true; - this._getItemsFromLoadedData(this._jsonData); - this._jsonData = null; - filter(keywordArgs, this._getItemsArray(keywordArgs.queryOptions)); - }catch(e){ - errorCallback(e, keywordArgs); - } - }else{ - errorCallback(new Error("dojo.data.ItemFileReadStore: No JSON source data was provided as either URL or a nested Javascript object."), keywordArgs); +return declare("dijit.tree.dndSource", _dndSelector, { + // summary: + // Handles drag and drop operations (as a source or a target) for `dijit.Tree` + + // isSource: [private] 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, + + constructor: function(/*dijit.Tree*/ tree, /*dijit.tree.__SourceArgs*/ params){ + // summary: + // a constructor of the Tree DnD Source + // tags: + // private + if(!params){ params = {}; } + lang.mixin(this, params); + this.isSource = typeof params.isSource == "undefined" ? true : params.isSource; + 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")) + ]; }, - _handleQueuedFetches: function(){ - // summary: - // Internal function to execute delayed request in the store. - //Execute any deferred fetches now. - if(this._queuedFetches.length > 0){ - for(var i = 0; i < this._queuedFetches.length; i++){ - var fData = this._queuedFetches[i], - delayedQuery = fData.args, - delayedFilter = fData.filter; - if(delayedFilter){ - delayedFilter(delayedQuery, this._getItemsArray(delayedQuery.queryOptions)); + // 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){ + // summary: + // Helper method for processing onmousemove/onmouseover events while drag is in progress. + // Keeps track of current drop target. + + 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(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 model = this.tree.model, + 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{ - this.fetchItemByIdentity(delayedQuery); + m.canDrop(false); } } - this._queuedFetches = []; + + this.targetAnchor = newTarget; + this.dropPosition = newDropPosition; } }, - _getItemsArray: function(/*object?*/queryOptions){ - // summary: - // Internal function to determine which list of items to search over. - // queryOptions: The query options parameter, if any. - if(queryOptions && queryOptions.deep){ - return this._arrayOfAllItems; + 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))); + } + } } - return this._arrayOfTopLevelItems; }, - close: function(/*dojo.data.api.Request || keywordArgs || null */ request){ - // summary: - // See dojo.data.api.Read.close() - if(this.clearOnClose && - this._loadFinished && - !this._loadInProgress){ - //Reset all internalsback to default state. This will force a reload - //on next fetch. This also checks that the data or url param was set - //so that the store knows it can get data. Without one of those being set, - //the next fetch will trigger an error. + 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: 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 + + // 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; + 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; + } + }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); + }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); + }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); + } + }, 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"); + } +}); + +}); + +}, +'dijit/a11y':function(){ +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/_base/sniff", // has("ie") + "./_base/manager", // manager._isElementShown + "." // for exporting methods to dijit namespace +], function(array, config, declare, dom, domAttr, domStyle, has, manager, dijit){ + + // module: + // dijit/a11y + // summary: + // Accessibility utility functions (keyboard, tab stops, etc.) + + 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") && child.scopeName !== "HTML") || !shown(child)){ + continue; + } + + if(isTabNavigable(child)){ + var tabindex = domAttr.get(child, "tabIndex"); + 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){ + // summary: + // Finds the descendant of the specified root node + // that is first in the tabbing order + var elems = dijit._getTabNavigable(dom.byId(root)); + return elems.lowest ? elems.lowest : elems.first; // DomNode + }; + + dijit.getLastInTabbingOrder = function(/*String|DOMNode*/ root){ + // summary: + // Finds the descendant of the specified root node + // that is last in the tabbing order + var elems = dijit._getTabNavigable(dom.byId(root)); + return elems.last ? elems.last : elems.highest; // DomNode + }; + + return { + hasDefaultTabStop: dijit.hasDefaultTabStop, + isTabNavigable: dijit.isTabNavigable, + _getTabNavigable: dijit._getTabNavigable, + getFirstInTabbingOrder: dijit.getFirstInTabbingOrder, + getLastInTabbingOrder: dijit.getLastInTabbingOrder + }; +}); + +}, +'dijit/form/_ToggleButtonMixin':function(){ +define("dijit/form/_ToggleButtonMixin", [ + "dojo/_base/declare", // declare + "dojo/dom-attr" // domAttr.set +], function(declare, domAttr){ + +// module: +// dijit/form/_ToggleButtonMixin +// summary: +// A mixin to provide functionality to allow a button that can be in two states (checked or not). + +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); + domAttr.set(this.focusNode || this.domNode, "checked", value); + (this.focusNode || this.domNode).setAttribute(this._aria_attr, value ? "true" : "false"); // 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); + } +}); + +}); + +}, +'dijit/_Widget':function(){ +define("dijit/_Widget", [ + "dojo/aspect", // aspect.around + "dojo/_base/config", // config.isDebug + "dojo/_base/connect", // connect.connect + "dojo/_base/declare", // declare + "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, kernel, lang, query, ready, + registry, _WidgetBase, _OnDijitClickMixin, _FocusMixin){ + +/*===== + var _WidgetBase = dijit._WidgetBase; + var _OnDijitClickMixin = dijit._OnDijitClickMixin; + var _FocusMixin = dijit._FocusMixin; +=====*/ + + +// module: +// dijit/_Widget +// summary: +// Old base for widgets. New widgets should extend _WidgetBase instead + + +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: + // Base class for all 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 id 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){ + // 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*/ type, /*Function*/ func){ + if(this[this._onMap(type)] === connectToDomNode){ + // Use connect.connect() rather than on() to get handling for "onmouseenter" on non-IE, etc. + // Also, need to specify context as "this" rather than the default context of the DOMNode + 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._Widget[] + }, + + ////////////////// 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(!kernel.isAsync){ + ready(0, function(){ + var requires = ["dijit/_base"]; + require(requires); // use indirection so modules not rolled into a build + }); +} +return _Widget; +}); + +}, +'dojo/touch':function(){ +define("dojo/touch", ["./_base/kernel", "./on", "./has", "./mouse"], function(dojo, on, has, mouse){ +// module: +// dojo/touch + +/*===== + dojo.touch = { + // summary: + // This module provides unified touch event handlers by exporting + // press, move, release and cancel which can also run well on desktop. + // Based on http://dvcs.w3.org/hg/webevents/raw-file/tip/touchevents.html + // + // example: + // 1. Used with dojo.connect() + // | dojo.connect(node, dojo.touch.press, function(e){}); + // | dojo.connect(node, dojo.touch.move, function(e){}); + // | dojo.connect(node, dojo.touch.release, function(e){}); + // | dojo.connect(node, dojo.touch.cancel, function(e){}); + // + // 2. Used with dojo.on + // | define(["dojo/on", "dojo/touch"], function(on, touch){ + // | on(node, touch.press, function(e){}); + // | on(node, touch.move, function(e){}); + // | on(node, touch.release, function(e){}); + // | on(node, touch.cancel, function(e){}); + // + // 3. Used with dojo.touch.* directly + // | dojo.touch.press(node, function(e){}); + // | dojo.touch.move(node, function(e){}); + // | dojo.touch.release(node, function(e){}); + // | dojo.touch.cancel(node, function(e){}); + + press: function(node, listener){ + // summary: + // Register a listener to 'touchstart'|'mousedown' for the given node + // node: Dom + // Target node to listen to + // listener: Function + // Callback function + // returns: + // A handle which will be used to remove the listener by handle.remove() + }, + move: function(node, listener){ + // summary: + // Register a listener to 'touchmove'|'mousemove' for the given node + // node: Dom + // Target node to listen to + // listener: Function + // Callback function + // returns: + // A handle which will be used to remove the listener by handle.remove() + }, + release: function(node, listener){ + // summary: + // Register a listener to 'touchend'|'mouseup' for the given node + // node: Dom + // Target node to listen to + // listener: Function + // Callback function + // returns: + // A handle which will be used to remove the listener by handle.remove() + }, + cancel: function(node, listener){ + // summary: + // Register a listener to 'touchcancel'|'mouseleave' for the given node + // node: Dom + // Target node to listen to + // listener: Function + // Callback function + // returns: + // A handle which will be used to remove the listener by handle.remove() + } + }; +=====*/ + + function _handle(/*String - press | move | release | cancel*/type){ + return function(node, listener){//called by on(), see dojo.on + return on(node, type, listener); + }; + } + var touch = has("touch"); + //device neutral events - dojo.touch.press|move|release|cancel + dojo.touch = { + press: _handle(touch ? "touchstart": "mousedown"), + move: _handle(touch ? "touchmove": "mousemove"), + release: _handle(touch ? "touchend": "mouseup"), + cancel: touch ? _handle("touchcancel") : mouse.leave + }; + return dojo.touch; +}); +}, +'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=\"combobox\" aria-haspopup=\"true\"\n\t><tbody role=\"presentation\"><tr role=\"presentation\"\n\t\t><td class=\"dijitReset dijitStretch dijitButtonContents dijitButtonNode\" role=\"presentation\"\n\t\t\t><span class=\"dijitReset dijitInline dijitButtonText\" data-dojo-attach-point=\"containerNode,_popupStateNode\"></span\n\t\t\t><input type=\"hidden\" ${!nameAttrSetting} data-dojo-attach-point=\"valueNode\" value=\"${value}\" aria-hidden=\"true\"\n\t\t/></td><td class=\"dijitReset dijitRight dijitButtonNode dijitArrowButton dijitDownArrowButton\"\n\t\t\t\tdata-dojo-attach-point=\"titleNode\" role=\"presentation\"\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></tr></tbody\n></table>\n", +'dojo/fx':function(){ +define("dojo/fx", [ + "./_base/lang", + "./Evented", + "./_base/kernel", + "./_base/array", + "./_base/connect", + "./_base/fx", + "./dom", + "./dom-style", + "./dom-geometry", + "./ready", + "require" // for context sensitive loading of Toggler +], function(lang, Evented, dojo, arrayUtil, connect, baseFx, dom, domStyle, geom, ready, require) { + + // module: + // dojo/fx + // summary: + // TODOC + + + /*===== + dojo.fx = { + // summary: Effects library on top of Base animations + }; + var coreFx = dojo.fx; + =====*/ + +// For back-compat, remove in 2.0. +if(!dojo.isAsync){ + ready(0, function(){ + var requires = ["./fx/Toggler"]; + require(requires); // use indirection so modules not rolled into a build + }); +} + + var coreFx = dojo.fx = {}; + + var _baseObj = { + _fire: function(evt, args){ + if(this[evt]){ + this[evt].apply(this, args||[]); + } + return this; + } + }; + + var _chain = function(animations){ + this._index = -1; + this._animations = animations||[]; + this._current = this._onAnimateCtx = this._onEndCtx = null; + + this.duration = 0; + arrayUtil.forEach(this._animations, function(a){ + this.duration += a.duration; + if(a.delay){ this.duration += a.delay; } + }, this); + }; + _chain.prototype = new Evented(); + lang.extend(_chain, { + _onAnimate: function(){ + this._fire("onAnimate", arguments); + }, + _onEnd: function(){ + connect.disconnect(this._onAnimateCtx); + connect.disconnect(this._onEndCtx); + this._onAnimateCtx = this._onEndCtx = null; + if(this._index + 1 == this._animations.length){ + this._fire("onEnd"); + }else{ + // switch animations + this._current = this._animations[++this._index]; + this._onAnimateCtx = connect.connect(this._current, "onAnimate", this, "_onAnimate"); + this._onEndCtx = connect.connect(this._current, "onEnd", this, "_onEnd"); + this._current.play(0, true); + } + }, + play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){ + if(!this._current){ this._current = this._animations[this._index = 0]; } + if(!gotoStart && this._current.status() == "playing"){ return this; } + var beforeBegin = connect.connect(this._current, "beforeBegin", this, function(){ + this._fire("beforeBegin"); + }), + onBegin = connect.connect(this._current, "onBegin", this, function(arg){ + this._fire("onBegin", arguments); + }), + onPlay = connect.connect(this._current, "onPlay", this, function(arg){ + this._fire("onPlay", arguments); + connect.disconnect(beforeBegin); + connect.disconnect(onBegin); + connect.disconnect(onPlay); + }); + if(this._onAnimateCtx){ + connect.disconnect(this._onAnimateCtx); + } + this._onAnimateCtx = connect.connect(this._current, "onAnimate", this, "_onAnimate"); + if(this._onEndCtx){ + connect.disconnect(this._onEndCtx); + } + this._onEndCtx = connect.connect(this._current, "onEnd", this, "_onEnd"); + this._current.play.apply(this._current, arguments); + return this; + }, + pause: function(){ + if(this._current){ + var e = connect.connect(this._current, "onPause", this, function(arg){ + this._fire("onPause", arguments); + connect.disconnect(e); + }); + this._current.pause(); + } + return this; + }, + gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){ + this.pause(); + var offset = this.duration * percent; + this._current = null; + arrayUtil.some(this._animations, function(a){ + if(a.duration <= offset){ + this._current = a; + return true; + } + offset -= a.duration; + return false; + }); + if(this._current){ + this._current.gotoPercent(offset / this._current.duration, andPlay); + } + return this; + }, + stop: function(/*boolean?*/ gotoEnd){ + if(this._current){ + if(gotoEnd){ + for(; this._index + 1 < this._animations.length; ++this._index){ + this._animations[this._index].stop(true); + } + this._current = this._animations[this._index]; + } + var e = connect.connect(this._current, "onStop", this, function(arg){ + this._fire("onStop", arguments); + connect.disconnect(e); + }); + this._current.stop(); + } + return this; + }, + status: function(){ + return this._current ? this._current.status() : "stopped"; + }, + destroy: function(){ + if(this._onAnimateCtx){ connect.disconnect(this._onAnimateCtx); } + if(this._onEndCtx){ connect.disconnect(this._onEndCtx); } + } + }); + lang.extend(_chain, _baseObj); + + coreFx.chain = /*===== dojo.fx.chain = =====*/ function(/*dojo.Animation[]*/ animations){ + // summary: + // Chain a list of `dojo.Animation`s to run in sequence + // + // description: + // Return a `dojo.Animation` which will play all passed + // `dojo.Animation` instances in sequence, firing its own + // synthesized events simulating a single animation. (eg: + // onEnd of this animation means the end of the chain, + // not the individual animations within) + // + // example: + // Once `node` is faded out, fade in `otherNode` + // | dojo.fx.chain([ + // | dojo.fadeIn({ node:node }), + // | dojo.fadeOut({ node:otherNode }) + // | ]).play(); + // + return new _chain(animations); // dojo.Animation + }; + + var _combine = function(animations){ + this._animations = animations||[]; + this._connects = []; + this._finished = 0; + + this.duration = 0; + arrayUtil.forEach(animations, function(a){ + var duration = a.duration; + if(a.delay){ duration += a.delay; } + if(this.duration < duration){ this.duration = duration; } + this._connects.push(connect.connect(a, "onEnd", this, "_onEnd")); + }, this); + + this._pseudoAnimation = new baseFx.Animation({curve: [0, 1], duration: this.duration}); + var self = this; + arrayUtil.forEach(["beforeBegin", "onBegin", "onPlay", "onAnimate", "onPause", "onStop", "onEnd"], + function(evt){ + self._connects.push(connect.connect(self._pseudoAnimation, evt, + function(){ self._fire(evt, arguments); } + )); + } + ); + }; + lang.extend(_combine, { + _doAction: function(action, args){ + arrayUtil.forEach(this._animations, function(a){ + a[action].apply(a, args); + }); + return this; + }, + _onEnd: function(){ + if(++this._finished > this._animations.length){ + this._fire("onEnd"); + } + }, + _call: function(action, args){ + var t = this._pseudoAnimation; + t[action].apply(t, args); + }, + play: function(/*int?*/ delay, /*Boolean?*/ gotoStart){ + this._finished = 0; + this._doAction("play", arguments); + this._call("play", arguments); + return this; + }, + pause: function(){ + this._doAction("pause", arguments); + this._call("pause", arguments); + return this; + }, + gotoPercent: function(/*Decimal*/percent, /*Boolean?*/ andPlay){ + var ms = this.duration * percent; + arrayUtil.forEach(this._animations, function(a){ + a.gotoPercent(a.duration < ms ? 1 : (ms / a.duration), andPlay); + }); + this._call("gotoPercent", arguments); + return this; + }, + stop: function(/*boolean?*/ gotoEnd){ + this._doAction("stop", arguments); + this._call("stop", arguments); + return this; + }, + status: function(){ + return this._pseudoAnimation.status(); + }, + destroy: function(){ + arrayUtil.forEach(this._connects, connect.disconnect); + } + }); + lang.extend(_combine, _baseObj); + + coreFx.combine = /*===== dojo.fx.combine = =====*/ function(/*dojo.Animation[]*/ animations){ + // summary: + // Combine a list of `dojo.Animation`s to run in parallel + // + // description: + // Combine an array of `dojo.Animation`s to run in parallel, + // providing a new `dojo.Animation` instance encompasing each + // animation, firing standard animation events. + // + // example: + // Fade out `node` while fading in `otherNode` simultaneously + // | dojo.fx.combine([ + // | dojo.fadeIn({ node:node }), + // | dojo.fadeOut({ node:otherNode }) + // | ]).play(); + // + // example: + // When the longest animation ends, execute a function: + // | var anim = dojo.fx.combine([ + // | dojo.fadeIn({ node: n, duration:700 }), + // | dojo.fadeOut({ node: otherNode, duration: 300 }) + // | ]); + // | dojo.connect(anim, "onEnd", function(){ + // | // overall animation is done. + // | }); + // | anim.play(); // play the animation + // + return new _combine(animations); // dojo.Animation + }; + + coreFx.wipeIn = /*===== dojo.fx.wipeIn = =====*/ function(/*Object*/ args){ + // summary: + // Expand a node to it's natural height. + // + // description: + // Returns an animation that will expand the + // node defined in 'args' object from it's current height to + // it's natural height (with no scrollbar). + // Node must have no margin/border/padding. + // + // args: Object + // A hash-map of standard `dojo.Animation` constructor properties + // (such as easing: node: duration: and so on) + // + // example: + // | dojo.fx.wipeIn({ + // | node:"someId" + // | }).play() + var node = args.node = dom.byId(args.node), s = node.style, o; + + var anim = baseFx.animateProperty(lang.mixin({ + properties: { + height: { + // wrapped in functions so we wait till the last second to query (in case value has changed) + start: function(){ + // start at current [computed] height, but use 1px rather than 0 + // because 0 causes IE to display the whole panel + o = s.overflow; + s.overflow = "hidden"; + if(s.visibility == "hidden" || s.display == "none"){ + s.height = "1px"; + s.display = ""; + s.visibility = ""; + return 1; + }else{ + var height = domStyle.get(node, "height"); + return Math.max(height, 1); + } + }, + end: function(){ + return node.scrollHeight; + } + } + } + }, args)); + + var fini = function(){ + s.height = "auto"; + s.overflow = o; + }; + connect.connect(anim, "onStop", fini); + connect.connect(anim, "onEnd", fini); + + return anim; // dojo.Animation + }; + + coreFx.wipeOut = /*===== dojo.fx.wipeOut = =====*/ function(/*Object*/ args){ + // summary: + // Shrink a node to nothing and hide it. + // + // description: + // Returns an animation that will shrink node defined in "args" + // from it's current height to 1px, and then hide it. + // + // args: Object + // A hash-map of standard `dojo.Animation` constructor properties + // (such as easing: node: duration: and so on) + // + // example: + // | dojo.fx.wipeOut({ node:"someId" }).play() + + var node = args.node = dom.byId(args.node), s = node.style, o; + + var anim = baseFx.animateProperty(lang.mixin({ + properties: { + height: { + end: 1 // 0 causes IE to display the whole panel + } + } + }, args)); + + connect.connect(anim, "beforeBegin", function(){ + o = s.overflow; + s.overflow = "hidden"; + s.display = ""; + }); + var fini = function(){ + s.overflow = o; + s.height = "auto"; + s.display = "none"; + }; + connect.connect(anim, "onStop", fini); + connect.connect(anim, "onEnd", fini); + + return anim; // dojo.Animation + }; + + coreFx.slideTo = /*===== dojo.fx.slideTo = =====*/ function(/*Object*/ args){ + // summary: + // Slide a node to a new top/left position + // + // description: + // Returns an animation that will slide "node" + // defined in args Object from its current position to + // the position defined by (args.left, args.top). + // + // args: Object + // A hash-map of standard `dojo.Animation` constructor properties + // (such as easing: node: duration: and so on). Special args members + // are `top` and `left`, which indicate the new position to slide to. + // + // example: + // | .slideTo({ node: node, left:"40", top:"50", units:"px" }).play() + + var node = args.node = dom.byId(args.node), + top = null, left = null; + + var init = (function(n){ + return function(){ + var cs = domStyle.getComputedStyle(n); + var pos = cs.position; + top = (pos == 'absolute' ? n.offsetTop : parseInt(cs.top) || 0); + left = (pos == 'absolute' ? n.offsetLeft : parseInt(cs.left) || 0); + if(pos != 'absolute' && pos != 'relative'){ + var ret = geom.position(n, true); + top = ret.y; + left = ret.x; + n.style.position="absolute"; + n.style.top=top+"px"; + n.style.left=left+"px"; + } + }; + })(node); + init(); + + var anim = baseFx.animateProperty(lang.mixin({ + properties: { + top: args.top || 0, + left: args.left || 0 + } + }, args)); + connect.connect(anim, "beforeBegin", anim, init); + + return anim; // dojo.Animation + }; + + return coreFx; +}); + +}, +'dijit/_DialogMixin':function(){ +define("dijit/_DialogMixin", [ + "dojo/_base/declare", // declare + "./a11y" // _getTabNavigable +], function(declare, a11y){ + + // module: + // dijit/_DialogMixin + // summary: + // _DialogMixin provides functions useful to Dialog and TooltipDialog + + 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; + } + }); +}); + +}, +'dijit/Tree':function(){ +require({cache:{ +'url:dijit/templates/TreeNode.html':"<div class=\"dijitTreeNode\" role=\"presentation\"\n\t><div data-dojo-attach-point=\"rowNode\" class=\"dijitTreeRow\" role=\"presentation\" data-dojo-attach-event=\"onmouseenter:_onMouseEnter, onmouseleave:_onMouseLeave, onclick:_onClick, ondblclick:_onDblClick\"\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\" data-dojo-attach-event=\"onfocus:_onLabelFocus\"></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\tdata-dojo-attach-event=\"onkeypress:_onKeyPress\">\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/_base/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/fx", // fxUtils.wipeIn fxUtils.wipeOut + "dojo/_base/kernel", // kernel.deprecated + "dojo/keys", // arrows etc. + "dojo/_base/lang", // lang.getObject lang.mixin lang.hitch + "dojo/topic", + "./focus", + "./registry", // registry.getEnclosingWidget(), manager.defaultDuration + "./_base/manager", // manager.getEnclosingWidget(), 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, fxUtils, kernel, keys, lang, topic, + focus, registry, manager, _Widget, _TemplatedMixin, _Container, _Contained, _CssStateMixin, + treeNodeTemplate, treeTemplate, TreeStoreModel, ForestStoreModel, _dndSelector){ + +/*===== + var _Widget = dijit._Widget; + var _TemplatedMixin = dijit._TemplatedMixin; + var _CssStateMixin = dijit._CssStateMixin; + var _Container = dijit._Container; + var _Contained = dijit._Contained; +=====*/ + +// module: +// dijit/Tree +// summary: +// dijit.Tree widget, and internal dijit._TreeNode widget + + +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", + labelNode: "dijitTreeLabel" + }, + + // 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"); + domStyle.set(this.rowNode, 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"); + }, + + _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.Deferred + } + + // cancel in progress collapse operation + this._wipeOut && this._wipeOut.stop(); + + // 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.domNode.setAttribute("aria-expanded", "true"); + } + + var def, + wipeIn = fxUtils.wipeIn({ + node: this.containerNode, duration: manager.defaultDuration, + onEnd: function(){ + def.callback(true); + } + }); + + // Deferred that fires when expand is complete + def = (this._expandDeferred = new Deferred(function(){ + // Canceller + wipeIn.stop(); + })); + + wipeIn.play(); + + return def; // dojo.Deferred + }, + + collapse: function(){ + // summary: + // Collapse this node (if it's expanded) + + if(!this.isExpanded){ return; } + + // 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.domNode.setAttribute("aria-expanded", "false"); + } + domClass.remove(this.contentNode,'dijitTreeContentExpanded'); + this._setExpando(); + this._updateItemClasses(this.item); + + if(!this._wipeOut){ + this._wipeOut = fxUtils.wipeOut({ + node: this.containerNode, duration: manager.defaultDuration + }); + } + this._wipeOut.play(); + }, + + // 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. + array.forEach(this.getChildren(), function(child){ + _Container.prototype.removeChild.call(this, child); + }, this); + + 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){ + 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), + 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"); + } + } + + return new DeferredList(defs); // dojo.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); + }, + + _onLabelFocus: function(){ + // summary: + // Called when this row is focused (possibly programatically) + // Note that we aren't using _onFocus() builtin to dijit + // because it's called when focus is moved to a descendant TreeNode. + // tags: + // private + this.tree._onNodeFocus(this); + }, + + 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); + 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). - if(((this._jsonFileUrl == "" || this._jsonFileUrl == null) && - (this.url == "" || this.url == null) - ) && this.data == null){ - console.debug("dojo.data.ItemFileReadStore: WARNING! Data reload " + - " information has not been provided." + - " Please set 'url' or 'data' to the appropriate value before" + - " the next fetch"); - } - this._arrayOfAllItems = []; - this._arrayOfTopLevelItems = []; - this._loadFinished = false; - this._itemsByIdentity = null; - this._loadInProgress = false; - this._queuedFetches = []; - } + this.labelNode.setAttribute("tabIndex", selected ? "0" : "-1"); }, - _getItemsFromLoadedData: function(/* Object */ dataObject){ - // summary: - // Function to parse the loaded data into item format and build the internal items array. - // description: - // Function to parse the loaded data into item format and build the internal items array. - // - // dataObject: - // The JS data object containing the raw data to convery into item format. - // - // returns: array - // Array of items in store item format. - - // First, we define a couple little utility functions... - var addingArrays = false, - self = this; - - function valueIsAnItem(/* anything */ aValue){ - // summary: - // Given any sort of value that could be in the raw json data, - // return true if we should interpret the value as being an - // item itself, rather than a literal value or a reference. - // example: - // | false == valueIsAnItem("Kermit"); - // | false == valueIsAnItem(42); - // | false == valueIsAnItem(new Date()); - // | false == valueIsAnItem({_type:'Date', _value:'1802-05-14'}); - // | false == valueIsAnItem({_reference:'Kermit'}); - // | true == valueIsAnItem({name:'Kermit', color:'green'}); - // | true == valueIsAnItem({iggy:'pop'}); - // | true == valueIsAnItem({foo:42}); - var isItem = ( - (aValue !== null) && - (typeof aValue === "object") && - (!dojo.isArray(aValue) || addingArrays) && - (!dojo.isFunction(aValue)) && - (aValue.constructor == Object || dojo.isArray(aValue)) && - (typeof aValue._reference === "undefined") && - (typeof aValue._type === "undefined") && - (typeof aValue._value === "undefined") && - self.hierarchical - ); - return isItem; + _onClick: function(evt){ + // summary: + // Handler for onclick event on a node + // tags: + // private + this.tree._onClick(this, evt); + }, + _onDblClick: function(evt){ + // summary: + // Handler for ondblclick event on a node + // tags: + // private + this.tree._onDblClick(this, evt); + }, + + _onMouseEnter: function(evt){ + // summary: + // Handler for onmouseenter event on a node + // tags: + // private + this.tree._onNodeMouseEnter(this, evt); + }, + + _onMouseLeave: function(evt){ + // summary: + // Handler for onmouseenter event on a node + // tags: + // private + this.tree._onNodeMouseLeave(this, evt); + }, + + _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 ofwaiting 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: 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[] + // 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 [{}]; + }, + =====*/ + itemCreator: null, + + // 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 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; // 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; } - - function addItemAndSubItemsToArrayOfAllItems(/* Item */ anItem){ - self._arrayOfAllItems.push(anItem); - for(var attribute in anItem){ - var valueForAttribute = anItem[attribute]; - if(valueForAttribute){ - if(dojo.isArray(valueForAttribute)){ - var valueArray = valueForAttribute; - for(var k = 0; k < valueArray.length; ++k){ - var singleValue = valueArray[k]; - if(valueIsAnItem(singleValue)){ - addItemAndSubItemsToArrayOfAllItems(singleValue); - } - } - }else{ - if(valueIsAnItem(valueForAttribute)){ - addItemAndSubItemsToArrayOfAllItems(valueForAttribute); - } - } - } - } + + this._itemNodesMap={}; + + if(!this.cookieName && this.id){ + this.cookieName = this.id + "SaveStateCookie"; } - this._labelAttr = dataObject.label; + this._loadDeferred = new Deferred(); - // We need to do some transformations to convert the data structure - // that we read from the file into a format that will be convenient - // to work with in memory. + this.inherited(arguments); + }, - // Step 1: Walk through the object hierarchy and build a list of all items - var i, - item; - this._arrayOfAllItems = []; - this._arrayOfTopLevelItems = dataObject.items; + postCreate: function(){ + this._initState(); - for(i = 0; i < this._arrayOfTopLevelItems.length; ++i){ - item = this._arrayOfTopLevelItems[i]; - if(dojo.isArray(item)){ - addingArrays = true; - } - addItemAndSubItemsToArrayOfAllItems(item); - item[this._rootItemPropName]=true; + // Create glue between store and Tree, if not specified directly by user + if(!this.model){ + this._store2model(); } - // Step 2: Walk through all the attribute values of all the items, - // and replace single values with arrays. For example, we change this: - // { name:'Miss Piggy', pets:'Foo-Foo'} - // into this: - // { name:['Miss Piggy'], pets:['Foo-Foo']} - // - // We also store the attribute names so we can validate our store - // reference and item id special properties for the O(1) isItem - var allAttributeNames = {}, - key; + // monitor changes to items + this.connect(this.model, "onChange", "_onItemChange"); + this.connect(this.model, "onChildrenChange", "_onItemChildrenChange"); + this.connect(this.model, "onDelete", "_onItemDelete"); - for(i = 0; i < this._arrayOfAllItems.length; ++i){ - item = this._arrayOfAllItems[i]; - for(key in item){ - if(key !== this._rootItemPropName){ - var value = item[key]; - if(value !== null){ - if(!dojo.isArray(value)){ - item[key] = [value]; - } - }else{ - item[key] = [null]; - } + this._load(); + + 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]]; } - allAttributeNames[key]=key; } + this.dndController = new this.dndController(this, params); } + }, - // Step 3: Build unique property names to use for the _storeRefPropName and _itemNumPropName - // This should go really fast, it will generally never even run the loop. - while(allAttributeNames[this._storeRefPropName]){ - this._storeRefPropName += "_"; + _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"); } - while(allAttributeNames[this._itemNumPropName]){ - this._itemNumPropName += "_"; + + 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); + }); } - while(allAttributeNames[this._reverseRefMap]){ - this._reverseRefMap += "_"; + 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"); + + rn.labelNode.setAttribute("role", "presentation"); + rn.containerNode.setAttribute("role", "tree"); + } + 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 then fire onLoad() event + this._expandNode(rn).addCallback(lang.hitch(this, function(){ + this._loadDeferred.callback(true); + this.onLoad(); + })); + }), + 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; + this._loadDeferred.addCallback( 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", []); } + }, - // Step 4: Some data files specify an optional 'identifier', which is - // the name of an attribute that holds the identity of each item. - // If this data file specified an identifier attribute, then build a - // hash table of items keyed by the identity of the items. - var arrayOfValues; + _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; - var identifier = dataObject.identifier; - if(identifier){ - this._itemsByIdentity = {}; - this._features['dojo.data.api.Identity'] = identifier; - for(i = 0; i < this._arrayOfAllItems.length; ++i){ - item = this._arrayOfAllItems[i]; - arrayOfValues = item[identifier]; - var identity = arrayOfValues[0]; - if(!Object.hasOwnProperty.call(this._itemsByIdentity, identity)){ - this._itemsByIdentity[identity] = item; + // We may need to wait for some nodes to expand, so setting + // each path will involve a Deferred. We bring those deferreds + // together witha 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. + tree._loadDeferred.addCallback(function(){ selectPath(path, [tree.rootNode], d); }); + }else{ + d.errback("Empty path"); + } + return d; + })).addCallback(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).addCallback(function(){ selectPath(path, nextNode.getChildren(), def); }); }else{ - if(this._jsonFileUrl){ - throw new Error("dojo.data.ItemFileReadStore: The json data as specified by: [" + this._jsonFileUrl + "] is malformed. Items within the list have identifier: [" + identifier + "]. Value collided: [" + identity + "]"); - }else if(this._jsonData){ - throw new Error("dojo.data.ItemFileReadStore: The json data provided by the creation arguments is malformed. Items within the list have identifier: [" + identifier + "]. Value collided: [" + identity + "]"); - } + //Successfully reached the end of this path + def.callback(nextNode); } + }else{ + def.errback("Could not expand path at " + nextPath); } - }else{ - this._features['dojo.data.api.Identity'] = Number; } - // Step 5: Walk through all the items, and set each item's properties - // for _storeRefPropName and _itemNumPropName, so that store.isItem() will return true. - for(i = 0; i < this._arrayOfAllItems.length; ++i){ - item = this._arrayOfAllItems[i]; - item[this._storeRefPropName] = this; - item[this._itemNumPropName] = i; + 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];})); } + }, - // Step 6: We walk through all the attribute values of all the items, - // looking for type/value literals and item-references. - // - // We replace item-references with pointers to items. For example, we change: - // { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] } - // into this: - // { name:['Kermit'], friends:[miss_piggy] } - // (where miss_piggy is the object representing the 'Miss Piggy' item). + _setSelectedNodeAttr: function(node){ + this.set('selectedNodes', [node]); + }, + _setSelectedNodesAttr: function(nodes){ + this._loadDeferred.addCallback( lang.hitch(this, function(){ + this.dndController.setSelection(nodes); + })); + }, + + + ////////////// 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. // - // We replace type/value pairs with typed-literals. For example, we change: - // { name:['Nelson Mandela'], born:[{_type:'Date', _value:'1918-07-18'}] } - // into this: - // { name:['Kermit'], born:(new Date(1918, 6, 18)) } + // 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. // - // We also generate the associate map for all items for the O(1) isItem function. - for(i = 0; i < this._arrayOfAllItems.length; ++i){ - item = this._arrayOfAllItems[i]; // example: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] } - for(key in item){ - arrayOfValues = item[key]; // example: [{_reference:{name:'Miss Piggy'}}] - for(var j = 0; j < arrayOfValues.length; ++j){ - value = arrayOfValues[j]; // example: {_reference:{name:'Miss Piggy'}} - if(value !== null && typeof value == "object"){ - if(("_type" in value) && ("_value" in value)){ - var type = value._type; // examples: 'Date', 'Color', or 'ComplexNumber' - var mappingObj = this._datatypeMap[type]; // examples: Date, dojo.Color, foo.math.ComplexNumber, {type: dojo.Color, deserialize(value){ return new dojo.Color(value)}} - if(!mappingObj){ - throw new Error("dojo.data.ItemFileReadStore: in the typeMap constructor arg, no object class was specified for the datatype '" + type + "'"); - }else if(dojo.isFunction(mappingObj)){ - arrayOfValues[j] = new mappingObj(value._value); - }else if(dojo.isFunction(mappingObj.deserialize)){ - arrayOfValues[j] = mappingObj.deserialize(value._value); - }else{ - throw new Error("dojo.data.ItemFileReadStore: Value provided in typeMap was neither a constructor, nor a an object with a deserialize function"); - } - } - if(value._reference){ - var referenceDescription = value._reference; // example: {name:'Miss Piggy'} - if(!dojo.isObject(referenceDescription)){ - // example: 'Miss Piggy' - // from an item like: { name:['Kermit'], friends:[{_reference:'Miss Piggy'}]} - arrayOfValues[j] = this._getItemByIdentity(referenceDescription); - }else{ - // example: {name:'Miss Piggy'} - // from an item like: { name:['Kermit'], friends:[{_reference:{name:'Miss Piggy'}}] } - for(var k = 0; k < this._arrayOfAllItems.length; ++k){ - var candidateItem = this._arrayOfAllItems[k], - found = true; - for(var refKey in referenceDescription){ - if(candidateItem[refKey] != referenceDescription[refKey]){ - found = false; - } - } - if(found){ - arrayOfValues[j] = candidateItem; - } - } - } - if(this.referenceIntegrity){ - var refItem = arrayOfValues[j]; - if(this.isItem(refItem)){ - this._addReferenceToMap(refItem, item, key); - } - } - }else if(this.isItem(value)){ - //It's a child item (not one referenced through _reference). - //We need to treat this as a referenced item, so it can be cleaned up - //in a write store easily. - if(this.referenceIntegrity){ - this._addReferenceToMap(value, item, key); - } - } - } - } - } - } + // Overridable function that return array of child items of given parent item, + // or if parentItem==null then return top items in tree + // tags: + // deprecated }, - _addReferenceToMap: function(/*item*/ refItem, /*item*/ parentItem, /*string*/ attribute){ - // summary: - // Method to add an reference map entry for an item and attribute. - // description: - // Method to add an reference map entry for an item and attribute. // - // refItem: - // The item that is referenced. - // parentItem: - // The item that holds the new reference to refItem. - // attribute: - // The attribute on parentItem that contains the new reference. - - //Stub function, does nothing. Real processing is in ItemFileWriteStore. + /////////////////////////////////////////////////////// + // 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 }, - getIdentity: function(/* item */ item){ - // summary: - // See dojo.data.api.Identity.getIdentity() - var identifier = this._features['dojo.data.api.Identity']; - if(identifier === Number){ - return item[this._itemNumPropName]; // Number - }else{ - var arrayOfValues = item[identifier]; - if(arrayOfValues){ - return arrayOfValues[0]; // Object || String - } - } - return null; // null + 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" }, - fetchItemByIdentity: function(/* Object */ keywordArgs){ - // summary: - // See dojo.data.api.Identity.fetchItemByIdentity() + 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 + }, - // Hasn't loaded yet, we have to trigger the load. - var item, - scope; - if(!this._loadFinished){ - var self = this; - //Do a check on the JsonFileUrl and crosscheck it. - //If it doesn't match the cross-check, it needs to be updated - //This allows for either url or _jsonFileUrl to he changed to - //reset the store load location. Done this way for backwards - //compatibility. People use _jsonFileUrl (even though officially - //private. - if(this._jsonFileUrl !== this._ccUrl){ - dojo.deprecated("dojo.data.ItemFileReadStore: ", - "To change the url, set the url property of the store," + - " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0"); - this._ccUrl = this._jsonFileUrl; - this.url = this._jsonFileUrl; - }else if(this.url !== this._ccUrl){ - this._jsonFileUrl = this.url; - this._ccUrl = this.url; - } - - //See if there was any forced reset of data. - if(this.data != null && this._jsonData == null){ - this._jsonData = this.data; - this.data = null; - } + 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 + }, - if(this._jsonFileUrl){ + 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 + }, - if(this._loadInProgress){ - this._queuedFetches.push({args: keywordArgs}); - }else{ - this._loadInProgress = true; - var getArgs = { - url: self._jsonFileUrl, - handleAs: "json-comment-optional", - preventCache: this.urlPreventCache, - failOk: this.failOk - }; - var getHandler = dojo.xhrGet(getArgs); - getHandler.addCallback(function(data){ - var scope = keywordArgs.scope?keywordArgs.scope:dojo.global; - try{ - self._getItemsFromLoadedData(data); - self._loadFinished = true; - self._loadInProgress = false; - item = self._getItemByIdentity(keywordArgs.identity); - if(keywordArgs.onItem){ - keywordArgs.onItem.call(scope, item); - } - self._handleQueuedFetches(); - }catch(error){ - self._loadInProgress = false; - if(keywordArgs.onError){ - keywordArgs.onError.call(scope, error); - } - } - }); - getHandler.addErrback(function(error){ - self._loadInProgress = false; - if(keywordArgs.onError){ - var scope = keywordArgs.scope?keywordArgs.scope:dojo.global; - keywordArgs.onError.call(scope, error); - } - }); - } + 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 + }, - }else if(this._jsonData){ - // Passed in data, no need to xhr. - self._getItemsFromLoadedData(self._jsonData); - self._jsonData = null; - self._loadFinished = true; - item = self._getItemByIdentity(keywordArgs.identity); - if(keywordArgs.onItem){ - scope = keywordArgs.scope?keywordArgs.scope:dojo.global; - keywordArgs.onItem.call(scope, item); - } + 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(/*Event*/ e){ + // summary: + // Translates keypress events into commands for the controller + if(e.altKey){ return; } + var treeNode = registry.getEnclosingWidget(e.target); + if(!treeNode){ return; } + + var key = e.charOrCode; + if(typeof key == "string" && key != " "){ // handle printables (letter navigation) + // Check for key navigation. + if(!e.altKey && !e.ctrlKey && !e.shiftKey && !e.metaKey){ + this._onLetterKeyNav( { node: treeNode, key: key.toLowerCase() } ); + event.stop(e); } - }else{ - // Already loaded. We can just look it up and call back. - item = this._getItemByIdentity(keywordArgs.identity); - if(keywordArgs.onItem){ - scope = keywordArgs.scope?keywordArgs.scope:dojo.global; - keywordArgs.onItem.call(scope, item); + }else{ // handle non-printables (arrow keys) + // 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){ + clearTimeout(this._curSearch.timer); + delete this._curSearch; + } + + var map = this._keyHandlerMap; + if(!map){ + // setup table mapping keys to events + map = {}; + map[keys.ENTER]="_onEnterKey"; + //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. + 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]){ + this[this._keyHandlerMap[key]]( { node: treeNode, item: treeNode.item, evt: e } ); + event.stop(e); } } }, - _getItemByIdentity: function(/* Object */ identity){ - // summary: - // Internal function to look an item up by its identity map. - var item = null; - if(this._itemsByIdentity && - Object.hasOwnProperty.call(this._itemsByIdentity, identity)){ - item = this._itemsByIdentity[identity]; - }else if (Object.hasOwnProperty.call(this._arrayOfAllItems, identity)){ - item = this._arrayOfAllItems[identity]; - } - if(item === undefined){ - item = null; - } - return item; // Object + _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); }, - getIdentityAttributes: function(/* item */ item){ - // summary: - // See dojo.data.api.Identity.getIdentityAttributes() - - var identifier = this._features['dojo.data.api.Identity']; - if(identifier === Number){ - // If (identifier === Number) it means getIdentity() just returns - // an integer item-number for each item. The dojo.data.api.Identity - // spec says we need to return null if the identity is not composed - // of attributes - return null; // null - }else{ - return [identifier]; // Array + _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); } }, - - _forceLoad: function(){ - // summary: - // Internal function to force a load of the store if it hasn't occurred yet. This is required - // for specific functions to work properly. - var self = this; - //Do a check on the JsonFileUrl and crosscheck it. - //If it doesn't match the cross-check, it needs to be updated - //This allows for either url or _jsonFileUrl to he changed to - //reset the store load location. Done this way for backwards - //compatibility. People use _jsonFileUrl (even though officially - //private. - if(this._jsonFileUrl !== this._ccUrl){ - dojo.deprecated("dojo.data.ItemFileReadStore: ", - "To change the url, set the url property of the store," + - " not _jsonFileUrl. _jsonFileUrl support will be removed in 2.0"); - this._ccUrl = this._jsonFileUrl; - this.url = this._jsonFileUrl; - }else if(this.url !== this._ccUrl){ - this._jsonFileUrl = this.url; - this._ccUrl = this.url; - } - //See if there was any forced reset of data. - if(this.data != null){ - this._jsonData = this.data; - this.data = null; - } + _onUpArrow: function(/*Object*/ message){ + // summary: + // Up arrow pressed; move to previous visible node - if(this._jsonFileUrl){ - var getArgs = { - url: this._jsonFileUrl, - handleAs: "json-comment-optional", - preventCache: this.urlPreventCache, - failOk: this.failOk, - sync: true - }; - var getHandler = dojo.xhrGet(getArgs); - getHandler.addCallback(function(data){ - try{ - //Check to be sure there wasn't another load going on concurrently - //So we don't clobber data that comes in on it. If there is a load going on - //then do not save this data. It will potentially clobber current data. - //We mainly wanted to sync/wait here. - //TODO: Revisit the loading scheme of this store to improve multi-initial - //request handling. - if(self._loadInProgress !== true && !self._loadFinished){ - self._getItemsFromLoadedData(data); - self._loadFinished = true; - }else if(self._loadInProgress){ - //Okay, we hit an error state we can't recover from. A forced load occurred - //while an async load was occurring. Since we cannot block at this point, the best - //that can be managed is to throw an error. - throw new Error("dojo.data.ItemFileReadStore: Unable to perform a synchronous load, an async load is in progress."); - } - }catch(e){ - console.log(e); - throw e; - } - }); - getHandler.addErrback(function(error){ - throw error; - }); - }else if(this._jsonData){ - self._getItemsFromLoadedData(self._jsonData); - self._jsonData = null; - self._loadFinished = true; - } - } -}); -//Mix in the simple fetch implementation to this class. -dojo.extend(dojo.data.ItemFileReadStore,dojo.data.util.simpleFetch); + 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(!dojo._hasResource["dojo.data.ItemFileWriteStore"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.data.ItemFileWriteStore"] = true; -dojo.provide("dojo.data.ItemFileWriteStore"); + 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); + } + } + }, -dojo.declare("dojo.data.ItemFileWriteStore", dojo.data.ItemFileReadStore, { - constructor: function(/* object */ keywordParameters){ - // keywordParameters: {typeMap: object) - // The structure of the typeMap object is as follows: - // { - // type0: function || object, - // type1: function || object, - // ... - // typeN: function || object - // } - // Where if it is a function, it is assumed to be an object constructor that takes the - // value of _value as the initialization parameters. It is serialized assuming object.toString() - // serialization. If it is an object, then it is assumed - // to be an object of general form: - // { - // type: function, //constructor. - // deserialize: function(value) //The function that parses the value and constructs the object defined by type appropriately. - // serialize: function(object) //The function that converts the object back into the proper file format form. - // } + _onLeftArrow: function(/*Object*/ message){ + // summary: + // Left arrow pressed. + // If not collapsed, collapse, else move to parent. - // ItemFileWriteStore extends ItemFileReadStore to implement these additional dojo.data APIs - this._features['dojo.data.api.Write'] = true; - this._features['dojo.data.api.Notification'] = true; - - // For keeping track of changes so that we can implement isDirty and revert - this._pending = { - _newItems:{}, - _modifiedItems:{}, - _deletedItems:{} - }; + var node = message.node; - if(!this._datatypeMap['Date'].serialize){ - this._datatypeMap['Date'].serialize = function(obj){ - return dojo.date.stamp.toISOString(obj, {zulu:true}); - }; - } - //Disable only if explicitly set to false. - if(keywordParameters && (keywordParameters.referenceIntegrity === false)){ - this.referenceIntegrity = false; + 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); + } } + }, - // this._saveInProgress is set to true, briefly, from when save() is first called to when it completes - this._saveInProgress = false; + _onHomeKey: function(){ + // summary: + // Home key pressed; get first visible node, and set focus there + var node = this._getRootOrFirstNode(); + if(node){ + this.focusNode(node); + } }, - referenceIntegrity: true, //Flag that defaultly enabled reference integrity tracking. This way it can also be disabled pogrammatially or declaratively. + _onEndKey: function(){ + // summary: + // End key pressed; go to last visible node. - _assert: function(/* boolean */ condition){ - if(!condition){ - throw new Error("assertion failed in ItemFileWriteStore"); + var node = this.rootNode; + while(node.isExpanded){ + var c = node.getChildren(); + node = c[c.length - 1]; } - }, - _getIdentifierAttribute: function(){ - var identifierAttribute = this.getFeatures()['dojo.data.api.Identity']; - // this._assert((identifierAttribute === Number) || (dojo.isString(identifierAttribute))); - return identifierAttribute; + if(node && node.isTreeNode){ + this.focusNode(node); + } }, - - -/* dojo.data.api.Write */ - - newItem: function(/* Object? */ keywordArgs, /* Object? */ parentInfo){ - // summary: See dojo.data.api.Write.newItem() - this._assert(!this._saveInProgress); + // 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, - if(!this._loadFinished){ - // We need to do this here so that we'll be able to find out what - // identifierAttribute was specified in the data file. - this._forceLoad(); - } + _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. - if(typeof keywordArgs != "object" && typeof keywordArgs != "undefined"){ - throw new Error("newItem() was passed something other than an object"); - } - var newIdentity = null; - var identifierAttribute = this._getIdentifierAttribute(); - if(identifierAttribute === Number){ - newIdentity = this._arrayOfAllItems.length; + // 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; + clearTimeout(cs.timer); }else{ - newIdentity = keywordArgs[identifierAttribute]; - if(typeof newIdentity === "undefined"){ - throw new Error("newItem() was not passed an identity for the new item"); - } - if(dojo.isArray(newIdentity)){ - throw new Error("newItem() was not passed an single-valued identity"); - } - } - - // make sure this identity is not already in use by another item, if identifiers were - // defined in the file. Otherwise it would be the item count, - // which should always be unique in this case. - if(this._itemsByIdentity){ - this._assert(typeof this._itemsByIdentity[newIdentity] === "undefined"); - } - this._assert(typeof this._pending._newItems[newIdentity] === "undefined"); - this._assert(typeof this._pending._deletedItems[newIdentity] === "undefined"); - - var newItem = {}; - newItem[this._storeRefPropName] = this; - newItem[this._itemNumPropName] = this._arrayOfAllItems.length; - if(this._itemsByIdentity){ - this._itemsByIdentity[newIdentity] = newItem; - //We have to set the identifier now, otherwise we can't look it - //up at calls to setValueorValues in parentInfo handling. - newItem[identifierAttribute] = [newIdentity]; + // We are starting a new search + cs = this._curSearch = { + pattern: message.key, + startNode: message.node + }; } - this._arrayOfAllItems.push(newItem); - //We need to construct some data for the onNew call too... - var pInfo = null; - - // Now we need to check to see where we want to assign this thingm if any. - if(parentInfo && parentInfo.parent && parentInfo.attribute){ - pInfo = { - item: parentInfo.parent, - attribute: parentInfo.attribute, - oldValue: undefined - }; + // set/reset timer to forget recent keystrokes + var self = this; + cs.timer = setTimeout(function(){ + delete self._curSearch; + }, this.multiCharSearchDuration); - //See if it is multi-valued or not and handle appropriately - //Generally, all attributes are multi-valued for this store - //So, we only need to append if there are already values present. - var values = this.getValues(parentInfo.parent, parentInfo.attribute); - if(values && values.length > 0){ - var tempValues = values.slice(0, values.length); - if(values.length === 1){ - pInfo.oldValue = values[0]; - }else{ - pInfo.oldValue = values.slice(0, values.length); - } - tempValues.push(newItem); - this._setValueOrValues(parentInfo.parent, parentInfo.attribute, tempValues, false); - pInfo.newValue = this.getValues(parentInfo.parent, parentInfo.attribute); - }else{ - this._setValueOrValues(parentInfo.parent, parentInfo.attribute, newItem, false); - pInfo.newValue = newItem; - } - }else{ - //Toplevel item, add to both top list as well as all list. - newItem[this._rootItemPropName]=true; - this._arrayOfTopLevelItems.push(newItem); - } - - this._pending._newItems[newIdentity] = newItem; - - //Clone over the properties to the new item - for(var key in keywordArgs){ - if(key === this._storeRefPropName || key === this._itemNumPropName){ - // Bummer, the user is trying to do something like - // newItem({_S:"foo"}). Unfortunately, our superclass, - // ItemFileReadStore, is already using _S in each of our items - // to hold private info. To avoid a naming collision, we - // need to move all our private info to some other property - // of all the items/objects. So, we need to iterate over all - // the items and do something like: - // item.__S = item._S; - // item._S = undefined; - // But first we have to make sure the new "__S" variable is - // not in use, which means we have to iterate over all the - // items checking for that. - throw new Error("encountered bug in ItemFileWriteStore.newItem"); - } - var value = keywordArgs[key]; - if(!dojo.isArray(value)){ - value = [value]; + // 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(); } - newItem[key] = value; - if(this.referenceIntegrity){ - for(var i = 0; i < value.length; i++){ - var val = value[i]; - if(this.isItem(val)){ - this._addReferenceToMap(val, newItem, key); - } - } + }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); } } - this.onNew(newItem, pInfo); // dojo.data.api.Notification call - return newItem; // item - }, - - _removeArrayElement: function(/* Array */ array, /* anything */ element){ - var index = dojo.indexOf(array, element); - if(index != -1){ - array.splice(index, 1); - return true; - } - return false; }, - - deleteItem: function(/* item */ item){ - // summary: See dojo.data.api.Write.deleteItem() - this._assert(!this._saveInProgress); - this._assertIsItem(item); - - // Remove this item from the _arrayOfAllItems, but leave a null value in place - // of the item, so as not to change the length of the array, so that in newItem() - // we can still safely do: newIdentity = this._arrayOfAllItems.length; - var indexInArrayOfAllItems = item[this._itemNumPropName]; - var identity = this.getIdentity(item); - - //If we have reference integrity on, we need to do reference cleanup for the deleted item - if(this.referenceIntegrity){ - //First scan all the attributes of this items for references and clean them up in the map - //As this item is going away, no need to track its references anymore. - //Get the attributes list before we generate the backup so it - //doesn't pollute the attributes list. - var attributes = this.getAttributes(item); + isExpandoNode: function(node, widget){ + // summary: + // check whether a dom node is the expandoNode for a particular TreeNode widget + return dom.isDescendant(node, widget.expandoNode); + }, + _onClick: function(/*TreeNode*/ nodeWidget, /*Event*/ e){ + // summary: + // Translates click events into commands for the controller to process - //Backup the map, we'll have to restore it potentially, in a revert. - if(item[this._reverseRefMap]){ - item["backup_" + this._reverseRefMap] = dojo.clone(item[this._reverseRefMap]); - } - - //TODO: This causes a reversion problem. This list won't be restored on revert since it is - //attached to the 'value'. item, not ours. Need to back tese up somehow too. - //Maybe build a map of the backup of the entries and attach it to the deleted item to be restored - //later. Or just record them and call _addReferenceToMap on them in revert. - dojo.forEach(attributes, function(attribute){ - dojo.forEach(this.getValues(item, attribute), function(value){ - if(this.isItem(value)){ - //We have to back up all the references we had to others so they can be restored on a revert. - if(!item["backupRefs_" + this._reverseRefMap]){ - item["backupRefs_" + this._reverseRefMap] = []; - } - item["backupRefs_" + this._reverseRefMap].push({id: this.getIdentity(value), attr: attribute}); - this._removeReferenceFromMap(value, item, attribute); - } - }, this); - }, this); + var domElement = e.target, + isExpandoClick = this.isExpandoNode(domElement, nodeWidget); - //Next, see if we have references to this item, if we do, we have to clean them up too. - var references = item[this._reverseRefMap]; - if(references){ - //Look through all the items noted as references to clean them up. - for(var itemId in references){ - var containingItem = null; - if(this._itemsByIdentity){ - containingItem = this._itemsByIdentity[itemId]; - }else{ - containingItem = this._arrayOfAllItems[itemId]; - } - //We have a reference to a containing item, now we have to process the - //attributes and clear all references to the item being deleted. - if(containingItem){ - for(var attribute in references[itemId]){ - var oldValues = this.getValues(containingItem, attribute) || []; - var newValues = dojo.filter(oldValues, function(possibleItem){ - return !(this.isItem(possibleItem) && this.getIdentity(possibleItem) == identity); - }, this); - //Remove the note of the reference to the item and set the values on the modified attribute. - this._removeReferenceFromMap(item, containingItem, attribute); - if(newValues.length < oldValues.length){ - this._setValueOrValues(containingItem, attribute, newValues, true); - } - } - } - } + 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 - this._arrayOfAllItems[indexInArrayOfAllItems] = null; + var domElement = e.target, + isExpandoClick = (domElement == nodeWidget.expandoNode || domElement == nodeWidget.expandoNodeText); - item[this._storeRefPropName] = null; - if(this._itemsByIdentity){ - delete this._itemsByIdentity[identity]; + 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); } - this._pending._deletedItems[identity] = item; - - //Remove from the toplevel items, if necessary... - if(item[this._rootItemPropName]){ - this._removeArrayElement(this._arrayOfTopLevelItems, item); + 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); } - this.onDelete(item); // dojo.data.api.Notification call - return true; }, - setValue: function(/* item */ item, /* attribute-name-string */ attribute, /* almost anything */ value){ - // summary: See dojo.data.api.Write.set() - return this._setValueOrValues(item, attribute, value, true); // boolean + onClick: function(/*===== item, node, evt =====*/){ + // summary: + // Callback when a tree node is clicked + // item: dojo.data.Item + // node: TreeNode + // evt: Event + // tags: + // callback }, - - setValues: function(/* item */ item, /* attribute-name-string */ attribute, /* array */ values){ - // summary: See dojo.data.api.Write.setValues() - return this._setValueOrValues(item, attribute, values, true); // boolean + onDblClick: function(/*===== item, node, evt =====*/){ + // summary: + // Callback when a tree node is double-clicked + // item: dojo.data.Item + // node: TreeNode + // evt: Event + // tags: + // callback }, - - unsetAttribute: function(/* item */ item, /* attribute-name-string */ attribute){ - // summary: See dojo.data.api.Write.unsetAttribute() - return this._setValueOrValues(item, attribute, [], true); + 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: dojo.data.Item + // node: TreeNode + // tags: + // callback }, - - _setValueOrValues: function(/* item */ item, /* attribute-name-string */ attribute, /* anything */ newValueOrValues, /*boolean?*/ callOnSet){ - this._assert(!this._saveInProgress); - - // Check for valid arguments - this._assertIsItem(item); - this._assert(dojo.isString(attribute)); - this._assert(typeof newValueOrValues !== "undefined"); - - // Make sure the user isn't trying to change the item's identity - var identifierAttribute = this._getIdentifierAttribute(); - if(attribute == identifierAttribute){ - throw new Error("ItemFileWriteStore does not have support for changing the value of an item's identifier."); - } - // To implement the Notification API, we need to make a note of what - // the old attribute value was, so that we can pass that info when - // we call the onSet method. - var oldValueOrValues = this._getValueOrValues(item, attribute); + _getNextNode: function(node){ + // summary: + // Get next visible node - var identity = this.getIdentity(item); - if(!this._pending._modifiedItems[identity]){ - // Before we actually change the item, we make a copy of it to - // record the original state, so that we'll be able to revert if - // the revert method gets called. If the item has already been - // modified then there's no need to do this now, since we already - // have a record of the original state. - var copyOfItemState = {}; - for(var key in item){ - if((key === this._storeRefPropName) || (key === this._itemNumPropName) || (key === this._rootItemPropName)){ - copyOfItemState[key] = item[key]; - }else if(key === this._reverseRefMap){ - copyOfItemState[key] = dojo.clone(item[key]); - }else{ - copyOfItemState[key] = item[key].slice(0, item[key].length); + 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(); } - // Now mark the item as dirty, and save the copy of the original state - this._pending._modifiedItems[identity] = copyOfItemState; + return null; } - - // Okay, now we can actually change this attribute on the item - var success = false; - - if(dojo.isArray(newValueOrValues) && newValueOrValues.length === 0){ - - // If we were passed an empty array as the value, that counts - // as "unsetting" the attribute, so we need to remove this - // attribute from the item. - success = delete item[attribute]; - newValueOrValues = undefined; // used in the onSet Notification call below + }, - if(this.referenceIntegrity && oldValueOrValues){ - var oldValues = oldValueOrValues; - if(!dojo.isArray(oldValues)){ - oldValues = [oldValues]; - } - for(var i = 0; i < oldValues.length; i++){ - var value = oldValues[i]; - if(this.isItem(value)){ - this._removeReferenceFromMap(value, item, attribute); - } - } - } - }else{ - var newValueArray; - if(dojo.isArray(newValueOrValues)){ - var newValues = newValueOrValues; - // Unfortunately, it's not safe to just do this: - // newValueArray = newValues; - // Instead, we need to copy the array, which slice() does very nicely. - // This is so that our internal data structure won't - // get corrupted if the user mucks with the values array *after* - // calling setValues(). - newValueArray = newValueOrValues.slice(0, newValueOrValues.length); - }else{ - newValueArray = [newValueOrValues]; + _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 + + if(node._expandNodeDeferred){ + delete node._expandNodeDeferred; + } + + if(node.isExpandable){ + if(node.state == "LOADING"){ + // ignore clicks while we are in the process of loading data + return; } - //We need to handle reference integrity if this is on. - //In the case of set, we need to see if references were added or removed - //and update the reference tracking map accordingly. - if(this.referenceIntegrity){ - if(oldValueOrValues){ - var oldValues = oldValueOrValues; - if(!dojo.isArray(oldValues)){ - oldValues = [oldValues]; - } - //Use an associative map to determine what was added/removed from the list. - //Should be O(n) performant. First look at all the old values and make a list of them - //Then for any item not in the old list, we add it. If it was already present, we remove it. - //Then we pass over the map and any references left it it need to be removed (IE, no match in - //the new values list). - var map = {}; - dojo.forEach(oldValues, function(possibleItem){ - if(this.isItem(possibleItem)){ - var id = this.getIdentity(possibleItem); - map[id.toString()] = true; - } - }, this); - dojo.forEach(newValueArray, function(possibleItem){ - if(this.isItem(possibleItem)){ - var id = this.getIdentity(possibleItem); - if(map[id.toString()]){ - delete map[id.toString()]; - }else{ - this._addReferenceToMap(possibleItem, item, attribute); - } - } - }, this); - for(var rId in map){ - var removedItem; - if(this._itemsByIdentity){ - removedItem = this._itemsByIdentity[rId]; - }else{ - removedItem = this._arrayOfAllItems[rId]; - } - this._removeReferenceFromMap(removedItem, item, attribute); - } - }else{ - //Everything is new (no old values) so we have to just - //insert all the references, if any. - for(var i = 0; i < newValueArray.length; i++){ - var value = newValueArray[i]; - if(this.isItem(value)){ - this._addReferenceToMap(value, item, attribute); - } + node.collapse(); + this.onClose(node.item, node); + + this._state(node, false); + } + }, + + _expandNode: function(/*_TreeNode*/ node, /*Boolean?*/ recursive){ + // summary: + // Called when the user has requested to expand the node + // recursive: + // Internal flag used when _expandNode() calls itself, don't set. + // returns: + // Deferred that fires when the node is loaded and opened and (if persist=true) all it's descendants + // that were previously opened too + + if(node._expandNodeDeferred && !recursive){ + // there's already an expand in progress (or completed), so just return + return node._expandNodeDeferred; // dojo.Deferred + } + + var model = this.model, + item = node.item, + _this = this; + + switch(node.state){ + case "UNCHECKED": + // need to load all the children, and then expand + 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. + var def = (node._expandNodeDeferred = 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. + var scid = node.setChildItems(items); + + // Call _expandNode() again but this time it will just to do the animation (default branch). + // The returned Deferred will fire when the animation completes. + // TODO: seems like I can avoid recursion and just use a deferred to sequence the events? + var ed = _this._expandNode(node, true); + + // After the above two tasks (setChildItems() and recursive _expandNode()) finish, + // signal that I am done. + scid.addCallback(function(){ + ed.addCallback(function(){ + def.callback(); + }) + }); + }, + function(err){ + console.error(_this, ": error loading root children: ", err); } - } - } - item[attribute] = newValueArray; - success = true; - } + ); + break; - // Now we make the dojo.data.api.Notification call - if(callOnSet){ - this.onSet(item, attribute, oldValueOrValues, newValueOrValues); + default: // "LOADED" + // data is already loaded; just expand node + def = (node._expandNodeDeferred = node.expand()); + + this.onOpen(node.item, node); + + this._state(node, true); } - return success; // boolean + + return def; // dojo.Deferred }, - _addReferenceToMap: function(/*item*/ refItem, /*item*/ parentItem, /*string*/ attribute){ - // summary: - // Method to add an reference map entry for an item and attribute. - // description: - // Method to add an reference map entry for an item and attribute. // - // refItem: - // The item that is referenced. - // parentItem: - // The item that holds the new reference to refItem. - // attribute: - // The attribute on parentItem that contains the new reference. - - var parentId = this.getIdentity(parentItem); - var references = refItem[this._reverseRefMap]; + ////////////////// Miscellaneous functions //////////////// - if(!references){ - references = refItem[this._reverseRefMap] = {}; - } - var itemRef = references[parentId]; - if(!itemRef){ - itemRef = references[parentId] = {}; - } - itemRef[attribute] = true; + 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); }, - _removeReferenceFromMap: function(/* item */ refItem, /* item */ parentItem, /*strin*/ attribute){ - // summary: - // Method to remove an reference map entry for an item and attribute. - // description: - // Method to remove an reference map entry for an item and attribute. This will - // also perform cleanup on the map such that if there are no more references at all to - // the item, its reference object and entry are removed. - // - // refItem: - // The item that is referenced. - // parentItem: - // The item holding a reference to refItem. - // attribute: - // The attribute on parentItem that contains the reference. - var identity = this.getIdentity(parentItem); - var references = refItem[this._reverseRefMap]; - var itemId; - if(references){ - for(itemId in references){ - if(itemId == identity){ - delete references[itemId][attribute]; - if(this._isEmpty(references[itemId])){ - delete references[itemId]; - } - } - } - if(this._isEmpty(references)){ - delete refItem[this._reverseRefMap]; + _onNodeFocus: function(/*dijit._Widget*/ 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; } }, - _dumpReferenceMap: function(){ - // summary: - // Function to dump the reverse reference map of all items in the store for debug purposes. - // description: - // Function to dump the reverse reference map of all items in the store for debug purposes. - var i; - for(i = 0; i < this._arrayOfAllItems.length; i++){ - var item = this._arrayOfAllItems[i]; - if(item && item[this._reverseRefMap]){ - console.log("Item: [" + this.getIdentity(item) + "] is referenced by: " + dojo.toJson(item[this._reverseRefMap])); - } - } + _onNodeMouseEnter: function(/*dijit._Widget*/ /*===== node =====*/){ + // summary: + // Called when mouse is over a node (onmouseenter event), + // this is monitored by the DND code }, - - _getValueOrValues: function(/* item */ item, /* attribute-name-string */ attribute){ - var valueOrValues = undefined; - if(this.hasAttribute(item, attribute)){ - var valueArray = this.getValues(item, attribute); - if(valueArray.length == 1){ - valueOrValues = valueArray[0]; - }else{ - valueOrValues = valueArray; - } - } - return valueOrValues; + + _onNodeMouseLeave: function(/*dijit._Widget*/ /*===== node =====*/){ + // summary: + // Called when mouse leaves a node (onmouseleave event), + // this is monitored by the DND code }, - - _flatten: function(/* anything */ value){ - if(this.isItem(value)){ - var item = value; - // Given an item, return an serializable object that provides a - // reference to the item. - // For example, given kermit: - // var kermit = store.newItem({id:2, name:"Kermit"}); - // we want to return - // {_reference:2} - var identity = this.getIdentity(item); - var referenceObject = {_reference: identity}; - return referenceObject; - }else{ - if(typeof value === "object"){ - for(var type in this._datatypeMap){ - var typeMap = this._datatypeMap[type]; - if(dojo.isObject(typeMap) && !dojo.isFunction(typeMap)){ - if(value instanceof typeMap.type){ - if(!typeMap.serialize){ - throw new Error("ItemFileWriteStore: No serializer defined for type mapping: [" + type + "]"); - } - return {_type: type, _value: typeMap.serialize(value)}; - } - } else if(value instanceof typeMap){ - //SImple mapping, therefore, return as a toString serialization. - return {_type: type, _value: value.toString()}; - } - } - } - return value; + + //////////////// 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); + }); } }, - - _getNewFileContentString: function(){ + + _onItemChildrenChange: function(/*dojo.data.Item*/ parent, /*dojo.data.Item[]*/ newChildrenList){ // summary: - // Generate a string that can be saved to a file. - // The result should look similar to: - // http://trac.dojotoolkit.org/browser/dojo/trunk/tests/data/countries.json - var serializableStructure = {}; - - var identifierAttribute = this._getIdentifierAttribute(); - if(identifierAttribute !== Number){ - serializableStructure.identifier = identifierAttribute; - } - if(this._labelAttr){ - serializableStructure.label = this._labelAttr; - } - serializableStructure.items = []; - for(var i = 0; i < this._arrayOfAllItems.length; ++i){ - var item = this._arrayOfAllItems[i]; - if(item !== null){ - var serializableItem = {}; - for(var key in item){ - if(key !== this._storeRefPropName && key !== this._itemNumPropName && key !== this._reverseRefMap && key !== this._rootItemPropName){ - var attribute = key; - var valueArray = this.getValues(item, attribute); - if(valueArray.length == 1){ - serializableItem[attribute] = this._flatten(valueArray[0]); - }else{ - var serializableArray = []; - for(var j = 0; j < valueArray.length; ++j){ - serializableArray.push(this._flatten(valueArray[j])); - serializableItem[attribute] = serializableArray; - } - } - } - } - serializableStructure.items.push(serializableItem); - } + // 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); + }); } - var prettyPrint = true; - return dojo.toJson(serializableStructure, prettyPrint); }, - _isEmpty: function(something){ - // summary: - // Function to determine if an array or object has no properties or values. - // something: - // The array or object to examine. - var empty = true; - if(dojo.isObject(something)){ - var i; - for(i in something){ - empty = false; - break; - } - }else if(dojo.isArray(something)){ - if(something.length > 0){ - empty = false; - } + _onItemDelete: function(/*Item*/ item){ + // summary: + // Processes notification of a deletion of an item + 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]; } - return empty; //boolean }, - - save: function(/* object */ keywordArgs){ - // summary: See dojo.data.api.Write.save() - this._assert(!this._saveInProgress); - - // this._saveInProgress is set to true, briefly, from when save is first called to when it completes - this._saveInProgress = true; - - var self = this; - var saveCompleteCallback = function(){ - self._pending = { - _newItems:{}, - _modifiedItems:{}, - _deletedItems:{} - }; - self._saveInProgress = false; // must come after this._pending is cleared, but before any callbacks - if(keywordArgs && keywordArgs.onComplete){ - var scope = keywordArgs.scope || dojo.global; - keywordArgs.onComplete.call(scope); - } - }; - var saveFailedCallback = function(err){ - self._saveInProgress = false; - if(keywordArgs && keywordArgs.onError){ - var scope = keywordArgs.scope || dojo.global; - keywordArgs.onError.call(scope, err); + /////////////// 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); } - }; - - if(this._saveEverything){ - var newFileContentString = this._getNewFileContentString(); - this._saveEverything(saveCompleteCallback, saveFailedCallback, newFileContentString); - } - if(this._saveCustom){ - this._saveCustom(saveCompleteCallback, saveFailedCallback); - } - if(!this._saveEverything && !this._saveCustom){ - // Looks like there is no user-defined save-handler function. - // That's fine, it just means the datastore is acting as a "mock-write" - // store -- changes get saved in memory but don't get saved to disk. - saveCompleteCallback(); } }, - - revert: function(){ - // summary: See dojo.data.api.Write.revert() - this._assert(!this._saveInProgress); - - var identity; - for(identity in this._pending._modifiedItems){ - // find the original item and the modified item that replaced it - var copyOfItemState = this._pending._modifiedItems[identity]; - var modifiedItem = null; - if(this._itemsByIdentity){ - modifiedItem = this._itemsByIdentity[identity]; + _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{ - modifiedItem = this._arrayOfAllItems[identity]; + delete this._openedNodes[path]; } - - // Restore the original item into a full-fledged item again, we want to try to - // keep the same object instance as if we don't it, causes bugs like #9022. - copyOfItemState[this._storeRefPropName] = this; - for(key in modifiedItem){ - delete modifiedItem[key]; + var ary = []; + for(var id in this._openedNodes){ + ary.push(id); } - dojo.mixin(modifiedItem, copyOfItemState); + cookie(this.cookieName, ary.join(","), {expires:365}); } - var deletedItem; - for(identity in this._pending._deletedItems){ - deletedItem = this._pending._deletedItems[identity]; - deletedItem[this._storeRefPropName] = this; - var index = deletedItem[this._itemNumPropName]; + }, - //Restore the reverse refererence map, if any. - if(deletedItem["backup_" + this._reverseRefMap]){ - deletedItem[this._reverseRefMap] = deletedItem["backup_" + this._reverseRefMap]; - delete deletedItem["backup_" + this._reverseRefMap]; - } - this._arrayOfAllItems[index] = deletedItem; - if(this._itemsByIdentity){ - this._itemsByIdentity[identity] = deletedItem; - } - if(deletedItem[this._rootItemPropName]){ - this._arrayOfTopLevelItems.push(deletedItem); - } + destroy: function(){ + if(this._curSearch){ + clearTimeout(this._curSearch.timer); + delete this._curSearch; } - //We have to pass through it again and restore the reference maps after all the - //undeletes have occurred. - for(identity in this._pending._deletedItems){ - deletedItem = this._pending._deletedItems[identity]; - if(deletedItem["backupRefs_" + this._reverseRefMap]){ - dojo.forEach(deletedItem["backupRefs_" + this._reverseRefMap], function(reference){ - var refItem; - if(this._itemsByIdentity){ - refItem = this._itemsByIdentity[reference.id]; - }else{ - refItem = this._arrayOfAllItems[reference.id]; - } - this._addReferenceToMap(refItem, deletedItem, reference.attr); - }, this); - delete deletedItem["backupRefs_" + this._reverseRefMap]; - } + if(this.rootNode){ + this.rootNode.destroyRecursive(); } - - for(identity in this._pending._newItems){ - var newItem = this._pending._newItems[identity]; - newItem[this._storeRefPropName] = null; - // null out the new item, but don't change the array index so - // so we can keep using _arrayOfAllItems.length. - this._arrayOfAllItems[newItem[this._itemNumPropName]] = null; - if(newItem[this._rootItemPropName]){ - this._removeArrayElement(this._arrayOfTopLevelItems, newItem); - } - if(this._itemsByIdentity){ - delete this._itemsByIdentity[identity]; - } + if(this.dndController && !lang.isString(this.dndController)){ + this.dndController.destroy(); } + this.rootNode = null; + this.inherited(arguments); + }, - this._pending = { - _newItems:{}, - _modifiedItems:{}, - _deletedItems:{} - }; - return true; // boolean + 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(); }, - - isDirty: function(/* item? */ item){ - // summary: See dojo.data.api.Write.isDirty() - if(item){ - // return true if the item is dirty - var identity = this.getIdentity(item); - return new Boolean(this._pending._newItems[identity] || - this._pending._modifiedItems[identity] || - this._pending._deletedItems[identity]).valueOf(); // boolean - }else{ - // return true if the store is dirty -- which means return true - // if there are any new items, dirty items, or modified items - if(!this._isEmpty(this._pending._newItems) || - !this._isEmpty(this._pending._modifiedItems) || - !this._isEmpty(this._pending._deletedItems)){ - return true; - } - return false; // boolean + + resize: function(changeSize){ + if(changeSize){ + domGeometry.setMarginBox(this.domNode, changeSize); } - }, -/* dojo.data.api.Notification */ + // The only 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) + this._nodePixelIndent = domGeometry.position(this.tree.indentDetector).w; - onSet: function(/* item */ item, - /*attribute-name-string*/ attribute, - /*object | array*/ oldValue, - /*object | array*/ newValue){ - // summary: See dojo.data.api.Notification.onSet() - - // No need to do anything. This method is here just so that the - // client code can connect observers to it. + if(this.tree.rootNode){ + // If tree has already loaded, then reset indent for all the nodes + this.tree.rootNode.set('indent', this.showRoot ? 0 : -1); + } }, - onNew: function(/* item */ newItem, /*object?*/ parentInfo){ - // summary: See dojo.data.api.Notification.onNew() - - // No need to do anything. This method is here just so that the - // client code can connect observers to it. + _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); }, - onDelete: function(/* item */ deletedItem){ - // summary: See dojo.data.api.Notification.onDelete() - - // No need to do anything. This method is here just so that the - // client code can connect observers to it. - }, + _setTextDirAttr: function(textDir){ + if(textDir && this.textDir!= textDir){ + this._set("textDir",textDir); + this.rootNode.set("textDir", textDir); + } + } +}); - close: function(/* object? */ request){ - // summary: - // Over-ride of base close function of ItemFileReadStore to add in check for store state. - // description: - // Over-ride of base close function of ItemFileReadStore to add in check for store state. - // If the store is still dirty (unsaved changes), then an error will be thrown instead of - // clearing the internal state for reload from the url. +Tree._TreeNode = TreeNode; // for monkey patching - //Clear if not dirty ... or throw an error - if(this.clearOnClose){ - if(!this.isDirty()){ - this.inherited(arguments); - }else{ - //Only throw an error if the store was dirty and we were loading from a url (cannot reload from url until state is saved). - throw new Error("dojo.data.ItemFileWriteStore: There are unsaved changes present in the store. Please save or revert the changes before invoking close."); - } - } - } +return Tree; }); -} +}, +'dijit/form/_FormValueWidget':function(){ +define("dijit/form/_FormValueWidget", [ + "dojo/_base/declare", // declare + "dojo/_base/sniff", // has("ie") + "./_FormWidget", + "./_FormValueMixin" +], function(declare, has, _FormWidget, _FormValueMixin){ + +/*===== +var _FormWidget = dijit.form._FormWidget; +var _FormValueMixin = dijit.form._FormValueMixin; +=====*/ + +// module: +// dijit/form/_FormValueWidget +// summary: +// 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 + setTimeout(function(){ pingNode.style.filter = origFilter }, 0); // restore custom filter, if any + } + ); + })(); + parent = parent.parentNode; + } + } + } +}); +}); -dojo.i18n._preloadLocalizations("dojo.nls.tt-rss-layer", ["ROOT","ar","ca","cs","da","de","de-de","el","en","en-gb","en-us","es","es-es","fi","fi-fi","fr","fr-fr","he","he-il","hu","it","it-it","ja","ja-jp","ko","ko-kr","nb","nl","nl-nl","pl","pt","pt-br","pt-pt","ru","sk","sl","sv","th","tr","xx","zh","zh-cn","zh-tw"]); +}, +'*now':function(r){r(['dojo/i18n!*preload*dojo/nls/tt-rss-layer*["ar","ca","cs","da","de-de","el","en-gb","en-us","es-es","fi-fi","fr-fr","he-il","hu","it-it","ja-jp","ko-kr","nl-nl","nb","pl","pt-br","pt-pt","ru","sk","sl","sv","th","tr","zh-tw","zh-cn","ROOT"]']);} +}}); +define("dojo/tt-rss-layer", [], 1); diff --git a/lib/dojo/uacss.js b/lib/dojo/uacss.js index 25b12f4b..3b8a7c39 100644 --- a/lib/dojo/uacss.js +++ b/lib/dojo/uacss.js @@ -4,73 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.uacss"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.uacss"] = true; -dojo.provide("dojo.uacss"); - - -(function(){ - // summary: - // Applies pre-set CSS classes to the top-level HTML node, based on: - // - browser (ex: dj_ie) - // - browser version (ex: dj_ie6) - // - box model (ex: dj_contentBox) - // - text direction (ex: dijitRtl) - // - // In addition, browser, browser version, and box model are - // combined with an RTL flag when browser text is RTL. ex: dj_ie-rtl. - - var d = dojo, - html = d.doc.documentElement, - ie = d.isIE, - opera = d.isOpera, - maj = Math.floor, - ff = d.isFF, - boxModel = d.boxModel.replace(/-/,''), - - classes = { - dj_ie: ie, - dj_ie6: maj(ie) == 6, - dj_ie7: maj(ie) == 7, - dj_ie8: maj(ie) == 8, - dj_ie9: maj(ie) == 9, - dj_quirks: d.isQuirks, - dj_iequirks: ie && d.isQuirks, - - // NOTE: Opera not supported by dijit - dj_opera: opera, - - dj_khtml: d.isKhtml, - - dj_webkit: d.isWebKit, - dj_safari: d.isSafari, - dj_chrome: d.isChrome, - - dj_gecko: d.isMozilla, - dj_ff3: maj(ff) == 3 - }; // no dojo unsupported browsers - - classes["dj_" + boxModel] = true; - - // apply browser, browser version, and box model class names - var classStr = ""; - for(var clz in classes){ - if(classes[clz]){ - classStr += clz + " "; - } - } - html.className = d.trim(html.className + " " + classStr); - - // If RTL mode, then add dj_rtl flag plus repeat existing classes with -rtl extension. - // We can't run the code below until the <body> tag has loaded (so we can check for dir=rtl). - // Unshift() is to run sniff code before the parser. - dojo._loaders.unshift(function(){ - if(!dojo._isBodyLtr()){ - var rtlClassStr = "dj_rtl dijitRtl " + classStr.replace(/ /g, "-rtl ") - html.className = d.trim(html.className + " " + rtlClassStr); - } - }); -})(); - -} +//>>built +define("dojo/uacss",["./dom-geometry","./_base/lang","./ready","./_base/sniff","./_base/window"],function(_1,_2,_3,_4,_5){var _6=_5.doc.documentElement,ie=_4("ie"),_7=_4("opera"),_8=Math.floor,ff=_4("ff"),_9=_1.boxModel.replace(/-/,""),_a={"dj_ie":ie,"dj_ie6":_8(ie)==6,"dj_ie7":_8(ie)==7,"dj_ie8":_8(ie)==8,"dj_ie9":_8(ie)==9,"dj_quirks":_4("quirks"),"dj_iequirks":ie&&_4("quirks"),"dj_opera":_7,"dj_khtml":_4("khtml"),"dj_webkit":_4("webkit"),"dj_safari":_4("safari"),"dj_chrome":_4("chrome"),"dj_gecko":_4("mozilla"),"dj_ff3":_8(ff)==3};_a["dj_"+_9]=true;var _b="";for(var _c in _a){if(_a[_c]){_b+=_c+" ";}}_6.className=_2.trim(_6.className+" "+_b);_3(90,function(){if(!_1.isBodyLtr()){var _d="dj_rtl dijitRtl "+_b.replace(/ /g,"-rtl ");_6.className=_2.trim(_6.className+" "+_d+"dj_rtl dijitRtl "+_b.replace(/ /g,"-rtl "));}});return _4;}); \ No newline at end of file diff --git a/lib/dojo/uacss.js.uncompressed.js b/lib/dojo/uacss.js.uncompressed.js new file mode 100644 index 00000000..ccef8672 --- /dev/null +++ b/lib/dojo/uacss.js.uncompressed.js @@ -0,0 +1,66 @@ +define("dojo/uacss", ["./dom-geometry", "./_base/lang", "./ready", "./_base/sniff", "./_base/window"], + function(geometry, lang, ready, has, baseWindow){ + // module: + // dojo/uacss + // summary: + // Applies pre-set CSS classes to the top-level HTML node, based on: + // - browser (ex: dj_ie) + // - browser version (ex: dj_ie6) + // - box model (ex: dj_contentBox) + // - text direction (ex: dijitRtl) + // + // In addition, browser, browser version, and box model are + // combined with an RTL flag when browser text is RTL. ex: dj_ie-rtl. + + var + html = baseWindow.doc.documentElement, + ie = has("ie"), + opera = has("opera"), + maj = Math.floor, + ff = has("ff"), + boxModel = geometry.boxModel.replace(/-/,''), + + classes = { + "dj_ie": ie, + "dj_ie6": maj(ie) == 6, + "dj_ie7": maj(ie) == 7, + "dj_ie8": maj(ie) == 8, + "dj_ie9": maj(ie) == 9, + "dj_quirks": has("quirks"), + "dj_iequirks": ie && has("quirks"), + + // NOTE: Opera not supported by dijit + "dj_opera": opera, + + "dj_khtml": has("khtml"), + + "dj_webkit": has("webkit"), + "dj_safari": has("safari"), + "dj_chrome": has("chrome"), + + "dj_gecko": has("mozilla"), + "dj_ff3": maj(ff) == 3 + }; // no dojo unsupported browsers + + classes["dj_" + boxModel] = true; + + // apply browser, browser version, and box model class names + var classStr = ""; + for(var clz in classes){ + if(classes[clz]){ + classStr += clz + " "; + } + } + html.className = lang.trim(html.className + " " + classStr); + + // If RTL mode, then add dj_rtl flag plus repeat existing classes with -rtl extension. + // We can't run the code below until the <body> tag has loaded (so we can check for dir=rtl). + // priority is 90 to run ahead of parser priority of 100 + ready(90, function(){ + if(!geometry.isBodyLtr()){ + var rtlClassStr = "dj_rtl dijitRtl " + classStr.replace(/ /g, "-rtl "); + html.className = lang.trim(html.className + " " + rtlClassStr + "dj_rtl dijitRtl " + classStr.replace(/ /g, "-rtl ")); + } + }); + return has; +}); diff --git a/lib/dojo/window.js b/lib/dojo/window.js index 4e363fab..dfa485a0 100644 --- a/lib/dojo/window.js +++ b/lib/dojo/window.js @@ -4,142 +4,5 @@ see: http://dojotoolkit.org/license for details */ - -if(!dojo._hasResource["dojo.window"]){ //_hasResource checks added by build. Do not use _hasResource directly in your code. -dojo._hasResource["dojo.window"] = true; -dojo.provide("dojo.window"); - -dojo.getObject("window", true, dojo); - -dojo.window.getBox = function(){ - // summary: - // Returns the dimensions and scroll position of the viewable area of a browser window - - var scrollRoot = (dojo.doc.compatMode == 'BackCompat') ? dojo.body() : dojo.doc.documentElement; - - // get scroll position - var scroll = dojo._docScroll(); // scrollRoot.scrollTop/Left should work - return { w: scrollRoot.clientWidth, h: scrollRoot.clientHeight, l: scroll.x, t: scroll.y }; -}; - -dojo.window.get = function(doc){ - // summary: - // Get window object associated with document doc - - // In some IE versions (at least 6.0), document.parentWindow does not return a - // reference to the real window object (maybe a copy), so we must fix it as well - // We use IE specific execScript to attach the real window reference to - // document._parentWindow for later use - if(dojo.isIE && window !== document.parentWindow){ - /* - In IE 6, only the variable "window" can be used to connect events (others - may be only copies). - */ - doc.parentWindow.execScript("document._parentWindow = window;", "Javascript"); - //to prevent memory leak, unset it after use - //another possibility is to add an onUnload handler which seems overkill to me (liucougar) - var win = doc._parentWindow; - doc._parentWindow = null; - return win; // Window - } - - return doc.parentWindow || doc.defaultView; // Window -}; - -dojo.window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){ - // summary: - // Scroll the passed node into view, if it is not already. - - // don't rely on node.scrollIntoView working just because the function is there - - try{ // catch unexpected/unrecreatable errors (#7808) since we can recover using a semi-acceptable native method - node = dojo.byId(node); - var doc = node.ownerDocument || dojo.doc, - body = doc.body || dojo.body(), - html = doc.documentElement || body.parentNode, - isIE = dojo.isIE, isWK = dojo.isWebKit; - // if an untested browser, then use the native method - if((!(dojo.isMoz || isIE || isWK || dojo.isOpera) || node == body || node == html) && (typeof node.scrollIntoView != "undefined")){ - node.scrollIntoView(false); // short-circuit to native if possible - return; - } - var backCompat = doc.compatMode == 'BackCompat', - clientAreaRoot = (isIE >= 9 && node.ownerDocument.parentWindow.frameElement) - ? ((html.clientHeight > 0 && html.clientWidth > 0 && (body.clientHeight == 0 || body.clientWidth == 0 || body.clientHeight > html.clientHeight || body.clientWidth > html.clientWidth)) ? html : body) - : (backCompat ? body : html), - scrollRoot = isWK ? body : clientAreaRoot, - rootWidth = clientAreaRoot.clientWidth, - rootHeight = clientAreaRoot.clientHeight, - rtl = !dojo._isBodyLtr(), - nodePos = pos || dojo.position(node), - el = node.parentNode, - isFixed = function(el){ - return ((isIE <= 6 || (isIE && backCompat))? false : (dojo.style(el, 'position').toLowerCase() == "fixed")); - }; - if(isFixed(node)){ return; } // nothing to do - - while(el){ - if(el == body){ el = scrollRoot; } - var elPos = dojo.position(el), - fixedPos = isFixed(el); - - if(el == scrollRoot){ - elPos.w = rootWidth; elPos.h = rootHeight; - if(scrollRoot == html && isIE && rtl){ elPos.x += scrollRoot.offsetWidth-elPos.w; } // IE workaround where scrollbar causes negative x - if(elPos.x < 0 || !isIE){ elPos.x = 0; } // IE can have values > 0 - if(elPos.y < 0 || !isIE){ elPos.y = 0; } - }else{ - var pb = dojo._getPadBorderExtents(el); - elPos.w -= pb.w; elPos.h -= pb.h; elPos.x += pb.l; elPos.y += pb.t; - var clientSize = el.clientWidth, - scrollBarSize = elPos.w - clientSize; - if(clientSize > 0 && scrollBarSize > 0){ - elPos.w = clientSize; - elPos.x += (rtl && (isIE || el.clientLeft > pb.l/*Chrome*/)) ? scrollBarSize : 0; - } - clientSize = el.clientHeight; - scrollBarSize = elPos.h - clientSize; - if(clientSize > 0 && scrollBarSize > 0){ - elPos.h = clientSize; - } - } - if(fixedPos){ // bounded by viewport, not parents - if(elPos.y < 0){ - elPos.h += elPos.y; elPos.y = 0; - } - if(elPos.x < 0){ - elPos.w += elPos.x; elPos.x = 0; - } - if(elPos.y + elPos.h > rootHeight){ - elPos.h = rootHeight - elPos.y; - } - if(elPos.x + elPos.w > rootWidth){ - elPos.w = rootWidth - elPos.x; - } - } - // calculate overflow in all 4 directions - var l = nodePos.x - elPos.x, // beyond left: < 0 - t = nodePos.y - Math.max(elPos.y, 0), // beyond top: < 0 - r = l + nodePos.w - elPos.w, // beyond right: > 0 - bot = t + nodePos.h - elPos.h; // beyond bottom: > 0 - if(r * l > 0){ - var s = Math[l < 0? "max" : "min"](l, r); - if(rtl && ((isIE == 8 && !backCompat) || isIE >= 9)){ s = -s; } - nodePos.x += el.scrollLeft; - el.scrollLeft += s; - nodePos.x -= el.scrollLeft; - } - if(bot * t > 0){ - nodePos.y += el.scrollTop; - el.scrollTop += Math[t < 0? "max" : "min"](t, bot); - nodePos.y -= el.scrollTop; - } - el = (el != scrollRoot) && !fixedPos && el.parentNode; - } - }catch(error){ - console.error('scrollIntoView: ' + error); - node.scrollIntoView(false); - } -}; - -} +//>>built +define("dojo/window",["./_base/lang","./_base/sniff","./_base/window","./dom","./dom-geometry","./dom-style"],function(_1,_2,_3,_4,_5,_6){var _7=_1.getObject("dojo.window",true);_7.getBox=function(){var _8=(_3.doc.compatMode=="BackCompat")?_3.body():_3.doc.documentElement,_9=_5.docScroll(),w,h;if(_2("touch")){var _a=_3.doc.parentWindow||_3.doc.defaultView;w=_a.innerWidth||_8.clientWidth;h=_a.innerHeight||_8.clientHeight;}else{w=_8.clientWidth;h=_8.clientHeight;}return {l:_9.x,t:_9.y,w:w,h:h};};_7.get=function(_b){if(_2("ie")&&_7!==document.parentWindow){_b.parentWindow.execScript("document._parentWindow = window;","Javascript");var _c=_b._parentWindow;_b._parentWindow=null;return _c;}return _b.parentWindow||_b.defaultView;};_7.scrollIntoView=function(_d,_e){try{_d=_4.byId(_d);var _f=_d.ownerDocument||_3.doc,_10=_f.body||_3.body(),_11=_f.documentElement||_10.parentNode,_12=_2("ie"),_13=_2("webkit");if((!(_2("mozilla")||_12||_13||_2("opera"))||_d==_10||_d==_11)&&(typeof _d.scrollIntoView!="undefined")){_d.scrollIntoView(false);return;}var _14=_f.compatMode=="BackCompat",_15=(_12>=9&&_d.ownerDocument.parentWindow.frameElement)?((_11.clientHeight>0&&_11.clientWidth>0&&(_10.clientHeight==0||_10.clientWidth==0||_10.clientHeight>_11.clientHeight||_10.clientWidth>_11.clientWidth))?_11:_10):(_14?_10:_11),_16=_13?_10:_15,_17=_15.clientWidth,_18=_15.clientHeight,rtl=!_5.isBodyLtr(),_19=_e||_5.position(_d),el=_d.parentNode,_1a=function(el){return ((_12<=6||(_12&&_14))?false:(_6.get(el,"position").toLowerCase()=="fixed"));};if(_1a(_d)){return;}while(el){if(el==_10){el=_16;}var _1b=_5.position(el),_1c=_1a(el);if(el==_16){_1b.w=_17;_1b.h=_18;if(_16==_11&&_12&&rtl){_1b.x+=_16.offsetWidth-_1b.w;}if(_1b.x<0||!_12){_1b.x=0;}if(_1b.y<0||!_12){_1b.y=0;}}else{var pb=_5.getPadBorderExtents(el);_1b.w-=pb.w;_1b.h-=pb.h;_1b.x+=pb.l;_1b.y+=pb.t;var _1d=el.clientWidth,_1e=_1b.w-_1d;if(_1d>0&&_1e>0){_1b.w=_1d;_1b.x+=(rtl&&(_12||el.clientLeft>pb.l))?_1e:0;}_1d=el.clientHeight;_1e=_1b.h-_1d;if(_1d>0&&_1e>0){_1b.h=_1d;}}if(_1c){if(_1b.y<0){_1b.h+=_1b.y;_1b.y=0;}if(_1b.x<0){_1b.w+=_1b.x;_1b.x=0;}if(_1b.y+_1b.h>_18){_1b.h=_18-_1b.y;}if(_1b.x+_1b.w>_17){_1b.w=_17-_1b.x;}}var l=_19.x-_1b.x,t=_19.y-Math.max(_1b.y,0),r=l+_19.w-_1b.w,bot=t+_19.h-_1b.h;if(r*l>0){var s=Math[l<0?"max":"min"](l,r);if(rtl&&((_12==8&&!_14)||_12>=9)){s=-s;}_19.x+=el.scrollLeft;el.scrollLeft+=s;_19.x-=el.scrollLeft;}if(bot*t>0){_19.y+=el.scrollTop;el.scrollTop+=Math[t<0?"max":"min"](t,bot);_19.y-=el.scrollTop;}el=(el!=_16)&&!_1c&&el.parentNode;}}catch(error){console.error("scrollIntoView: "+error);_d.scrollIntoView(false);}};return _7;}); \ No newline at end of file diff --git a/lib/dojo/window.js.uncompressed.js b/lib/dojo/window.js.uncompressed.js new file mode 100644 index 00000000..6b343adf --- /dev/null +++ b/lib/dojo/window.js.uncompressed.js @@ -0,0 +1,169 @@ +define("dojo/window", ["./_base/lang", "./_base/sniff", "./_base/window", "./dom", "./dom-geometry", "./dom-style"], + function(lang, has, baseWindow, dom, geom, style) { + +// module: +// dojo/window +// summary: +// TODOC + +var window = lang.getObject("dojo.window", true); + +/*===== +dojo.window = { + // summary: + // TODO +}; +window = dojo.window; +=====*/ + +window.getBox = function(){ + // summary: + // Returns the dimensions and scroll position of the viewable area of a browser window + + var + scrollRoot = (baseWindow.doc.compatMode == 'BackCompat') ? baseWindow.body() : baseWindow.doc.documentElement, + // get scroll position + scroll = geom.docScroll(), // scrollRoot.scrollTop/Left should work + w, h; + + if(has("touch")){ // if(scrollbars not supported) + var uiWindow = baseWindow.doc.parentWindow || baseWindow.doc.defaultView; // use UI window, not dojo.global window. baseWindow.doc.parentWindow probably not needed since it's not defined for webkit + // on mobile, scrollRoot.clientHeight <= uiWindow.innerHeight <= scrollRoot.offsetHeight, return uiWindow.innerHeight + w = uiWindow.innerWidth || scrollRoot.clientWidth; // || scrollRoot.clientXXX probably never evaluated + h = uiWindow.innerHeight || scrollRoot.clientHeight; + }else{ + // on desktops, scrollRoot.clientHeight <= scrollRoot.offsetHeight <= uiWindow.innerHeight, return scrollRoot.clientHeight + // uiWindow.innerWidth/Height includes the scrollbar and cannot be used + w = scrollRoot.clientWidth; + h = scrollRoot.clientHeight; + } + return { + l: scroll.x, + t: scroll.y, + w: w, + h: h + }; +}; + +window.get = function(doc){ + // summary: + // Get window object associated with document doc + + // In some IE versions (at least 6.0), document.parentWindow does not return a + // reference to the real window object (maybe a copy), so we must fix it as well + // We use IE specific execScript to attach the real window reference to + // document._parentWindow for later use + if(has("ie") && window !== document.parentWindow){ + /* + In IE 6, only the variable "window" can be used to connect events (others + may be only copies). + */ + doc.parentWindow.execScript("document._parentWindow = window;", "Javascript"); + //to prevent memory leak, unset it after use + //another possibility is to add an onUnload handler which seems overkill to me (liucougar) + var win = doc._parentWindow; + doc._parentWindow = null; + return win; // Window + } + + return doc.parentWindow || doc.defaultView; // Window +}; + +window.scrollIntoView = function(/*DomNode*/ node, /*Object?*/ pos){ + // summary: + // Scroll the passed node into view, if it is not already. + + // don't rely on node.scrollIntoView working just because the function is there + + try{ // catch unexpected/unrecreatable errors (#7808) since we can recover using a semi-acceptable native method + node = dom.byId(node); + var doc = node.ownerDocument || baseWindow.doc, + body = doc.body || baseWindow.body(), + html = doc.documentElement || body.parentNode, + isIE = has("ie"), isWK = has("webkit"); + // if an untested browser, then use the native method + if((!(has("mozilla") || isIE || isWK || has("opera")) || node == body || node == html) && (typeof node.scrollIntoView != "undefined")){ + node.scrollIntoView(false); // short-circuit to native if possible + return; + } + var backCompat = doc.compatMode == 'BackCompat', + clientAreaRoot = (isIE >= 9 && node.ownerDocument.parentWindow.frameElement) + ? ((html.clientHeight > 0 && html.clientWidth > 0 && (body.clientHeight == 0 || body.clientWidth == 0 || body.clientHeight > html.clientHeight || body.clientWidth > html.clientWidth)) ? html : body) + : (backCompat ? body : html), + scrollRoot = isWK ? body : clientAreaRoot, + rootWidth = clientAreaRoot.clientWidth, + rootHeight = clientAreaRoot.clientHeight, + rtl = !geom.isBodyLtr(), + nodePos = pos || geom.position(node), + el = node.parentNode, + isFixed = function(el){ + return ((isIE <= 6 || (isIE && backCompat))? false : (style.get(el, 'position').toLowerCase() == "fixed")); + }; + if(isFixed(node)){ return; } // nothing to do + + while(el){ + if(el == body){ el = scrollRoot; } + var elPos = geom.position(el), + fixedPos = isFixed(el); + + if(el == scrollRoot){ + elPos.w = rootWidth; elPos.h = rootHeight; + if(scrollRoot == html && isIE && rtl){ elPos.x += scrollRoot.offsetWidth-elPos.w; } // IE workaround where scrollbar causes negative x + if(elPos.x < 0 || !isIE){ elPos.x = 0; } // IE can have values > 0 + if(elPos.y < 0 || !isIE){ elPos.y = 0; } + }else{ + var pb = geom.getPadBorderExtents(el); + elPos.w -= pb.w; elPos.h -= pb.h; elPos.x += pb.l; elPos.y += pb.t; + var clientSize = el.clientWidth, + scrollBarSize = elPos.w - clientSize; + if(clientSize > 0 && scrollBarSize > 0){ + elPos.w = clientSize; + elPos.x += (rtl && (isIE || el.clientLeft > pb.l/*Chrome*/)) ? scrollBarSize : 0; + } + clientSize = el.clientHeight; + scrollBarSize = elPos.h - clientSize; + if(clientSize > 0 && scrollBarSize > 0){ + elPos.h = clientSize; + } + } + if(fixedPos){ // bounded by viewport, not parents + if(elPos.y < 0){ + elPos.h += elPos.y; elPos.y = 0; + } + if(elPos.x < 0){ + elPos.w += elPos.x; elPos.x = 0; + } + if(elPos.y + elPos.h > rootHeight){ + elPos.h = rootHeight - elPos.y; + } + if(elPos.x + elPos.w > rootWidth){ + elPos.w = rootWidth - elPos.x; + } + } + // calculate overflow in all 4 directions + var l = nodePos.x - elPos.x, // beyond left: < 0 + t = nodePos.y - Math.max(elPos.y, 0), // beyond top: < 0 + r = l + nodePos.w - elPos.w, // beyond right: > 0 + bot = t + nodePos.h - elPos.h; // beyond bottom: > 0 + if(r * l > 0){ + var s = Math[l < 0? "max" : "min"](l, r); + if(rtl && ((isIE == 8 && !backCompat) || isIE >= 9)){ s = -s; } + nodePos.x += el.scrollLeft; + el.scrollLeft += s; + nodePos.x -= el.scrollLeft; + } + if(bot * t > 0){ + nodePos.y += el.scrollTop; + el.scrollTop += Math[t < 0? "max" : "min"](t, bot); + nodePos.y -= el.scrollTop; + } + el = (el != scrollRoot) && !fixedPos && el.parentNode; + } + }catch(error){ + console.error('scrollIntoView: ' + error); + node.scrollIntoView(false); + } +}; + +return window; +}); diff --git a/tt-rss.css b/tt-rss.css index 30f94d28..b3ba4315 100644 --- a/tt-rss.css +++ b/tt-rss.css @@ -1254,7 +1254,7 @@ div.fatalError textarea { margin : 0px; border-width : 0px; white-space: nowrap; - font-size : 12px; + font-size : 11px; } #header {